Um Zugriff auf die Github Actions von einem Github-Repo auf ein GCP Dienstkonto zu gewähren, sind die folgenden Schritte erforderlich:
Erstellen Sie das Dienstkonto, um von Github Actions mit den gewünschten Berechtigungen zuzugreifen:
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"
Erstellen Sie einen neuen Workload-Identitätspool:
# Create a Workload Identity PoolpoolName=wi-poolgcloudiamworkload-identity-poolscreate $poolName \--location global \--display-name $poolNamepoolId=$(gcloudiamworkload-identity-poolsdescribe $poolName \--location global \--format='get(name)')
Erstellen Sie einen neuen Workload Identity Pool OIDC-Anbieter, der github actions vertraut (nach Org/Repo-Namen in diesem Szenario):
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)')
Schließlich erlauben Sie dem Principal vom Anbieter, einen Dienst-Principal zu verwenden:
Beachten Sie, dass wir im vorherigen Mitglied den org-name/repo-name als Bedingungen angeben, um auf das Dienstkonto zugreifen zu können (andere Parameter, die es einschränkender machen, wie der Branch, könnten ebenfalls verwendet werden).
Es ist jedoch auch möglich, allen GitHub-Zugriff auf das Dienstkonto zu gewähren, indem man einen Anbieter wie den folgenden mit einem Platzhalter erstellt:
# Erstellen Sie einen Workload Identity PoolpoolName=wi-pool2gcloudiamworkload-identity-poolscreate $poolName \--location global \--display-name $poolNamepoolId=$(gcloudiamworkload-identity-poolsdescribe $poolName \--location global \--format='get(name)')gcloudiamworkload-identity-poolsproviderscreate-oidc $poolName \--project="${projectId}" \--location="global" \--workload-identity-pool="$poolName" \--display-name="Demo-Anbieter" \--attribute-mapping="google.subject=assertion.sub,attribute.actor=assertion.actor,attribute.aud=assertion.aud" \--issuer-uri="https://token.actions.githubusercontent.com"providerId=$(gcloudiamworkload-identity-poolsprovidersdescribe $poolName \--location global \--workload-identity-pool $poolName \--format='get(name)')# ÜBERPRÜFEN SIE DEN PLATZHALTERgcloudiamservice-accountsadd-iam-policy-binding"${saId}" \--project="${projectId}" \--role="roles/iam.workloadIdentityUser" \--member="principalSet://iam.googleapis.com/${poolId}/*"
In diesem Fall könnte jeder auf das Dienstkonto von GitHub Actions zugreifen, daher ist es wichtig, immer zu überprüfen, wie das Mitglied definiert ist.
Es sollte immer etwas sein wie:
Denken Sie daran, ${providerId} und ${saId} durch ihre jeweiligen Werte zu ersetzen:
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