- Azure AD アプリケーションプリンシパルとサービスプリンシパルの作成
- Azure AD 連携 ID クレデンシャルの作成
- サービスプリンシパルの権限付与
- 一時クレデンシャルの取得
- トラブルシューティング
AzureでOpenID Connectを設定し、一時的な認証情報を取得します。
このチュートリアルでは、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 プロジェクト。
このチュートリアルを完了するには
- Azure AD アプリケーションとサービスプリンシパルを作成します。
- Azure AD 連携 ID クレデンシャルを作成します。
- サービスプリンシパルに権限を付与します。
- 一時クレデンシャルを取得します。
詳細については、ワークロード ID フェデレーションに関する Azure のドキュメントをレビューしてください。
Azure AD アプリケーションプリンシパルとサービスプリンシパルの作成
AzureADアプリケーションとサービスプリンシパルを作成します:
-
Azure CLI で、AD アプリケーションを作成します:
appId=$(az ad app create --display-name gitlab-oidc --query appId -otsv)
appId
(Application client ID)の出力を保存してください。後でGitLab CI/CDパイプラインを設定する際に必要になります。 -
対応するサービスプリンシパルを作成します:
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 ポータルから確認できるようになりました:
-
Azure Active Directory アプリ登録ビューを開き、表示名
gitlab-oidc
を検索して適切なアプリ登録を選択します。 - 概要ページでは、
Application (client) ID
、Object ID
、Tenant ID
などの詳細を確認できます。 -
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 変数は次のとおりです:
-
AZURE_CLIENT_ID
:先ほど保存したアプリケーションクライアントID。 -
AZURE_TENANT_ID
:Azure Active Directory。Azure CLI や Azure Portalで確認できます。 -
GITLAB_OIDC_TOKEN
:OIDCIDトークン。
トラブルシューティング
「一致する連合 ID レコードが見つかりません。
エラー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_CLIENT_ID
、AZURE_TENANT_ID
CI/CD 変数は、Azure ポータルからレビューできます:
-
Azure Active Directory アプリ登録ビューを開き、表示名
gitlab-oidc
を検索して適切なアプリ登録を選択します。 - 概要ページでは、
Application (client) ID
、Object ID
、Tenant ID
などの詳細を確認できます。 -
Certificates & secrets
で、Federated credentials
にアクセスして、Azure AD 連携 ID クレデンシャルをレビューします。
詳細については、クラウドサービスへの接続をレビューしてください。