Google CloudワークロードアイデンティティフェデレーションとIAMポリシー
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com
Google Artifact ManagementインテグレーションのようなGoogle Cloudインテグレーションを使用するには、Workload Identityプールとプロバイダを作成し、設定する必要があります。Google Cloudインテグレーションは、ワークロードアイデンティティフェデレーションを使用して、JSON Webトークン(JWT)トークンを使用することにより、OpenID Connect(OIDC)を介してGitLabワークロードがGoogle Cloudリソースにアクセスできるようにします。
ワークロードアイデンティティフェデレーション
ワークロードアイデンティティフェデレーションを使用すると、Identity and Access Management(IAM)を使用して、外部アイデンティティ管理にIAMロールを付与できます。
従来、Google Cloudの外部で実行されているアプリケーションは、Google Cloudリソースにアクセスするためにサービスアカウントキーを使用していました。ただし、サービスアカウントキーは強力な認証情報であるため、適切に管理されていない場合はセキュリティリスクが生じる可能性があります。
アイデンティティフェデレーションを使用すると、Identity and Access Management(IAM)を使用して、サービスアカウントを必要とせずに、外部アイデンティティ管理にIAMロールを直接付与できます。このアプローチにより、サービスアカウントとそのキーに関連するメンテナンスとセキュリティの負担が軽減されます。
Workload identityプール
_Workload identityプール_は、Google Cloud上の非Googleアイデンティティ管理を管理できるエンティティです。
Google Cloudインテグレーション上のGitLabでは、Google Cloudに認証するためのWorkload identityプールの設定について説明します。この設定には、GitLabロールの属性をGoogle Cloud IAMポリシーのIAMクレームにマップすることが含まれます。Google Cloudインテグレーション上のGitLabで使用可能なGitLabの属性の完全なリストについては、OIDCカスタムクレームを参照してください。
Workload Identityプールプロバイダ
_Workload Identityプールプロバイダ_は、Google CloudとIdentity Provider(IdP)との関係を記述するエンティティです。GitLabは、Google Cloudインテグレーション上のGitLabのWorkload identityプールのIdPです。
外部ワークロードのアイデンティティフェデレーションの詳細については、ワークロードアイデンティティフェデレーションを参照してください。
Google Cloudインテグレーション上のデフォルトのGitLabは、GitLab組織レベルでGitLabからGoogle Cloudへの認証を設定することを前提としています。プロジェクトごとにGoogle Cloudへのアクセス制御を行う場合は、Workload identityプールプロバイダのIAMポリシーを設定する必要があります。GitLab組織からGoogle Cloudにアクセスできるユーザーを制御する方法の詳細については、IAMによるアクセス制御を参照してください。
ワークロードアイデンティティフェデレーションによるGitLab認証
Workload identityプールとプロバイダーをGitLabロールと権限をIAMロールにマップするように設定したら、GitLabからGoogle Cloudにワークロードをデプロイするためにランナーをプロビジョニングできます。identityキーワードを、Google Cloudでの認可のためにgoogle_cloudに設定します。
Google Cloudインテグレーション上のGitLabを使用したランナーのプロビジョニングの詳細については、チュートリアルGoogle Cloudでのランナーのプロビジョニングするを参照してください。
ワークロードアイデンティティフェデレーションを作成し、設定する
ワークロードアイデンティティフェデレーションを設定するには、次のいずれかの方法があります:
- ガイド付き設定のためにGitLab UIを使用します。
- Google Cloud CLIを使用して、ワークロードアイデンティティフェデレーションを手動で設定します。
GitLab UI
GitLab UIを使用してワークロードアイデンティティフェデレーションを設定するには:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 設定 > インテグレーションを選択します。
- Google Cloud IAMインテグレーションを見つけて、設定するを選択します。
- Guided setup(ガイド付き設定)を選択し、指示に従います。
既知の問題により、ガイド付き設定でスクリプトを実行した後、Google Cloud IAMインテグレーションのページのフィールドが入力されない場合があります。フィールドが空の場合は、ページを更新してください。詳細については、issue 448831を参照してください。
Google Cloud CLIを使用する
前提要件:
- Google Cloud CLIは、Google Cloudでインストールおよび認証されている必要があります。
- Google Cloudでワークロードアイデンティティフェデレーションを管理するには、権限が必要です。
次のコマンドでWorkload identityプールを作成します。これらの値を置き換えます:
<your_google_cloud_project_id>をGoogle CloudプロジェクトIDに置き換えます。セキュリティを向上させるには、リソースおよびCI/CDプロジェクトとは別に、アイデンティティ管理専用のプロジェクトを使用します。<your_identity_pool_id>をプールに使用するIDに置き換えます。これは、4〜32文字の小文字、数字、またはハイフンである必要があります。競合を避けるために、一意のIDを使用してください。IAMポリシーの管理を容易にするため、GitLabプロジェクトIDまたはプロジェクトパスを含める必要があります。たとえばgitlab-my-project-nameなどです。
gcloud iam workload-identity-pools create <your_identity_pool_id> \ --project="<your_google_cloud_project_id>" \ --location="global" \ --display-name="Workload identity pool for GitLab project ID"次のコマンドを使用して、OIDCプロバイダーをWorkload identityプールに追加します。これらの値を置き換えます:
<your_identity_provider_id>をプロバイダーに使用するIDに置き換えます。これは、4〜32文字の小文字、数字、またはハイフンである必要があります。競合を避けるために、アイデンティティプールで一意のIDを使用してください。たとえばgitlabなどです。<your_google_cloud_project_id>をGoogle CloudプロジェクトIDに置き換えます。<your_identity_pool_id>を前のステップで作成したWorkload identityプールのIDに置き換えます。<your_issuer_uri>をIdentity Provider発行者URIに置き換えます。これは、手動設定を選択したときにIAMインテグレーションページからコピーでき、値と完全に一致する必要があります。パラメータには、トップレベルグループのパスを含める必要があります。たとえば、プロジェクトがmy-root-group/my-subgroup/project-aにある場合、issuer-uriはhttps://auth.gcp.gitlab.com/oidc/my-root-groupに設定する必要があります。
gcloud iam workload-identity-pools providers create-oidc "<your_identity_provider_id>" \ --location="global" \ --project="<your_google_cloud_project_id>" \ --workload-identity-pool="<your_identity_pool_id>" \ --issuer-uri="<your_issuer_uri>" \ --display-name="GitLab OIDC provider" \ --attribute-mapping="attribute.guest_access=assertion.guest_access,\ attribute.reporter_access=assertion.reporter_access,\ attribute.developer_access=assertion.developer_access,\ attribute.maintainer_access=assertion.maintainer_access,\ attribute.owner_access=assertion.owner_access,\ attribute.namespace_id=assertion.namespace_id,\ attribute.namespace_path=assertion.namespace_path,\ attribute.project_id=assertion.project_id,\ attribute.project_path=assertion.project_path,\ attribute.user_id=assertion.user_id,\ attribute.user_login=assertion.user_login,\ attribute.user_email=assertion.user_email,\ attribute.user_access_level=assertion.user_access_level,\ google.subject=assertion.sub"
attribute-mappingパラメータには、アクセスを許可するためにIdentity and Access Management(IAM)ポリシーで使用される対応するアイデンティティ管理の属性へのJWT IDトークンに含まれるOIDCカスタムクレーム間のマッピングを含める必要があります。詳細については、サポートされているOIDCカスタムクレームを参照してください。これを使用して、Google Cloudへのアクセスを制御できます。
特定のGitLabプロジェクトまたはグループへのアイデンティティ管理トークンアクセスを制限するには、属性条件を使用します。プロジェクトには属性assertion.project_idを使用し、グループには属性assertion.namespace_idを使用します。詳細については、属性条件を定義する方法に関するGoogle Cloudドキュメントを参照してください。属性条件を定義したら、Workload Identityプールプロバイダを更新できます。
Workload identityプールとプロバイダーを作成したら、GitLabでセットアップを完了します:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 設定 > インテグレーションを選択します。
- Google Cloud IAMインテグレーションを見つけて、設定するを選択します。
- Manual setup(手動設定)を選択します
- フィールドに入力します。
OIDCカスタムクレーム
IDトークンには、次のカスタムクレームが含まれます:
| クレーム名 | 使用時 | 説明 |
|---|---|---|
namespace_id | プロジェクトイベント | グループまたはユーザーレベルのネームスペースのID。 |
namespace_path | プロジェクトイベント | グループまたはユーザーレベルのネームスペースのパス。 |
project_id | プロジェクトイベント | プロジェクトのID。 |
project_path | プロジェクトイベント | プロジェクトのパス。 |
root_namespace_id | グループイベント時 | トップレベルグループまたはユーザーレベルのネームスペースのID。 |
root_namespace_path | グループイベント時 | トップレベルグループまたはユーザーレベルのネームスペースのパス。 |
user_id | ユーザーによってトリガーされたイベント時 | ユーザーのID。 |
user_login | ユーザーによってトリガーされたイベント時 | ユーザーのユーザー名。 |
user_email | ユーザーによってトリガーされたイベント時 | ユーザーのメールアドレス。 |
ci_config_ref_uri | CI/CDパイプラインの実行中 | トップレベルグループのCIパイプライン定義へのrefsパス。 |
ci_config_sha | CI/CDパイプラインの実行中 | ci_config_ref_uriのGitコミットSHA。 |
job_id | CI/CDパイプラインの実行中 | CIジョブのID。 |
pipeline_id | CI/CDパイプラインの実行中 | CIパイプラインのID。 |
pipeline_source | CI/CDパイプラインの実行中 | CIパイプラインソース。 |
project_visibility | CI/CDパイプラインの実行中 | CIパイプラインが実行されているプロジェクトの表示レベル。 |
ref | CI/CDパイプラインの実行中 | CIジョブのGit refs。 |
ref_path | CI/CDパイプラインの実行中 | CIジョブの完全修飾参照。 |
ref_protected | CI/CDパイプラインの実行中 | Git refsが保護されているかどうか。 |
ref_type | CI/CDパイプラインの実行中 | Git refsタイプ。 |
runner_environment | CI/CDパイプラインの実行中 | CIジョブで使用されるRunnerのタイプ。 |
runner_id | CI/CDパイプラインの実行中 | CIジョブを実行しているRunnerのID。 |
sha | CI/CDパイプラインの実行中 | CIジョブのコミットSHA。 |
environment | CI/CDパイプラインの実行中 | CIジョブのデプロイ先となる環境。 |
environment_protected | CI/CDパイプラインの実行中 | デプロイされた環境が保護されている場合は、それ以外の場合は。 |
environment_action | CI/CDパイプラインの実行中 | CIジョブで指定された環境アクション。 |
deployment_tier | CI/CDパイプラインの実行中 | CIジョブが指定する環境のデプロイ層。 |
user_access_level | ユーザーによってトリガーされたイベント時 | ユーザーのロール(値はguest、reporter、developer、maintainer、owner)。 |
guest_access | ユーザーによってトリガーされたイベント時 | ユーザーが少なくともguestロールを持っているかどうかを、「true」または「false」の文字列で示します。 |
reporter_access | ユーザーによってトリガーされたイベント時 | ユーザーが少なくともreporterロールを持っているかどうかを、「true」または「false」の文字列で示します。 |
developer_access | ユーザーによってトリガーされたイベント時 | ユーザーが少なくともdeveloperロールを持っているかどうかを、「true」または「false」の文字列で示します。 |
maintainer_access | ユーザーによってトリガーされたイベント時 | ユーザーが少なくともmaintainerロールを持っているかどうかを、「true」または「false」の文字列で示します。 |
owner_access | ユーザーによってトリガーされたイベント時 | ユーザーが少なくともownerロールを持っているかどうかを、「true」または「false」の文字列で示します。 |
これらのクレームは、IDトークンクレームのスーパーセットです。すべての値は文字列型です。詳細と値の例については、IDトークンクレームのドキュメントを参照してください。
Google Cloudへのアクセスを制御する
ワークロードアイデンティティフェデレーションをセットアップすると、多くの標準的なGitLabクレーム(たとえば、user_access_level)がGoogle Cloud属性に自動的にマップされます。
GitLab組織からGoogle Cloudにアクセスできるユーザーをさらにカスタマイズできます。これを行うには、Common Expression言語(CEL)を使用して、Google Cloudインテグレーション上のGitLabのOIDCカスタム属性に基づいてプリンシパルを設定します。
たとえば、GitLabのmaintainerロールを持つユーザーがGitLabプロジェクトgitlab-org/my-projectからGoogle Artifactレジストリにアーティファクトをプッシュできるようにするには、次のようにします:
Google Cloud Consoleにサインインし、Workload Identity Federation(ワークロードアイデンティティフェデレーション)ページに移動します。
表示名列で、ワークロードIDプールを選択します。
Providers(プロバイダー) セクションで、編集するワークロードIDプロバイダーの横にある編集 ( ) を選択して、プロバイダーの詳細を開きます。
Attribute mappingセクションで、Add mappingを選択します。
Google Nテキストボックスに、次のように入力します:
attribute.my_project_maintainerOIDC Nテキストボックスに、次のCEL式を入力します:
assertion.maintainer_access=="true" && assertion.project_path=="gitlab-org/my-project"保存を選択します。
Google属性
my_project_maintainerは、GitLabクレームmaintainer_access==trueとproject_path=="gitlab-org/my-project"にマップされます。Google Cloud Consoleで、IAMページに移動します。
アクセス許可を選択します。
New principals(新しいプリンシパル)テキストボックスに、次の形式で
attribute.my_project_maintainer/trueを含むプリンシパルセットを入力します:principalSet://iam.googleapis.com/projects/<PROJECT_NUMBER>/locations/global/workloadIdentityPools/<POOL_ID>/attribute.my_project_maintainer/true次の行を置き換えます:
<PROJECT_NUMBER>をGoogle Cloudプロジェクト番号に置き換えます。プロジェクト番号を確認するには、プロジェクトの識別を参照してください。<POOL_ID>をワークロードアイデンティティ管理プールIDに置き換えます。
ロールを選択ドロップダウンリストで、Google Artifact Registry Writer role(Google Artifactレジストリライターロール)(
roles/artifactregistry.writer)を選択します。保存を選択します。
ロールは、プロジェクトgitlab-org/my-projectのGitLabでmaintainerロールを持つユーザーを含むプリンシパルセットに付与されます。
他のGitLabプロジェクトがGoogle Artifactレジストリにアーティファクトをプッシュできないようにするには、Google Cloud ConsoleでIAMポリシーを表示し、必要に応じてロールを削除または編集できます。
IAMポリシーを表示する
Google Cloud Consoleにサインインし、IAMページに移動します
View by principals(プリンシパルで表示)またはView by roles(ロールで表示)を選択できます。