In order to give access to the Github Actions from a Github repo to a GCP service account the following steps are needed:
Create the Service Account to access from github actions with the desired permissions:
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"
Generate a new workload identity pool OIDC provider that trusts github actions (by org/repo name in this scenario):
attributeMappingScope=repository# could be sub (GitHub repository and branch) or repository_owner (GitHub organization)gcloudiamworkload-identity-poolsproviderscreate-oidc $poolName \--locationglobal \--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 \--locationglobal \--workload-identity-pool $poolName \--format='get(name)')
Finally, allow the principal from the provider to use a service principal:
Note how in the previous member we are specifying the org-name/repo-name as conditions to be able to access the service account (other params that makes it more restrictive like the branch could also be used).
However it's also possible to allow all github to access the service account creating a provider such the following using a wildcard:
In this case anyone could access the service account from github actions, so it's important always to check how the member is defined.
It should be always something like this:
Remember to change ${providerId} and ${saId} for their respective values:
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 used service_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 list gcloud projects list gcloud secrets list