Aby dać dostęp do Github Actions z repozytorium Github do konta usługi GCP, należy wykonać następujące kroki:
Utwórz Konto Usługi do uzyskania dostępu z github actions z pożądanymi uprawnieniami:
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"
Wygeneruj nową pulę tożsamości obciążenia:
# Create a Workload Identity PoolpoolName=wi-poolgcloudiamworkload-identity-poolscreate $poolName \--location global \--display-name $poolNamepoolId=$(gcloudiamworkload-identity-poolsdescribe $poolName \--location global \--format='get(name)')
Wygeneruj nowego dostawcę OIDC puli tożsamości obciążenia który ufa akcjom github (na podstawie nazwy org/repo w tym scenariuszu):
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)')
W końcu, zezwól głównemu z dostawcy na użycie głównego usługi:
Zauważ, że w poprzednim członku określamy org-name/repo-name jako warunki, aby uzyskać dostęp do konta usługi (inne parametry, które czynią to bardziej restrykcyjnym, takie jak gałąź, mogą być również używane).
Jednak możliwe jest również zezwolenie wszystkim github na dostęp do konta usługi, tworząc dostawcę, takiego jak poniższy, używając symbolu wieloznacznego:
# Utwórz pulę tożsamości obciążeniapoolName=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 provider" \--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)')# SPRAWDŹ SYMBOL WIELOZNACZNYgcloudiamservice-accountsadd-iam-policy-binding"${saId}" \--project="${projectId}" \--role="roles/iam.workloadIdentityUser" \--member="principalSet://iam.googleapis.com/${poolId}/*"
W tym przypadku każdy mógłby uzyskać dostęp do konta usługi z github actions, dlatego ważne jest, aby zawsze sprawdzać, jak zdefiniowany jest członek.
Powinno to zawsze być coś takiego:
Pamiętaj, aby zmienić ${providerId} i ${saId} na ich odpowiednie wartości:
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