AzureでOpenID Connectを設定し、一時的な認証情報を取得します。

caution
CI_JOB_JWT_V2GitLab 15.9で非推奨となり、GitLab 16.5で削除される予定です。代わりにIDトークンを使用してください。

このチュートリアルでは、GitLab CI/CDジョブでJSON Webトークン(JWT) 、シークレットを保存することなくAzureから一時的な認証情報を取得する方法を紹介します。

始めるには、GitLabとAzure間のIDフェデレーションのためにOpenID Connect(OIDC) を設定します。GitLabでOIDCを使用する詳細については、クラウドサービスへの接続をお読みください。

Azureは条件付きロールのサブジェクトのワイルドカードマッチングをサポートしていません。Azureにアクセスする必要があるブランチごとに、個別のクレデンシャル設定を作成する必要があります。

前提条件:

  • 既存のAzureサブスクリプションへのアクセス(アクセスレベルはOwner )。
  • 対応する Azure Active Directory テナントに、少なくともApplication Developer のアクセス レベルでアクセスできること。
  • Azure CLI のローカルインストール。または、Azure Cloud Shellを使用して、以下のすべての手順を実行することもできます。
  • GitLab プロジェクト。

このチュートリアルを完了するには

  1. Azure AD アプリケーションとサービスプリンシパルを作成します。
  2. Azure AD 連携 ID クレデンシャルを作成します。
  3. サービスプリンシパルに権限を付与します。
  4. 一時クレデンシャルを取得します。

詳細については、ワークロード ID フェデレーションに関する Azure のドキュメントをレビューしてください。

Azure AD アプリケーションプリンシパルとサービスプリンシパルの作成

AzureADアプリケーションとサービスプリンシパルを作成します:

  1. Azure CLI で、AD アプリケーションを作成します:

    appId=$(az ad app create --display-name gitlab-oidc --query appId -otsv)
    

    appId (Application client ID)の出力を保存してください。後でGitLab CI/CDパイプラインを設定する際に必要になります。

  2. 対応するサービスプリンシパルを作成します:

    az ad sp create --id $appId --query appId -otsv
    

Azure CLI の代わりに、Azure Portal を使用してこれらのリソースを作成できます。

Azure AD 連携 ID クレデンシャルの作成

上記の Azure AD アプリケーション用の連携 ID クレデンシャルを作成します:

objectId=$(az ad app show --id $appId --query id -otsv)

cat <<EOF > body.json
{
  "name": "gitlab-federated-identity",
  "issuer": "https://gitlab.example.com",
  "subject": "project_path:<mygroup>/<myproject>:ref_type:branch:ref:<branch>",
  "description": "GitLab service account federated identity",
  "audiences": [
    "https://gitlab.example.com"
  ]
}
EOF

az rest --method POST --uri "https://graph.microsoft.com/beta/applications/$objectId/federatedIdentityCredentials" --body @body.json

issuer,subject またはaudiencesの値に関連するイシューについては、トラブルシューティングの詳細を参照してください。

オプションとして、Azure AD アプリケーションと Azure AD 連携 ID 認証情報を Azure ポータルから確認できるようになりました:

  1. Azure Active Directory アプリ登録ビューを開き、表示名gitlab-oidc を検索して適切なアプリ登録を選択します。
  2. 概要ページでは、Application (client) IDObject IDTenant IDなどの詳細を確認できます。
  3. Certificates & secrets で、Federated credentials にアクセスして、Azure AD 連携 ID クレデンシャルをレビューします。

サービスプリンシパルの権限付与

認証情報を作成したら、role assignment を使用して、上記のサービスプリンシパルに Azure リソースへのアクセス権限を付与します:

az role assignment create --assignee $appId --role Reader --scope /subscriptions/<subscription-id>

サブスクリプション ID は

上記のコマンドは、サブスクリプション全体に読み取り専用権限を付与します。組織のコンテキストにおける最小特権の原則の適用に関する詳細については、Azure AD ロールのベストプラクティスを参照してください。

一時クレデンシャルの取得

Azure AD アプリケーションと連携 ID クレデンシャルを設定した後、CI/CD ジョブはAzure CLI を使用して一時的なクレデンシャルを取得できます:

default:
  image: mcr.microsoft.com/azure-cli:latest

variables:
  AZURE_CLIENT_ID: "<client-id>"
  AZURE_TENANT_ID: "<tenant-id>"

auth:
  id_tokens:
    GITLAB_OIDC_TOKEN:
      aud: https://gitlab.com
  script:
    - az login --service-principal -u $AZURE_CLIENT_ID -t $AZURE_TENANT_ID --federated-token $GITLAB_OIDC_TOKEN
    - az account show

CI/CD 変数は次のとおりです:

トラブルシューティング

「一致する連合 ID レコードが見つかりません。

エラーERROR: AADSTS70021: No matching federated identity record found for presented assertion. が表示された場合は、検証する必要があります:

  • Azure AD 連携 ID クレデンシャルで定義されているIssuerhttps://gitlab.com など)、またはご自身の GitLab URL を確認してください。
  • Azure AD 連携 ID クレデンシャルで定義されているSubject identifier (例:project_path:<mygroup>/<myproject>:ref_type:branch:ref:<branch> )。
    • gitlab-group/gitlab-project プロジェクトとmain ブランチの場合は、project_path:gitlab-group/gitlab-project:ref_type:branch:ref:mainとなります。
    • mygroupmyproject の正しい値は、GitLab プロジェクトにアクセスするときに URL を確認するか、プロジェクトでクローンオプションを選択することで取得できます。
  • Azure AD 連携 ID クレデンシャルで定義されているAudience (例:https://gitlab.com または独自の GitLab URL)。

これらの設定や、AZURE_CLIENT_IDAZURE_TENANT_ID CI/CD 変数は、Azure ポータルからレビューできます:

  1. Azure Active Directory アプリ登録ビューを開き、表示名gitlab-oidc を検索して適切なアプリ登録を選択します。
  2. 概要ページでは、Application (client) IDObject IDTenant IDなどの詳細を確認できます。
  3. Certificates & secrets で、Federated credentials にアクセスして、Azure AD 連携 ID クレデンシャルをレビューします。

詳細については、クラウドサービスへの接続をレビューしてください。