クラウドサービスへの接続

  • CI_JOB_JWT GitLab 12.10で導入されたVaultからシークレットを読み込む変数。
  • CI_JOB_JWT_V2 GitLab 14.7で導入された追加のOIDCプロバイダーをサポートする変数。
  • GitLab 15.7で導入されたHashiCorp Vaultを含む、あらゆるOIDCプロバイダーをサポートするIDトークン
caution
CI_JOB_JWTCI_JOB_JWT_V2GitLab 15.9で非推奨となり、GitLab 16.5で削除される予定です。代わりにIDトークンを使用してください。

GitLab CI/CDはOpenID Connect(OIDC)をサポートし、ビルドやデプロイジョブがクラウドの認証情報やサービスにアクセスできるようにします。これまで、チームはプロジェクトにシークレットを保存したり、GitLab Runnerインスタンスに権限を適用してビルドやデプロイを行っていました。OIDC 対応のID トークンはCI/CD ジョブで設定可能で、スケーラブルで最小権限のセキュリティアプローチに従うことができます。

GitLab 15.6以前では、IDトークンの代わりにCI_JOB_JWT_V2 。GitLab 14.6以前では、CI_JOB_JWTを使用する必要がありますが、サポートに制限があります。

前提条件

  • GitLabのアカウント。
  • OIDCをサポートするクラウドプロバイダにアクセスし、作成者の設定やロールの作成ができること。

ID トークンは、以下のような OIDC をサポートするクラウドプロバイダーをサポートします:

  • AWS
  • Azure
  • GCP
  • ハシコープ金庫
note
OIDCを設定すると、すべてのパイプラインでターゲット環境へのJWTトークンによるアクセスが可能になります。パイプラインにOIDCを設定するときは、追加アクセスに焦点を当てたパイプラインのソフトウェアサプライチェーンセキュリティレビューを完了する必要があります。サプライチェーン攻撃の詳細については、「DevOpsプラットフォームがサプライチェーン攻撃から保護する方法」を参照してください。

ユースケース

  • GitLabグループやプロジェクトにシークレットを保存する必要がなくなります。一時的な認証情報はOIDCを通してクラウドプロバイダーから取得できます。
  • グループ、プロジェクト、ブランチ、タグなどGitLabの細かな条件でクラウドリソースへの一時的なアクセスを提供します。
  • 環境に対する条件付きアクセスでCI/CDジョブの職務分掌を定義できます。歴史的に、アプリはステージング環境や本番環境にのみアクセスできる指定されたGitLab Runnerでデプロイされてきました。これは、各マシンが専用の権限を持っていたため、Runnerの乱立につながりました。
  • 共有Runnerが安全に複数のクラウドアカウントにアクセスできるようにします。アクセスは、パイプラインを実行しているユーザーに固有のJWTトークンによって決定されます。
  • デフォルトで一時的なクレデンシャルを取得することで、シークレットをローテーションするロジックを作成する必要がなくなります。

どのように動作するか

各ジョブは、トークンのペイロードを含むCI/CD変数として提供されるIDトークンで設定することができます。これらのJWTは、AWS、Azure、GCP、VaultなどのOIDCがサポートするクラウドプロバイダーとの認証に使用できます。

作成者のワークフロー

sequenceDiagram participant GitLab Note right of Cloud: Create OIDC identity provider Note right of Cloud: Create role with conditionals Note left of GitLab: CI/CD job with ID token GitLab->>+Cloud: Call cloud API with ID token Note right of Cloud: Decode & verify JWT with public key (https://gitlab.com/oauth/discovery/keys) Note right of Cloud: Validate audience defined in OIDC Note right of Cloud: Validate conditional (sub, aud) role Note right of Cloud: Generate credential or fetch secret Cloud->>GitLab: Return temporary credential Note left of GitLab: Perform operation
  1. クラウド(AWS、Azure、GCP、Vaultなど)にOIDC IDプロバイダを作成します。
  2. グループ、プロジェクト、ブランチ、またはタグにフィルタリングする条件付きロールをクラウドサービスで作成します。
  3. CI/CD ジョブには JWT トークンである ID トークンが含まれます。このトークンはクラウドAPIでの作成者の認証に使用できます。
  4. クラウドはトークンを検証し、ペイロードから条件ロールを検証し、一時的なクレデンシャルを返します。

OIDCクレームによる条件付きロールの設定

GitLabとOIDC間の信頼関係を設定するには、JWTをチェックする条件付きロールをクラウドプロバイダーに作成する必要があります。この条件はJWTに対して検証され、オーディエンスとサブジェクトの2つのクレームに対して特に信頼を作成します。

  • オーディエンスまたはaud :IDトークンの一部として設定:

     job_needing_oidc_auth:
       id_tokens:
         OIDC_TOKEN:
           aud: https://oidc.provider.com
       script:
         - echo $OIDC_TOKEN
    
  • Subject またはsub:グループ、プロジェクト、ブランチ、タグを含む GitLab CI/CD ワークフローを記述するメタデータの連結。フィールドは sub以下の形式です:

    • project_path:{group}/{project}:ref_type:{type}:ref:{branch_name}
フィルタータイプ物件例
メインブランチへのフィルターproject_path:mygroup/myproject:ref_type:branch:ref:main
任意のブランチへのフィルタリングワイルドカード対応project_path:mygroup/myproject:ref_type:branch:ref:*
特定のプロジェクトへのフィルタリングproject_path:mygroup/myproject:ref_type:branch:ref:main
グループ配下の全プロジェクトへのフィルタリングワイルドカード対応project_path:mygroup/*:ref_type:branch:ref:main
Git タグへのフィルタリングワイルドカード対応project_path:mygroup/*:ref_type:tag:ref:1.0

クラウドプロバイダーでのOIDC作成者

クラウドプロバイダーと接続するには、以下のチュートリアルを参照してください: