GiitHub Actions + Google-github-actions/auth에서 GCP 키lesci/CD

7423 단어 GCPGitHub Actionstech
추기 2021/10/08v0.3.1로 설정하면 aud 주위의 설정을 변경해야 한다출처
2021/10/07 OIDC 토큰의 발행원을 추기하는 URL이 변경된 것 같다출처
요약: GiitHub Actions가 CI/CD적인 일을 하려고 할 때 시크릿 같은 것은 GCP의 서비스 Acount의 Key를 넣지 않아도 depro 같은 것을 할 수 있기 때문에 만들었다.

날과 씨


AWS federation comes to GitHub Actions라는 기사가 나왔다.
어떤 이는 GCP에 GiitHub Actions의 OIDC id token으로 액세스 GCP가 할 수 있는지 확인했다고 말했다.
Use gcloud with credentials from identity federation with OIDC
For Github, you can check this Github Action: https://github.com/google-github-actions/auth
이런 사이트 정보가 있어서 한번 해 보기로 했어요.
디테일을 따지지 말고 하면 되는 기사를 하세요. 디테일을 신경 쓰는 사람은 스스로 조사하고 글을 쓰세요. 그리고 이 기사의 평론란에 쓰세요!잘 부탁드립니다!읽다
그리고 조만간 정식 문서가 나올 것 같아서 나오면 읽어보는 게 좋을 것 같아요.

하고 싶은 일의 상세한 상황


지금까지


GiitHub Actions가 AppEngine에 디자인을 할 때 서비스 어카운트를 발행하여 GiitHub의 Secretial이 JSON 형식의 credential을 보유하도록 한다.
사용할 때credential을 gcloud auth activate-service-account에 넣거나 파일에 적당히 넣거나 사용하세요.
이 키는 보통 수명이 매우 길다. (기본값은 무제한이다.)
이 문제로서, 어떤 이유로credential이 유출되면 시크릿을 교체하기 위해revoke가 필요합니다.
키 관리 비용이 많이 든다는 얘기다.속인이 되기 쉬운 것 같아요.

지금 시작


GiitHub Action에서 OIDC token을 발행할 수 있습니다.
이 기능과 GCPWorkload identity federation를 조합하면 당신이 GiitHub에 있는 곳의workflow인가요?그럼 내가 수명이 짧은 권한을 빌려줄게.
이렇게 키리스를 통해 권한을 얻었습니다.
어떤 이유로credential이 유출되었든지 간에 이 키의 수명이 매우 짧기 때문에 공격자가 이 키를 사용하는 시간은 제한되어 있습니다.
기본값은 1시간GOOGLE_APPLICATION_CREDENTIALS(3600초)입니다.
한 번 설정하면 키 관리 비용을 지불할 필요가 없다는 것이다.
그리고 안전성도 다소 좋다.그래야지.

할 일


기본적으로 위에서 적당히 하는 것https://github.com/google-github-actions/auth에 적힌 일일 뿐이다.
다만, 쓴 대로 쫓아가면 무엇이 가장 적합한지, 좀 번거롭기 때문에 여기에 가장 적합한 구성 절차서를 제공해 동력으로 쓴다.
나도 각 항목의 뜻만 이해했기 때문에 상세한 언급을 피했다.

미리 준비하다


gcloud sdk의version을 최신으로 만듭니다.
필자는 시도할 때google-github-actions/auth 움직인다.358.0.0안 돼요.

GCP에서 하는 일


GCP의 서비스 어카운트 준비 및 권한 설정 자체가 변경되었기 때문에 생략했습니다.
JSON 형식의 열쇠로 만들 때와 별반 다른 점은 없다.
$ export PROJECT_ID=<対象のGCPのID>
$ export POOL_NAME=github-actions   # お好きに
$ export PROVIDER_NAME=gha-provider # お好きに
$ export SA_EMAIL=<Service Accountのメアド>
$ export GITHUB_REPO=<vvakame/til 的なやつ>

# IAM Service Account Credentials API を有効にする
$ gcloud services enable iamcredentials.googleapis.com --project "${PROJECT_ID}"

# Workload IdentityにPoolを作成する Poolが何かは理解していない
$ gcloud iam workload-identity-pools create "${POOL_NAME}" \
    --project="${PROJECT_ID}" --location="global" \
    --display-name="use from GitHub Actions"
