ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [GCP] 워크로드 아이덴티티 제휴 (Workload Identity Federation)
    AWS & GCP 2022. 2. 1. 03:43

    GCP Workload Identity Federation 이란?

    외부 어플리케이션에서 GCP의 리소스를 접근하기 위해선 보통 서비스 계정을 발급 받고 해당 계정에 권한(IAM)을 준 뒤, 물리적인 key file을 외부 어플리케이션에 전달해야 합니다.

    여기서 문제는 전달한 key file은 만료 시간이 없거나 엄청 길다는 것입니다. 또한 해당 키가 어디에 저장되는지 보장할 수도 없고 누가 접근하는지도 모릅니다.

    이를 막기 위해선 해당 키의 만료시간을 짧게 두는 방법밖에 없는데 이럴 때마다 물리적인 파일을 전달해야 하므로 현실성이 떨어지는 방안입니다.

    이런한 문제는 워크로드 아이덴티티 제휴 (workload identity federation)를 사용하면 해결할 수 있습니다.

    • 이후 ID 제휴 서비스라 함

    ID 제휴 서비스를 통해 외부 ID와 서비스 계정을 이용하여 인증하고 관리할 수 있는데 이를 워크로드 아이덴티티 풀 (workload identity pool)이라 합니다.

    즉, 외부 ID로 GCP 단기 액세스 토큰을 발급받고 서비스 계정을 가장하여 GCP 리소스에 접속하는 개념입니다. 이러한 방식은 워크로드 아이덴티티 풀에서 인증된 공급자만 단기 액세스 토큰이 살아있는 시간에 접속이 가능하므로 해당 토큰이 탈취돼도 서비스 계정의 key file보다 보안성이 더 높습니다.

    워크로드 아이덴티티 풀 공급 업체는 AWS, Azure Active Directory, 온프레미스 Active Directory, Okta, Kubernetes 클러스터, github action 등이 있습니다.

    워크로드 아이덴티티 제휴는 OAuth 2.0 토큰을 지원합니다.

    동작 방식

    1. 먼저 어플리케이션이 ID 공급자를 인증하고 인증이 완료되면 ID 공급자에게 account credential을 받습니다.

    1. account credential을 받은 어플리케이션은 security token service를 호출하여 ID 공급자가 발급한 account credential을 짧은 생명주기를 가지는 GCP 액세스 토큰으로 교환할 수 있습니다.

    1. 이 액세스토큰은 서비스 계정에 발급된 권한들을 그대로 상속받고 서비스 계정인 척을 하면서 GCP 리소스에 접근합니다.

    셋업 및 상세 동작 방식

    1. 워크로드 아이덴티티 풀을 사용하기 위해선 GCP CLI나 UI를 통해 워크로드에 대한 셋업이 필요합니다.

    gcloud iam workload-identity-pools create "{풀 ID}" \
      --project="{프로젝트 ID}" \
      --location="global" \
      --display-name="{디스플레이명}"
    
    workload identity pool ID 생성됨
    1. 1개의 서비스 계정으로 여러개의 워크로드 아이덴티티 풀에 각자 다른 권한으로 연결할 수 있습니다.

    1. 공급자에 대한 관련 메타데이터를 제공하여 ID 공급자와 워크로드 아이덴티티 풀 간에 단방향 신뢰를 구성합니다.

    gcloud iam workload-identity-pools providers create-oidc "{공급자 ID}" \
    --project="{프로젝트 ID}" \
    --location="global" \
    --workload-identity-pool="{풀 ID}" \
    --display-name="{공급자 디스플레이명}" \
    --attribute-mapping="google.subject=assertion.sub" \
    --issuer-uri="{공급자가 제공한 URI}"
    
    생성한 풀에 공급자 추가

    여기서 attribute-mapping에는 공급자가 제공하는 어트리뷰트를 ,로 연결하여 추가할 수 있습니다.

    1. 어플리케이션이 IDP credential을 교환하려고 하면 security token service는 어플리케이션에 액세스 토큰을 발급하기 전에 credential이 신뢰할 수 있는 공급자의 것인지 확인을 할 수 있습니다.

    1. 마지막으로 워크로드 아이덴티티 풀 안에 있는 아이덴티티들이 서비스 계정을 가장하도록 하용하는 IAM 정책을 생성해야 합니다.

    gcloud iam service-accounts add-iam-policy-binding "{service-account-email}" \
      --project="{프로젝트 ID}" \
      --role="roles/iam.workloadIdentityUser" \
      --member="principalSet://iam.googleapis.com/{project-number}/locations/global/workloadIdentityPools/{풀 ID}/subject/{subject}"
    1. 이러한 정책을 사용하여 외부 어플리케이션이 올바르게 인증하도록 설정할 수 있습니다.

    위에서는 CLI를 예제로 들면서 설명을 했고 다음 Github Action에 워크로드 아이덴티티 풀 등록하기 부분에서 GCP UI 예제를 설명하겠습니다.

    레퍼런스

    Workload identity federation | Cloud IAM Documentation | Google Cloud

    댓글