# GCP - Federation Abuse {{#include ../../../banners/hacktricks-training.md}} ## OIDC - Github Actions Abuse ### GCP 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: ```bash projectId=FIXME gcloud config set project $projectId # Create the Service Account gcloud iam service-accounts create "github-demo-sa" saId="github-demo-sa@${projectId}.iam.gserviceaccount.com" # Enable the IAM Credentials API gcloud services enable iamcredentials.googleapis.com # Give permissions to SA gcloud projects add-iam-policy-binding $projectId \ --member="serviceAccount:$saId" \ --role="roles/iam.securityReviewer" ``` - Erstellen Sie einen **neuen Workload-Identitätspool**: ```bash # Create a Workload Identity Pool poolName=wi-pool gcloud iam workload-identity-pools create $poolName \ --location global \ --display-name $poolName poolId=$(gcloud iam workload-identity-pools describe $poolName \ --location global \ --format='get(name)') ``` - Erstellen Sie einen neuen **Workload-Identitätspool OIDC-Anbieter**, der **github actions** (in diesem Szenario nach Org/Repo-Namen) **vertraut**: ```bash attributeMappingScope=repository # could be sub (GitHub repository and branch) or repository_owner (GitHub organization) gcloud iam workload-identity-pools providers create-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=$(gcloud iam workload-identity-pools providers describe $poolName \ --location global \ --workload-identity-pool $poolName \ --format='get(name)') ``` - Schließlich **erlauben Sie dem Principal** vom Anbieter, einen Service Principal zu verwenden: ```bash gitHubRepoName="repo-org/repo-name" gcloud iam service-accounts add-iam-policy-binding $saId \ --role "roles/iam.workloadIdentityUser" \ --member "principalSet://iam.googleapis.com/${poolId}/attribute.${attributeMappingScope}/${gitHubRepoName}" ``` > [!WARNING] > 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 Pool
poolName=wi-pool2

gcloud iam workload-identity-pools create $poolName \
--location global \
--display-name $poolName

poolId=$(gcloud iam workload-identity-pools describe $poolName \
--location global \
--format='get(name)')

gcloud iam workload-identity-pools providers create-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=$(gcloud iam workload-identity-pools providers describe $poolName \
--location global \
--workload-identity-pool $poolName \
--format='get(name)')

# ÜBERPRÜFEN SIE DEN PLATZHALTER
gcloud iam service-accounts add-iam-policy-binding "${saId}" \
--project="${projectId}" \
--role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/${poolId}/*"
> [!WARNING] > In diesem Fall könnte jeder auf das Dienstkonto von GitHub-Aktionen zugreifen, daher ist es wichtig, immer zu **überprüfen, wie das Mitglied definiert ist**.\ > Es sollte immer etwas wie folgt sein: > > `attribute.{custom_attribute}`:`principalSet://iam.googleapis.com/projects/{project}/locations/{location}/workloadIdentityPools/{pool}/attribute.{custom_attribute}/{value}` ### Github Denken Sie daran, **`${providerId}`** und **`${saId}`** durch ihre jeweiligen Werte zu ersetzen: ```yaml name: Check GCP action on: workflow_dispatch: pull_request: branches: - main permissions: id-token: write jobs: Get_OIDC_ID_token: runs-on: ubuntu-latest steps: - 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 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 ``` {{#include ../../../banners/hacktricks-training.md}}