$ export WORKLOAD_IDENTITY_POOL_ID=$( \
    gcloud iam workload-identity-pools describe "${POOL_NAME}" \
      --project="${PROJECT_ID}" --location="global" \
      --format="value(name)" \
  )
$ echo $WORKLOAD_IDENTITY_POOL_ID

# PoolにProvierを作成する attribute-mappingで色々遊べるぽい
$ gcloud iam workload-identity-pools providers create-oidc "${PROVIDER_NAME}" \
    --project="${PROJECT_ID}" --location="global" \
    --workload-identity-pool="${POOL_NAME}" \
    --display-name="use from GitHub Actions provider" \
    --attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository,attribute.actor=assertion.actor,attribute.aud=assertion.aud" \
    --issuer-uri="https://token.actions.githubusercontent.com"

# Workload IdentityでSAにimpersonateできるようにする
# 全GitHubリポジトリのWorkflowからできちゃうとヤバいので可能なリポジトリを絞る
$ gcloud iam service-accounts add-iam-policy-binding "${SA_EMAIL}" \
    --project="${PROJECT_ID}" \
    --role="roles/iam.workloadIdentityUser" \
    --member="principalSet://iam.googleapis.com/${WORKLOAD_IDENTITY_POOL_ID}/attribute.repository/${GITHUB_REPO}"
아마 이것이 가장 가볍고 안전한 것 같아요.
이쪽 기사.에서 347.0.0의 값을 사용하지만 이 글은 문서에 따라 sub의 값을 사용합니다.
GitHub Token Format보면 repository도 제한할 수 있을 것 같은데 이번actor도 가능할까요?

GiitHub Action에서 하는 일.


GiitHub Actions의 잡repository에 추가permissions.
이전에 id-token: write가 없었다면 문서를 읽고 설정하세요.
지정하지 않은 상태에서 기본 권한은 여러 가지가 있는데 permissions만 더하면 그게 사라지고 영향을 받을 것 같아요.
그럼에도 불구하고 안전성에 신경을 쓰는 사람이라면 대부분 명확하게 지정된다.
그리고workflow의yaml에 step를 적당히 추가합니다.
제가 만든 기술 서적전에는 stg 환경과prod 환경이 있는데 일정한 규칙에 따라 개발 목표를 바꿨습니다.
GCP 프로젝트마다 프로젝트가 있기 때문에 좀 번거롭습니다.
- id: auth_stg
  if:  ${{ stg環境だと判定する条件 }}
  name: Authenticate to Google Cloud for stg
  uses: google-github-actions/[email protected]
  with:
    create_credentials_file: 'true'
    workload_identity_provider: projects/XXXX/locations/global/workloadIdentityPools/YYYY/providers/ZZZZ
    service_account: [email protected]
    access_token_lifetime: 1200s
도 마찬가지로 id-token: write라고 정의했다.
그리고 제작된credential은 gcloud 지령으로 사용할 수 있습니다.
- name: gcloud auth login by workload identity
  run: |-
    gcloud auth login --brief --cred-file="${{ steps.auth_stg.outputs.credentials_file_path || steps.auth_prod.outputs.credentials_file_path }}"
이런 느낌이에요.auth_prodauth_stg는 그 중 하나만 집행하기 때문에 하나의 결과만 존재해야 한다.
그래서 auth_prod 헷갈렸어.
귀찮아서.
그리고 시크릿에서 SA의 크리덴셜을 이것저것 빼낸 부분을 시원하게 지우면 끝!

실패 세트 첨부


처음||attribute-mapping엠버와 일치하지 않아 욕을 먹은 녀석.
ERROR: (gcloud.datastore.indexes.create) There was a problem refreshing your current auth tokens: ('Unable to acquire impersonated credentials: No access token or invalid expiration in response.', '***\n  "error": ***\n    "code": 403,\n    "message": "The caller does not have permission",\n    "status": "PERMISSION_DENIED"\n  ***\n***\n')
조금이라도 일찍 혼났으면 좋겠는데...
그리고 복사 스티커는 UI가 수동으로 설정한 거attribute.repository=assertion.repository인데 혼났어요. 네?만약 assertion.repository=assertion.repository성으로 하드코딩을 진행했다면 설정값이 틀렸잖아!이렇게 될 수도 있어.

좋은 웹페이지 즐겨찾기