
# Google Cloud Workload Identity Federation のセットアップ

Google Cloud Workload Identity Federation（WIF）を使用すると、サービスアカウントキーやその他のシークレットを使わずに、Aikido に Google Cloud プロジェクトをスキャンさせることができます。

Workload Identity Federation のプールとプロバイダを設定することで、Aikido は自身の固有の認証情報を、お客様の GCP 環境で有効な認証情報と交換できるようになります。これらの認証情報は有効期間が短く、どこにも保存されないため、この方法ははるかに安全であり、さまざまなコンプライアンス要件にも準拠しています。

WIF の詳細については、[Google Cloud のドキュメント](https://docs.cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds)をご覧ください。

## **Workload Identity Federation を使う理由**

* 長期間有効なサービスアカウントキーが不要になります。
* キーのローテーションとシークレット管理が簡素化されます。
* より厳格なコンプライアンスおよびセキュリティ要件を満たします。

## はじめに

Workload Identity Federation は、Google Cloud オンボーディングウィザードの「Configure Access」ステップでオプションとして利用できます。

<figure><img src="https://help.aikidogov.us/_assets/e0ce36d296ec/image-50.png" alt="" width="563"><figcaption><p>Aikido の GCP オンボーディングで Service Account と Workload Identity Federation のどちらかを選択する</p></figcaption></figure>

Aikido は、Google Cloud プロジェクトでワークロード ID プールとプロバイダをセットアップするために必要な CLI コマンドを提供します。

他の方法で WIF を設定したい場合は、以下の詳細情報が必要になります。

### プロバイダの詳細

{% hint style="info" %}
これらの値は、アプリ内で Aikido が提供する CLI コマンドから取得することを強くお勧めします。
{% endhint %}

* プロバイダ: **AWS**（これにより Aikido は AWS IAM 認証情報を GCP 認証情報と交換できます）
* AWS アカウント ID: **881830977366**（Aikido が認証情報の交換を開始する AWS アカウントです）
* 属性マッピング（AWS のデフォルトマッピングである必要があります）:
  * `google.subject` = `assertion.arn`
  * `attribute.aws_role` = `assertion.arn.contains('assumed-role') ? assertion.arn.extract('{account_arn}assumed-role/') + 'assumed-role/' + assertion.arn.extract('assumed-role/{role_name}/') : assertion.arn`

### IAM 権限

Aikido AWS アカウントのすべてのプリンシパルではなく、アクセスを必要とする特定の Aikido IAM ロール**のみ**にアクセスを付与します。

Aikido IAM ロールのプリンシパルは次のように組み立てます。

`principalSet://iam.googleapis.com/projects/` + `<your_project_number>` + `/locations/global/workloadIdentityPools/` + `<your_wif_pool>` + `/attribute.aws_role/arn:aws:sts::` + `<aikido_aws_account_id>` + `:assumed-role/` + `<aikido_aws_role_name>`

Aikido には、プロジェクトまたは[組織](https://help.aikido.dev/cloud-scanning/connect-your-cloud/gcp/connect-google-cloud-organization)レベルで以下の権限が必要です。

* Aikido ロール `lambda-gcp-cloud-findings-role-1muvqxle` に対する **Viewer/Reader**（利用可能な場合は Reader を推奨）および **Security Reviewer**。
* **Artifact Registry Viewer**:
  * Aikido に Artifact Registry のコンテナイメージをスキャンさせたい場合は、Aikido ロール `lambda-container-image-scanner-role-pb0qotst` に付与します。
  * または、Aikido に Artifact Registry Vulnerability Scanning の検出結果のみを取り込ませたい場合は、Aikido ロール `lambda-gcp-cloud-findings-role-1muvqxle` に付与します。

{% hint style="info" %}
プロジェクトまたは組織の IAM ポリシーにすでに**条件付きバインディング**が含まれている場合、`gcloud` ではすべての新しいバインディングで条件を明示的に指定する必要があります。

Aikido 用の IAM バインディングを適用する際は、必ず**条件を明示的に無効化**してください。これは、`gcloud` コマンドに `--condition=None` を追加するか、CLI でプロンプトが表示されたときに **None** を選択することで行えます。
{% endhint %}

Workload Identity Federation のプールとプロバイダ、および IAM 権限の設定が完了したら、Aikido にアップロードする構成ファイルを生成します。推奨される、よりシンプルな方法は（サービスアカウントの権限借用ではなく）**直接アクセス**です。

<figure><img src="https://help.aikidogov.us/_assets/e6049cd62fa8/image-51.png" alt="" width="563"><figcaption><p>直接アクセスを使用した Google Cloud WIF 構成ファイルの生成</p></figcaption></figure>

{% hint style="warning" %}
**App Engine** をスキャンする場合は、直接アクセスではなくサービスアカウントの権限借用を使用してください。App Engine の Google Cloud API は[直接 WIF アクセスをサポートするサービスの一覧](https://docs.cloud.google.com/iam/docs/federated-identity-supported-services)に含まれていないため、直接アクセスでは認証エラーで失敗します。[サービスアカウントの権限借用](https://docs.cloud.google.com/iam/docs/workload-download-cred-and-grant-access#impersonation)および下記の FAQ を参照してください。
{% endhint %}

## よくある質問

* **すでに接続済みの GCP プロジェクトをサービスアカウントから WIF に移行できますか？**

はい。アプリ内の手順に従ってプロジェクトに WIF を設定し、オンボーディングを完了する代わりに、生成した構成ファイルで接続済みの GCP プロジェクトの認証情報を更新してください。

* **既存の WIF プールを使用できますか？**

はい、既存の WIF プールのいずれかに新しいプロバイダを追加できます。CLI コマンドを調整して、既存のプールの名前を使用する必要があります。

* **WIF プロバイダに属性条件も設定すべきですか？**

（WIF プール全体ではなく）特定の Aikido プリンシパルのみにアクセスを付与しているため、[属性条件](https://docs.cloud.google.com/iam/docs/workload-identity-federation#conditions)の重要性は低くなります。ただし、ポリシーで義務付けられている場合は、上記の 2 つの IAM ロールに対して条件を追加できます。

* **直接アクセスではなく、サービスアカウントの権限借用でアクセスを設定できますか？**

はい。ただし、直接アクセスの方がシンプルです。組織ですべての外部 ID がサービスアカウントを介して動作することが義務付けられている場合や、**App Engine** をスキャンする場合（その API は直接 WIF アクセスをサポートしていないため）は、権限借用を使用してください。サービスアカウントを作成し、上記の Aikido プリンシパルがそれを借用できるようにし（`roles/iam.workloadIdentityUser`）、必要な IAM 権限を付与して、サービスアカウント用の構成ファイルを生成します。

<figure><img src="https://help.aikidogov.us/_assets/9650c0b1022f/image-52.png" alt="" width="375"><figcaption><p>サービスアカウント用の構成ファイルの生成</p></figcaption></figure>

* **これ用の Terraform モジュールはありますか？**

はい！こちらで入手できます: [https://github.com/AikidoSec/gcp-onboarding-terraform-module](https://github.com/AikidoSec/gcp-onboarding-terraform-module)。プロジェクトのオンボーディングと組織のオンボーディングの 2 つのバリエーションがあります。
