正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

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を使用してワークロードアイデンティティフェデレーションを設定するには:

  1. 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
  2. 設定 > インテグレーションを選択します。
  3. Google Cloud IAMインテグレーションを見つけて、設定するを選択します。
  4. Guided setup(ガイド付き設定)を選択し、指示に従います。

既知の問題により、ガイド付き設定でスクリプトを実行した後、Google Cloud IAMインテグレーションのページのフィールドが入力されない場合があります。フィールドが空の場合は、ページを更新してください。詳細については、issue 448831を参照してください。

Google Cloud CLIを使用する

前提要件:

  1. 次のコマンドで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"
  2. 次のコマンドを使用して、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-urihttps://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でセットアップを完了します:

  1. 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
  2. 設定 > インテグレーションを選択します。
  3. Google Cloud IAMインテグレーションを見つけて、設定するを選択します。
  4. Manual setup(手動設定)を選択します
  5. フィールドに入力します。
    • プロジェクトID: ワークロードIDプールおよびプロバイダーを作成したGoogle CloudプロジェクトのプロジェクトID。例: my-sample-project-191923
    • 同じGoogle Cloudプロジェクトの**プロジェクト番号**。例: 314053285323
    • このインテグレーション用に作成したWorkload identityプールのプールID
    • このインテグレーション用に作成したWorkload IdentityプールプロバイダのプロバイダーID

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_uriCI/CDパイプラインの実行中トップレベルグループのCIパイプライン定義へのrefsパス。
ci_config_shaCI/CDパイプラインの実行中ci_config_ref_uriのGitコミットSHA。
job_idCI/CDパイプラインの実行中CIジョブのID。
pipeline_idCI/CDパイプラインの実行中CIパイプラインのID。
pipeline_sourceCI/CDパイプラインの実行中CIパイプラインソース。
project_visibilityCI/CDパイプラインの実行中CIパイプラインが実行されているプロジェクトの表示レベル。
refCI/CDパイプラインの実行中CIジョブのGit refs。
ref_pathCI/CDパイプラインの実行中CIジョブの完全修飾参照。
ref_protectedCI/CDパイプラインの実行中Git refsが保護されているかどうか。
ref_typeCI/CDパイプラインの実行中Git refsタイプ。
runner_environmentCI/CDパイプラインの実行中CIジョブで使用されるRunnerのタイプ。
runner_idCI/CDパイプラインの実行中CIジョブを実行しているRunnerのID。
shaCI/CDパイプラインの実行中CIジョブのコミットSHA。
environmentCI/CDパイプラインの実行中CIジョブのデプロイ先となる環境。
environment_protectedCI/CDパイプラインの実行中デプロイされた環境が保護されている場合は、それ以外の場合は。
environment_actionCI/CDパイプラインの実行中CIジョブで指定された環境アクション。
deployment_tierCI/CDパイプラインの実行中CIジョブが指定する環境のデプロイ層。
user_access_levelユーザーによってトリガーされたイベント時ユーザーのロール(値はguestreporterdevelopermaintainerowner)。
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レジストリにアーティファクトをプッシュできるようにするには、次のようにします:

  1. Google Cloud Consoleにサインインし、Workload Identity Federation(ワークロードアイデンティティフェデレーション)ページに移動します。

  2. 表示名列で、ワークロードIDプールを選択します。

  3. Providers(プロバイダー) セクションで、編集するワークロードIDプロバイダーの横にある編集 ( pencil ) を選択して、プロバイダーの詳細を開きます。

  4. Attribute mappingセクションで、Add mappingを選択します。

  5. Google Nテキストボックスに、次のように入力します:

    attribute.my_project_maintainer
  6. OIDC Nテキストボックスに、次のCEL式を入力します:

    assertion.maintainer_access=="true" && assertion.project_path=="gitlab-org/my-project"
  7. 保存を選択します。

    Google属性my_project_maintainerは、GitLabクレームmaintainer_access==trueproject_path=="gitlab-org/my-project"にマップされます。

  8. Google Cloud Consoleで、IAMページに移動します。

  9. アクセス許可を選択します。

  10. 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に置き換えます。
  11. ロールを選択ドロップダウンリストで、Google Artifact Registry Writer role(Google Artifactレジストリライターロール)(roles/artifactregistry.writer)を選択します。

  12. 保存を選択します。

ロールは、プロジェクトgitlab-org/my-projectのGitLabでmaintainerロールを持つユーザーを含むプリンシパルセットに付与されます。

他のGitLabプロジェクトがGoogle Artifactレジストリにアーティファクトをプッシュできないようにするには、Google Cloud ConsoleでIAMポリシーを表示し、必要に応じてロールを削除または編集できます。

IAMポリシーを表示する

Google Cloud Consoleにサインインし、IAMページに移動します

View by principals(プリンシパルで表示)またはView by roles(ロールで表示)を選択できます。