GiitHub Actions + Google-github-actions/auth에서 GCP 키lesci/CD
7423 단어 GCPGitHub Actionstech
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_prod
와 auth_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
성으로 하드코딩을 진행했다면 설정값이 틀렸잖아!이렇게 될 수도 있어.
Reference
이 문제에 관하여(GiitHub Actions + Google-github-actions/auth에서 GCP 키lesci/CD), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/vvakame/articles/gha-and-gcp-workload-identity텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)