ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Github Action] GCP 워크로드 아이덴티티 제휴 (Workload Identity Federation) 연결하기
    저장소/git 2022. 2. 1. 16:36

    GCP 워크로드 아이덴티티 제휴에 대해선 여기에서 설명하고 있습니다.

    Github Action에서 GCP 리소스를 접근하기 위해선 서비스계정의 key file 내용을 scret 에 등록하는 방법과 워크로드 아이덴티티 제휴를 사용하는 방법이 있습니다.

    하지만 서비스 계정 방식은 deprecated될 거라고 하기 때문에 아래에서는 워크로드 아이덴티티 제휴 방식을 사용하여 연결하는 것을 설명하도록 하겠습니다.

    아래는 github action marketplace의 문서입니다.

    Set up gcloud Cloud SDK environment - GitHub Marketplace

    위 github 문서를 보면 service_account_key 방식은 deprecated 될 거라 나와 있습니다.

    그리고 service account key가 아닌 워크로드 아이덴티티 제휴를 사용한 방식을 권장하고 있습니다.

    위 링크를 타고 들어가면

    GitHub - google-github-actions/auth: GitHub Action for authenticating to Google Cloud with GitHub Actions OIDC tokens and Workload Identity Federation.

    와 같이 워크로드 아이덴티티 제휴를 세팅하는 방법을 설명하고 있습니다. 여기선 CLI만 설명했는데 아래에서는 CLI와 UI 화면을 동시에 설명하도록 합니다.

    워크로드 아이덴티티 세팅 방법

    아래에서는 서비스 계정 설정 및 IAM 권한은 있다는 가정하에 설명을 진행하고 있습니다.

    사전에 서비스 계정 생성 후, 해당 서비스 계정에 IAM 정책으로 저장소 관리자 역할을 부여해야 합니다.

    gcloud CLI

    1. 워크로드 아이덴티티 풀 생성
    gcloud iam workload-identity-pools create "my-pool" \
      --project="${PROJECT_ID}" \
      --location="global" \
      --display-name="Demo pool"
    1. 생성한 워크로드 아이덴티티 풀의 ID 조회
    gcloud iam workload-identity-pools describe "my-pool" \
      --project="${PROJECT_ID}" \
      --location="global" \
      --format="value(name)"
    1. 위에서 조회한 풀 ID를 환경변수로 저장
    export WORKLOAD_IDENTITY_POOL_ID="projects/{프로젝트번호}/locations/global/workloadIdentityPools/my-pool" # value from above
    1. 워크로드 아이덴티티 공급자를 위에서 생성한 워크로드 아이텐티티 풀에 생성
    gcloud iam workload-identity-pools providers create-oidc "my-provider" \
      --project="${PROJECT_ID}" \
      --location="global" \
      --workload-identity-pool="my-pool" \
      --display-name="Demo provider" \
      --attribute-mapping="google.subject=assertion.sub,attribute.actor=assertion.actor,attribute.repository=assertion.repository" \
      --issuer-uri="https://token.actions.githubusercontent.com"

    attribute mapping은 GitHub Actions JWT의 클레임을 요청에 대해서 github action을 호출하는 주체가 repository인지 또는 Github username인지와 같은 assertion에 연결할 수 있습니다. -attribute-condition 플래그를 사용하면 인증을 추가로 제한할 수 있습니다.

    위의 예시는 actorrepository 값만 assertion으로 입력하여 해당 값에 대해 추가적으로 제한을 걸 수 있습니다.

    • 예를 들어, 해당 워크로드 아이덴티티 풀의 공급자는 특정 repository만 연결이 가능하도록 제어 가능

    CEL 표현식이나 IAM 정책에서 해당 속성을 assert 하기 전에 제한을 하고자 하는 클레임을 attribute에 mapping해줘야 합니다.

    1. 위에서 생성한 서비스 계정인 척을 하기 위해 워크로드 아이덴티티 공급자의 인증을 허용합니다.
    • 아래는 위의 attribute mapping을 활용해 특정 github의 repository만 접근하도록 하는 예제입니다.
    # TODO(developer): Update this value to your GitHub repository.
    export REPO="username/name" # e.g. "google/chrome"
    
    gcloud iam service-accounts add-iam-policy-binding "my-service-account@${PROJECT_ID}.iam.gserviceaccount.com" \
      --project="${PROJECT_ID}" \
      --role="roles/iam.workloadIdentityUser" \
      --member="principalSet://iam.googleapis.com/${WORKLOAD_IDENTITY_POOL_ID}/attribute.repository/${REPO}"
    1. 위에서 생성한 워크로드 아이덴티티 공급자의 리소스명을 추출합니다.
    gcloud iam workload-identity-pools providers describe "my-provider" \
      --project="${PROJECT_ID}" \
      --location="global" \
      --workload-identity-pool="my-pool" \
      --format="value(name)"

    UI

    1. IAM 및 관리자의 워크로드 아이덴티티 제휴를 누르면 아래와 같은 첫 페이지가 보이는데 여기서 시작하기를 누릅니다.

    1. 워크로드 아이덴티티 풀의 이름과 설명(display-name)을 설정합니다.
    • CLI의 1번에 해당

    1. 해당 풀에 공급업체(provider)의 이름과 발급자URL(issuer uri)를 추가해 줍니다. 발급자는 CLI 4번의 issuer-uri에 해당하는 값입니다.

    1. 속성 매핑(attribute mapping)을 설정해 줍니다. 속성 매핑은 CLI 4번의 attribute-mapping에 해당하는 값입니다. ,를 기준으로 추가해 주면 됩니다.

    1. 생성을 완료했을 경우 아래와 같은 페이지를 볼 수 있습니다.

    1. 해당 ID 풀을 접속하여 액세스 권한을 부여하도록 합니다. CLI의 5번에 해당하며 필터와 일치하는 ID만 에 추가한 값은 CLI의 예제와 동일하게 특정 깃헙계정의 repository만 접근을 하도록 제어하는 예시입니다.

    1. 저장이 성공하면 새로고침 후 서비스 계정이 연결된 것을 볼 수 있습니다.

    1. 해당 서비스 계정의 권한에서 앞에서 등록한 워크로드 아이덴티티 풀의 액세스 권한이 추가된 것을 볼 수 ㅣㅇㅆ습니다.

    https://console.cloud.google.com/iam-admin/serviceaccounts/details/계정id/permissions?project=프로젝트명

    github action workflow 파일 예제

    위에서 생성한 워크로드 아이덴티티 풀이 성공했다면 아래와 같은 워크로드 아이덴티티 공급업체의 값이 생성되었을 겁니다.

    • CLI의 6번으로 추출 가능, UI에서는 볼 수 있는 화면을 찾지 못함

    projects/{프로젝트번호}/locations/global/workloadIdentityPools/{워크로드 아이덴티티 풀id}/providers/{워크로드 아이덴티티 공급업체 id}

    해당 값과 서비스 계정의 email만 있으면 gitaction에서 GCP 리소스에 접근할 수 있습니다. 아래는 develop이란 브랜치에 push가 될 경우 gcloud info를 호출하는 예제입니다.

    name: git action test
    
    on:
      push:
        branches:
        - develop
    
    jobs:
      workload-identity-connection:
        runs-on: ubuntu-latest
        # Add "id-token" with the intended permissions.
        permissions:
          contents: 'read'
          id-token: 'write'
    
        steps:
        - id: 'auth'
          uses: 'google-github-actions/auth@v0'
          with:
            workload_identity_provider: '**projects/{프로젝트번호}/locations/global/workloadIdentityPools/{워크로드 아이덴티티 풀id}/providers/{워크로드 아이덴티티 공급업체 id}**'
            service_account: '{서비스 계정 이메일}'
    
        - name: 'Set up Cloud SDK'
          uses: 'google-github-actions/setup-gcloud@v0'
    
        - name: 'Use gcloud CLI'
          run: 'gcloud info'

    레퍼런스

    https://github.com/marketplace/actions/set-up-gcloud-cloud-sdk-environment

    https://github.com/google-github-actions/auth#setting-up-workload-identity-federation

    댓글