워크로드 아이덴티티 제휴

이 문서는 외부 워크로드의 ID 제휴 개요를 제공합니다. ID 제휴를 사용하면 서비스 계정 키를 사용하지 않고도 온프레미스 또는 멀티 클라우드 워크로드에 Google Cloud 리소스에 대한 액세스 권한을 부여할 수 있습니다.

Amazon Web Services(AWS) 또는 OpenID Connect(OIDC)를 지원하는 ID 공급업체(IdP, 예: Microsoft Azure) 또는 SAML 2.0에서 ID 제휴를 사용할 수 있습니다.

ID 제휴를 사용해야 하는 이유

일반적으로 Google Cloud 외부에서 실행되는 애플리케이션이 Google Cloud 리소스에 액세스하려면 서비스 계정 키를 사용할 수 있습니다. 그러나 서비스 계정 키는 강력한 사용자 인증 정보이며 제대로 관리하지 않을 경우 보안상 위험할 수 있습니다.

ID 제휴를 사용하면 Identity and Access Management(IAM)를 통해 서비스 계정을 가장하는 기능이 포함된 IAM 역할을 외부 ID에 부여할 수 있습니다. 이 접근 방식을 사용하면 서비스 계정 키와 관련된 유지보수 및 보안 부담이 사라집니다.

워크로드 아이덴티티 풀

워크로드 아이덴티티 풀은 외부 ID를 관리할 수 있는 항목입니다.

일반적으로 개발, 스테이징, 프로덕션 환경과 같은 Google Cloud 리소스에 액세스해야 하는 Google Cloud 이외의 환경마다 새로운 풀을 만드는 것이 좋습니다.

워크로드 아이덴티티 풀 제공업체

워크로드 아이덴티티 풀 제공업체는 다음을 포함하여 Google Cloud와 IdP 사이의 관계를 기술하는 항목입니다.

  • AWS
  • Azure Active Directory
  • 온프레미스 Active Directory Federation Services(ADFS)
  • Okta
  • Kubernetes 클러스터

워크로드 아이덴티티 제휴는 OAuth 2.0 토큰 교환 사양을 따릅니다. IdP의 사용자 인증 정보를 보안 토큰 서비스에 제공하면, 보안 토큰 서비스는 사용자 인증 정보에서 ID를 확인한 후에 대가로 제휴 토큰을 반환합니다.

로컬 JWK를 사용하는 OIDC 제공업체

공개 OIDC 엔드포인트가 없는 워크로드를 페더레이션하려면 OIDC JSON 웹 키 세트(JWKS)를 풀에 직접 업로드하면 됩니다. Terraform 또는 GitHub Enterprise가 자체 환경에서 호스팅되거나 공개 URL이 노출하지 않도록 규제하는 요구사항이 있는 경우에 일반적입니다. 자세한 내용은 OIDC JWK 관리(선택사항)를 참조하세요.

속성 매핑

외부 ID 공급업체에서 발급된 토큰에는 하나 이상의 속성이 포함됩니다. 일부 ID 공급업체는 이러한 속성을 클레임이라고 부릅니다.

또한 Google STS 토큰에는 다음 표에 나열된 하나 이상의 속성이 포함됩니다.

속성 설명
google.subject 필수. 사용자의 고유 식별자입니다. 이 속성은 IAM principal:// 역할 결합에 사용되며 Cloud Logging 로그에 표시됩니다. 값은 고유해야 하며 127자를 초과할 수 없습니다.
google.groups 선택사항. ID가 속하는 그룹 집합입니다. 이 속성은 IAM principalSet:// 역할 바인딩에서 그룹의 모든 구성원에게 액세스 권한을 부여하는 데 사용됩니다.
attribute.NAME 선택사항. 최대 50개의 커스텀 속성을 정의하고 IAM principalSet:// 역할 결합에서 이러한 속성을 사용하여 특정 속성이 있는 모든 ID에 액세스 권한을 부여할 수 있습니다.

속성 매핑은 외부 토큰에서 Google STS 토큰 속성의 값을 추출하는 방법을 정의합니다. 각 Google STS 토큰 속성에 대해 다음과 같은 형식으로 속성 매핑을 정의할 수 있습니다.

TARGET_ATTRIBUTE=SOURCE_EXPRESSION

다음을 바꿉니다.

  • TARGET_ATTRIBUTE은 Google STS 토큰의 속성입니다.
  • SOURCE_EXPRESSION은 외부 ID 공급업체에서 발급한 토큰에서 하나 이상의 속성을 변환하는 Common Expression Language(CEL) 표현식입니다.

