Da bi se omogućio pristup Github Actions iz Github repozitorijuma GCP servisnom nalogu, potrebni su sledeći koraci:
Kreirajte servisni nalog za pristup iz github actions sa željеним dozvolama:
projectId=FIXMEgcloudconfigsetproject $projectId# Create the Service Accountgcloudiamservice-accountscreate"github-demo-sa"saId="github-demo-sa@${projectId}.iam.gserviceaccount.com"# Enable the IAM Credentials APIgcloudservicesenableiamcredentials.googleapis.com# Give permissions to SAgcloudprojectsadd-iam-policy-binding $projectId \--member="serviceAccount:$saId" \--role="roles/iam.securityReviewer"
Generišite novi identitetski bazen radnog opterećenja:
# Create a Workload Identity PoolpoolName=wi-poolgcloudiamworkload-identity-poolscreate $poolName \--location global \--display-name $poolNamepoolId=$(gcloudiamworkload-identity-poolsdescribe $poolName \--location global \--format='get(name)')
Generišite novi workload identity pool OIDC provider koji veruje github akcijama (prema imenu org/repo u ovom scenariju):
attributeMappingScope=repository# could be sub (GitHub repository and branch) or repository_owner (GitHub organization)gcloudiamworkload-identity-poolsproviderscreate-oidc $poolName \--location global \--workload-identity-pool $poolName \--display-name $poolName \--attribute-mapping "google.subject=assertion.${attributeMappingScope},attribute.actor=assertion.actor,attribute.aud=assertion.aud,attribute.repository=assertion.repository" \--issuer-uri "https://token.actions.githubusercontent.com"providerId=$(gcloudiamworkload-identity-poolsprovidersdescribe $poolName \--location global \--workload-identity-pool $poolName \--format='get(name)')
Na kraju, dozvolite principalu od provajdera da koristi servisni principal:
Obratite pažnju kako u prethodnom članu specifikujemo org-name/repo-name kao uslove za pristup servisnom nalogu (drugi parametri koji ga čine strožim kao što je grana takođe mogu biti korišćeni).
Međutim, takođe je moguće dozvoliti svima na github-u da pristupe servisnom nalogu kreiranjem provajdera kao što je sledeći koristeći wildcard:
U ovom slučaju, svako bi mogao da pristupi servisnom nalogu iz github akcija, tako da je važno uvek proveriti kako je član definisan.
Treba da bude uvek nešto poput ovoga:
Zapamtite da promenite ${providerId} i ${saId} za njihove odgovarajuće vrednosti:
name:Check GCP actionon:workflow_dispatch:pull_request:branches:- mainpermissions:id-token:writejobs:Get_OIDC_ID_token:runs-on:ubuntu-lateststeps:- id:'auth'name:'Authenticate to GCP'uses:'google-github-actions/auth@v2.1.3'with:create_credentials_file:'true'workload_identity_provider:'${providerId}'# In the providerId, the numerical project ID (12 digit number) should be usedservice_account:'${saId}'# instead of the alphanumeric project ID. ex:activate_credentials_file:true# projects/123123123123/locations/global/workloadIdentityPools/iam-lab-7-gh-pool/providers/iam-lab-7-gh-pool-oidc-provider'- id:'gcloud'name:'gcloud'run:|-gcloud config set project <project-id>gcloud config set account '${saId}'gcloud auth login --brief --cred-file="${{ steps.auth.outputs.credentials_file_path }}"gcloud auth listgcloud projects listgcloud secrets list