# GCP - Abus de fédération

{{#include ../../../banners/hacktricks-training.md}}

## OIDC - Abus des Actions Github

### GCP

Pour donner **accès aux Actions Github** d'un dépôt Github à un **compte de service** GCP, les étapes suivantes sont nécessaires :

- **Créer le compte de service** pour accéder depuis les actions github avec les **permissions souhaitées :**
```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"
```
- Générer un **nouveau pool d'identité de charge de travail** :
```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)')
```
- Générer un nouveau **fournisseur OIDC de pool d'identité de charge de travail** qui **fait confiance** aux actions github (par nom d'organisation/de dépôt dans ce scénario) :
```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)')
```
- Enfin, **permettez au principal** du fournisseur d'utiliser un principal de service :
```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]
> Notez comment dans le membre précédent, nous spécifions **`org-name/repo-name`** comme conditions pour pouvoir accéder au compte de service (d'autres paramètres qui le rendent **plus restrictif** comme la branche pourraient également être utilisés).
>
> Cependant, il est également possible de **permettre à tous les github d'accéder** au compte de service en créant un fournisseur tel que le suivant en utilisant un caractère générique :

<pre class="language-bash"><code class="lang-bash"># Créer un 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)')

<strong># VÉRIFIER LE CARACTÈRE GÉNÉRIQUE
</strong>gcloud iam service-accounts add-iam-policy-binding "${saId}" \
--project="${projectId}" \
--role="roles/iam.workloadIdentityUser" \
<strong>  --member="principalSet://iam.googleapis.com/${poolId}/*"
</strong></code></pre>

> [!WARNING]
> Dans ce cas, n'importe qui pourrait accéder au compte de service depuis les actions github, il est donc important de toujours **vérifier comment le membre est défini**.\
> Cela devrait toujours être quelque chose comme ceci :
>
> `attribute.{custom_attribute}`:`principalSet://iam.googleapis.com/projects/{project}/locations/{location}/workloadIdentityPools/{pool}/attribute.{custom_attribute}/{value}`

### Github

N'oubliez pas de changer **`${providerId}`** et **`${saId}`** pour leurs valeurs respectives :
```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 <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
```
{{#include ../../../banners/hacktricks-training.md}}