다음 목록은 속성 매핑 예시를 제공합니다.

  • 어설션 속성 subgoogle.subject에 할당합니다.

    google.subject=assertion.sub
    
  • 여러 어설션 속성을 연결합니다.

    google.subject="myprovider::" + assertion.aud + "::" + assertion.sub
    
  • GUID 값 어설션 속성 workload_id를 이름에 매핑하고 결과를 attribute.my_display_name이라는 커스텀 속성에 할당합니다.

    attribute.my_display_name={
      "8bb39bdb-1cc5-4447-b7db-a19e920eb111": "Workload1",
      "55d36609-9bcf-48e0-a366-a3cf19027d2a": "Workload2"
    }[assertion.workload_id]
    
  • ID의 Amazon 리소스 이름(ARN)에 따라 CEL 논리 연산자 및 함수를 사용하여 attribute.environment라는 커스텀 속성을 prod 또는 test로 설정합니다.

    attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"
    
  • extract 함수를 사용하여 가정된 역할의 이름(또는 역할이 가정되지 않은 경우 ID의 ARN)과 함께 커스텀 속성 aws_role을 입력할 수 있습니다.

    attribute.aws_role=assertion.arn.contains('assumed-role') ? assertion.arn.extract('{account_arn}assumed-role/') + 'assumed-role/' + assertion.arn.extract('assumed-role/{role_name}/') : assertion.arn
    
  • split 함수는 제공된 구분 기호 값으로 문자열을 분할합니다. 예를 들어 @에서 값을 분할하고 첫 번째 문자열을 사용하여 이메일 주소 속성에서 username 속성을 추출하려면 다음 속성 매핑을 사용합니다.

    attribute.username=assertion.email.split("@")[0]
    

  • join 함수는 제공된 구분 기호 값으로 문자열 목록을 조인합니다. 예를 들어 문자열 목록을 구분 기호 .로 연결하여 커스텀 속성 department를 채우려면 다음 속성 매핑을 사용합니다.

    attribute.department=assertion.department.join(".")
    

AWS의 경우 Google에서는 가장 일반적인 시나리오에 적용되는 기본 매핑을 제공합니다. 사용자는 커스텀 매핑을 제공할 수도 있습니다.

OIDC 제공업체의 경우 사용자는 매핑을 제공합니다. 매핑을 구성하려면 제공업체의 사용자 인증 정보의 속성 목록에 대한 문서를 참조하세요.

자세한 내용은 attributeMapping 필드의 API 문서를 참조하세요.

속성 조건

속성 조건은 어설션 속성 및 대상 속성을 확인할 수 있는 CEL 표현식입니다. 어설션 조건이 특정 사용자 인증 정보에 대해 true로 평가되면 해당 사용자 인증 정보가 수락됩니다. 그렇지 않으면 사용자 인증 정보가 거부됩니다.

속성 조건을 사용하여 워크로드 아이덴티티 풀을 통해 인증할 수 있는 ID를 제한할 수 있습니다.

속성 조건은 다음과 같은 시나리오에서 유용합니다.

  • 워크로드가 일반 대중이 이용할 수 있는 ID 공급업체를 사용하면 선택한 ID만 워크로드 아이덴티티 풀에 액세스하도록 액세스를 제한할 수 있습니다.

  • 여러 클라우드 플랫폼에서 ID 공급업체를 사용하는 경우 다른 플랫폼에서 사용하기 위한 사용자 인증 정보가 Google Cloud에서 사용되는 것을 방지할 수 있으며 그 반대의 경우도 마찬가지입니다. 이는 혼동된 대리인 문제를 피하는 데 도움이 됩니다.

워크로드 아이덴티티 풀 제공업체의 속성 조건은 ID 공급업체에서 발급한 사용자 인증 정보를 나타내는 지도를 표현하는 assertion 키워드를 사용할 수 있습니다. 점 표기법을 사용하여 지도의 값에 액세스할 수 있습니다. 예를 들어 AWS 사용자 인증 정보는 assertion.arn으로 액세스할 수 있는 arn 값을 포함합니다. 또한 해당 속성 조건은 공급업체의 속성 매핑에 정의된 모든 속성을 사용할 수 있습니다.

다음 예시에서는 특정 AWS 역할이 있는 ID의 요청만 허용합니다.

attribute.aws_role == "ROLE_MAPPING"

자세한 내용은 attributeCondition 필드의 API 문서를 참조하세요.

서비스 계정 가장

토큰 교환 흐름은 제휴 액세스 토큰을 반환합니다. 이 토큰을 사용하여 서비스 계정을 가장하고 단기 OAuth 2.0 액세스 토큰을 받을 수 있습니다. 단기 액세스 토큰을 사용하면 서비스 계정이 액세스할 수 있는 모든 Google Cloud API를 호출할 수 있습니다.

서비스 계정을 가장하려면 서비스 계정의 워크로드 아이덴티티 사용자 역할(roles/iam.workloadIdentityUser)을 워크로드에 필요한 역할과 함께 외부 ID에 부여합니다. 워크로드 아이덴티티 풀의 모든 ID에 역할을 부여하거나 속성에 따라 특정 외부 ID에 역할을 부여할 수 있습니다.

다음 표에서는 역할을 부여하는 일반적인 시나리오를 설명합니다.

ID 식별자 형식
단일 ID principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
그룹의 모든 ID principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP_ID
특정 속성값의 모든 ID principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE

다음 단계