AzureでOpenID Connectを設定して一時的な認証情報を取得する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
CI_JOB_JWT_V2はGitLab 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プロジェクト。
このチュートリアルを完了するには、以下を行います:
Azureアイデンティティフェデレーションに関する詳細は、ワークロードIDフェデレーションをご覧ください。
Azure ADアプリケーションとサービスプリンシパルを作成
Azure ADアプリケーションとサービスプリンシパルを作成するには:
Azure CLIで、ADアプリケーションを作成します:
appId=$(az ad app create --display-name gitlab-oidc --query appId -otsv)GitLab CI/CDパイプラインを構成するために後で必要になるため、
appId(アプリケーションクライアントID)出力を保存します。対応するサービスプリンシパルを作成します:
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.jsonissuer、subject、またはaudiencesの値に関連するイシューについては、トラブルシューティングの詳細を参照してください。
オプションで、Azure ADアプリケーションとAzure ADフェデレーションID認証情報をAzure Portalから確認できるようになりました:
- Azure Active Directory App Registrationビューを開き、表示名
gitlab-oidcを検索して、適切なアプリ登録を選択します。 - 概要ページで、
Application (client) ID、Object ID、およびTenant IDなどの詳細を確認できます。 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 showCI/CD変数は次のとおりです:
AZURE_CLIENT_ID: 以前に保存したアプリケーションクライアントID。AZURE_TENANT_ID: Azure Active Directory。Azure CLIまたはAzure Portalを使用して見つけることができます。GITLAB_OIDC_TOKEN: OIDC IDトークン。
トラブルシューティング
エラー: 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になります。mygroupとmyprojectの正しい値は、GitLabプロジェクトへのアクセス時にURLを確認するか、プロジェクトの概要ページの右上隅でコードを選択することで取得できます。
- Azure ADフェデレーションID認証情報で定義された
Audience(たとえば、https://gitlab.comまたは独自のGitLab URL)。
Azure Portalから、これらの設定と、AZURE_CLIENT_IDおよびAZURE_TENANT_ID CI/CD変数を確認できます:
- Azure Active Directory App Registrationビューを開き、表示名
gitlab-oidcを検索して、適切なアプリ登録を選択します。 - 概要ページで、
Application (client) ID、Object ID、およびTenant IDなどの詳細を確認できます。 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-configurationGET /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認証情報を作成するために使用されるオーディエンスと一致する必要があります。