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

AzureでOpenID Connectを設定して一時的な認証情報を取得する

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

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

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

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

前提要件:

  • Ownerアクセスレベルを持つ既存のAzureサブスクリプションへのアクセス。
  • 少なくともApplication Developerアクセスレベルを持つ、対応するAzure Activeディレクトリテナントへのアクセス。
  • Azure CLIのローカルインストール。または、Azure Cloud Shellですべての以下の手順を実行できます。
  • AzureがGitLab OIDCエンドポイントに接続する必要があるため、GitLabインスタンスはインターネット上でパブリックにアクセス可能である必要があります。
  • GitLabプロジェクト。

このチュートリアルを完了するには、以下を行います:

  1. Azure ADアプリケーションとサービスプリンシパルを作成
  2. Azure ADフェデレーションID認証情報を作成
  3. サービスプリンシパルの権限を付与
  4. 一時的な認証情報を取得する

Azureアイデンティティフェデレーションに関する詳細は、ワークロードIDフェデレーションをご覧ください。

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

Azure ADアプリケーションとサービスプリンシパルを作成するには:

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

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

    GitLab CI/CDパイプラインを構成するために後で必要になるため、appId(アプリケーションクライアントID)出力を保存します。

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

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

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

Azure ADフェデレーションID認証情報を作成

特定のブランチの以前のAzure ADアプリケーションのフェデレーションID認証情報を作成するには、<mygroup>/<myproject>を実行します:

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

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

オプションで、Azure ADアプリケーションとAzure ADフェデレーションID認証情報をAzure Portalから確認できるようになりました:

  1. Azure Active Directory App Registrationビューを開き、表示名gitlab-oidcを検索して、適切なアプリ登録を選択します。
  2. 概要ページで、Application (client) IDObject ID、およびTenant IDなどの詳細を確認できます。
  3. Certificates & secretsで、Federated credentialsに移動して、Azure ADフェデレーションID認証情報を確認します。

任意のブランチまたはタグの認証情報を作成

任意のブランチまたはタグの認証情報(ワイルドカードマッチング)を作成するには、flexible federated identity credentialsを使用できます。

<mygroup>/<myproject>のすべてのブランチ:

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

cat <<EOF > body.json
{
  "name": "gitlab-federated-identity",
  "issuer": "https://gitlab.example.com",
  "subject": null,
  "claimsMatchingExpression": {
    "value": "claims['sub'] matches 'project_path:<mygroup>/<myproject>:ref_type:branch:ref:*'",
    "languageVersion": 1
  },
  "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

すべてのタグについて、<mygroup>/<myproject>を使用します:

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

cat <<EOF > body.json
{
  "name": "gitlab-federated-identity",
  "issuer": "https://gitlab.example.com",
  "subject": null,
  "claimsMatchingExpression": {
    "value": "claims['sub'] matches 'project_path:<mygroup>/<myproject>:ref_type:tag:ref:*'",
    "languageVersion": 1
  },
  "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

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

認証情報を作成したら、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変数は次のとおりです:

トラブルシューティング

エラー: No matching federated identity record found

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

  • Azure ADフェデレーションID認証情報で定義されたIssuer(たとえば、https://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 Portalから、これらの設定と、AZURE_CLIENT_IDおよびAZURE_TENANT_ID CI/CD変数を確認できます:

  1. Azure Active Directory App Registrationビューを開き、表示名gitlab-oidcを検索して、適切なアプリ登録を選択します。
  2. 概要ページで、Application (client) IDObject ID、およびTenant IDなどの詳細を確認できます。
  3. Certificates & secretsで、Federated credentialsに移動して、Azure ADフェデレーションID認証情報を確認します。

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

Request to External OIDC endpoint failedメッセージ

エラーERROR: AADSTS501661: Request to External OIDC endpoint failed.が表示された場合は、GitLabインスタンスがインターネットからパブリックにアクセス可能であることを確認する必要があります。

Azureは、OIDCで認証するために、次のGitLabエンドポイントにアクセスできる必要があります:

  • GET /.well-known/openid-configuration
  • GET /oauth/discovery/keys

ファイアウォールを更新してもこのエラーが引き続き発生する場合は、Redisキャッシュをクリアして、もう一度お試しください。

No matching federated identity record found for presented assertion audienceメッセージ

エラーERROR: AADSTS700212: No matching federated identity record found for presented assertion audience 'https://gitlab.com'が表示された場合は、CI/CDジョブが正しいaud値を使用していることを確認する必要があります。

aud値は、フェデレーションID認証情報を作成するために使用されるオーディエンスと一致する必要があります。