Azure Kubernetes Service (AKS) で Azure AD ワークロード ID を使用する

Azure Kubernetes Services (AKS) クラスターにデプロイされたワークロードでは、Azure Key Vault や Microsoft Graph などの Azure AD で保護されたリソースにアクセスするには、Azure Active Directory (Azure AD) アプリケーションの資格情報またはマネージド ID が必要です。 Azure AD ワークロード ID は、Kubernetes にネイティブな機能と統合され、外部 ID プロバイダーとフェデレーションされます。

Azure AD ワークロード ID では、サービス アカウント トークン ボリューム プロジェクションを使用して、ポッドで Kubernetes ID (つまりサービス アカウント) を使用できるようにします。 Kubernetes トークンが発行され、OIDC フェデレーションにより、Kubernetes アプリケーションは注釈付きのサービス アカウントに基づいて Azure AD を使用して Azure リソースに安全にアクセスできるようになります。

Azure AD ワークロード ID は、アプリケーションの登録を使用している場合は、Azure ID クライアント ライブラリMicrosoft Authentication Library (MSAL) コレクションで特に適切に機能します。 ワークロードでは、これらのライブラリのいずれかを使用して、Azure クラウド リソースのシームレスな認証とアクセスを行うことができます。

この記事は、この新しい認証機能を理解し、プロジェクト戦略や Azure AD ポッドマネージド ID からの移行の可能性を計画するために使用できるオプションを確認するのに役立ちます。

依存関係

  • AKS では、バージョン 1.22 以降で Azure AD ワークロード ID がサポートされています。
  • Azure CLI バージョン 2.47.0 以降。 az --version を実行してバージョンを見つけ、az upgrade を実行してバージョンをアップグレードします。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

Azure ID クライアント ライブラリ

Azure ID クライアント ライブラリで、次のいずれかの方法を選択します。

  • DefaultAzureCredential を使用します。これにより、WorkloadIdentityCredential の使用が試行されます。 †
  • WorkloadIdentityCredential を含む ChainedTokenCredential インスタンスを作成します。
  • WorkloadIdentityCredential を直接使用します。

次の表は、各言語のクライアント ライブラリに必要な最小 のパッケージ バージョンを示しています。

エコシステム ライブラリ 最小バージョン
.NET Azure.Identity 1.9.0
C++ azure-identity-cpp 1.6.0-beta.1
Go azidentity 1.3.0
Java azure-identity 1.9.0
Node.js @azure/identity 3.2.0
Python azure-identity 1.13.0

† C++ ライブラリでは、 WorkloadIdentityCredentialDefaultAzureCredential 認証フローの 一部ではありません。

次のコード サンプルでは、資格情報の種類では、Azure Workload Identity によって挿入された環境変数を使用して、Webhook を変更して Azure Key Vault で認証します。

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;

string keyVaultUrl = Environment.GetEnvironmentVariable("KEYVAULT_URL");
string secretName = Environment.GetEnvironmentVariable("SECRET_NAME");

var client = new SecretClient(
    new Uri(keyVaultUrl),
    new DefaultAzureCredential());

KeyVaultSecret secret = await client.GetSecretAsync(secretName);

Microsoft Authentication Library (MSAL)

次のクライアント ライブラリは、必要な最小バージョンです。

エコシステム ライブラリ Image Windows が含まれます
.NET microsoft-authentication-library-for-dotnet ghcr.io/azure/azure-workload-identity/msal-net:latest リンク はい
Go microsoft-authentication-library-for-go ghcr.io/azure/azure-workload-identity/msal-go:latest リンク はい
Java microsoft-authentication-library-for-java ghcr.io/azure/azure-workload-identity/msal-java:latest リンク いいえ
JavaScript microsoft-authentication-library-for-js ghcr.io/azure/azure-workload-identity/msal-node:latest リンク いいえ
Python microsoft-authentication-library-for-python ghcr.io/azure/azure-workload-identity/msal-python:latest リンク いいえ

制限事項

  • フェデレーション ID 資格情報は、マネージド ID ごとに 20 個しか持つことができません。
  • フェデレーション ID 資格情報が最初に追加された後に反映されるまでに数秒かかります。
  • オープン ソース プロジェクト Virtual Kubelet に基づき、仮想ノード アドオンはサポートされていません。
  • これらのリージョンのユーザー割り当て済みマネージド ID では、フェデレーション ID 資格情報の作成がサポートされていません。

しくみ

このセキュリティ モデルでは、AKS クラスターがトークン発行者として機能し、Azure Active Directory は OpenID Connect を使用して公開署名キーを検出し、Azure AD トークンと交換する前にサービス アカウント トークンの信頼性を確認します。 ワークロードでは、Azure ID クライアント ライブラリまたは Microsoft Authentication Library を使用して、Azure AD トークンのボリュームに投影されたサービス アカウント トークンを交換できます。

AKS ワークロード ID セキュリティ モデルの図。

次の表では、Azure AD ワークロード ID に必要な OIDC 発行者のエンドポイントについて説明します。

エンドポイント 説明
{IssuerURL}/.well-known/openid-configuration OIDC 探索ドキュメントとも呼ばれます。 これには、発行者の構成に関するメタデータが含まれています。
{IssuerURL}/openid/v1/jwks これには、サービス アカウント トークンの信頼性を検証するために Azure AD で使用する公開署名キーが含まれています。

次の図は、OpenID Connect を使用した認証シーケンスをまとめたものです。

AKS ワークロード ID OIDC 認証シーケンスの図。

Webhook 証明書の自動ローテーション

他の Webhook アドオンと同様に、証明書はクラスター証明書の自動ローテーション処理によってローテーションされます。

サービス アカウントのラベルと注釈

Azure AD ワークロード ID では、サービス アカウントに関連する次のマッピングがサポートされています。

  • 1 つのサービス アカウントから 1 つの Azure AD オブジェクトを参照する一対一。
  • 複数のサービス アカウントから同一の Azure AD オブジェクトを参照する多対一。
  • クライアント ID 注釈を変更することで、1 つのサービス アカウントから複数の Azure AD オブジェクトを参照する一対多。 詳しくは、「Kubernetes サービス アカウントを使用して複数の ID をフェデレートする方法」をご覧ください。

Note

サービス アカウントの注釈が更新された場合は、変更を有効にするためにポッドを再起動する必要があります。

Azure AD ポッドマネージド ID を使用している場合、サービス アカウントはコア Kubernetes API の一部であることを除き、サービス アカウントをカスタム リソース定義 (CRD) ではなく Azure ID と考えてください。 次に、Azure AD アクセス トークンのサービス アカウント トークンを交換するときに動作を構成するために使用できる、使用可能なラベルと注釈の一覧について説明します。

サービス アカウントの注釈

すべての注釈は省略可能です。 注釈が指定されていない場合は、既定値が使用されます。

注釈 説明 Default
azure.workload.identity/client-id ポッドに使用される Azure AD アプリケーション
クライアント ID を表します。
azure.workload.identity/tenant-id Azure AD アプリケーションが登録される
Azure テナント ID を表します。
AZURE_TENANT_ID 環境変数
(azure-wi-webhook-config ConfigMap から抽出されたもの)。
azure.workload.identity/service-account-token-expiration 投影されたサービス アカウント トークンの expirationSeconds フィールドを
表します。 これは、サービス アカウント トークンの更新中のエラーによって発生する
ダウンタイムを防ぐために構成する省略可能なフィールドです。 Kubernetes サービス アカウント トークンの有効期限は、Azure AD トークンと関連付けられていません。 Azure AD トークンは、発行されてから 24 時間で有効期限が切れます。
3600
サポートされる範囲は 3600 から 86400 です。

ポッド ラベル

注意

ワークロード ID を使用するアプリケーションの場合、ワークロード ID を使用する必要があるポッドに対して一貫した信頼性の高い動作を提供するため、GA の前に AKS がワークロード ID を "Fail Close" シナリオに移動するよう、ポッド ラベルに 'azure.workload.identity/use: "true"' というラベルを追加する必要があります。

Label 説明 推奨値 必須
azure.workload.identity/use このラベルは、ポッド テンプレート スペックで必要です。このラベルを持つポッドのみが、Azure 固有の環境変数と予測されるサービス アカウント トークン ボリュームを挿入するために、azure-workload-identity mutating admission webhook によって変更されます。 true はい

ポッドの注釈

すべての注釈は省略可能です。 注釈が指定されていない場合は、既定値が使用されます。

注釈 説明 Default
azure.workload.identity/service-account-token-expiration 投影されたサービス アカウント トークンの expirationSeconds フィールドを表しています。 これは、サービス アカウント トークンの更新中のエラーが原因のダウンタイムを防ぐために構成する省略可能なフィールドです。 Kubernetes サービス アカウント トークンの有効期限は、Azure AD トークンと関連付けられていません。 Azure AD トークンは、発行されてから 24 時間で有効期限が切れます。 1 3600
サポートされる範囲は 3600 から 86400 です。
azure.workload.identity/skip-containers 投影されたサービス アカウント トークン ボリュームの追加をスキップする、セミコロンで区切られたコンテナーの一覧を表します。 たとえば、「 container1;container2 」のように入力します。 既定では、サービス アカウントに azure.workload.identity/use: true というラベルが付いている場合、投影されたサービス アカウント トークン ボリュームはすべてのコンテナーに追加されます。
azure.workload.identity/inject-proxy-sidecar プロキシ init コンテナーとプロキシ サイドカーをポッドに挿入します。 プロキシ サイドカーは、IMDS へのトークン要求をインターセプトし、フェデレーション ID 資格情報を持つユーザーに代わって Azure AD トークンを取得するために使用されます。 true
azure.workload.identity/proxy-sidecar-port プロキシ サイドカーのポートを表します。 8000

1 サービス アカウントにも注釈が付けられる場合に優先されます。

ワークロード ID に移行する方法

ポッドマネージド ID が既に実行されているクラスターでは、2 つの方法のいずれかでワークロード ID を使用するように構成できます。 最初のオプションでは、ポッドマネージド ID に対して現在実装しているものと同じ構成を使用できます。 名前空間内のサービス アカウントに ID で注釈を付けるだけで済み、ワークロード ID でポッドに注釈を挿入できるようになります。

2 つ目のオプションは、Azure ID クライアント ライブラリの最新バージョンを使用するようにアプリケーションを書き換える方法です。

移行プロセスを合理化および容易にするために、アプリケーションで行われる IMDS トランザクションを OpenID Connect (OIDC) に変換する移行サイドカーを開発しました。 移行サイドカーは長期的なソリューションを意図したものではなく、ワークロード ID で迅速に稼働させる方法です。 アプリケーション内で移行サイドカーを実行すると、アプリケーション IMDS トランザクションが OIDC にプロキシされます。 もう 1 つの方法は、OIDC 認証をサポートする Azure ID クライアント ライブラリのサポートされているバージョンにアップグレードすることです。

次の表は、ワークロード ID の移行またはデプロイに関する推奨事項をまとめたものです。

シナリオ 説明
新規または既存のクラスターのデプロイでは、Azure ID クライアント ライブラリのサポートされているバージョンが実行されます 移行手順は必要ありません。
デプロイ リソースの例:
- 新しいクラスターにワークロード ID をデプロイして構成する
- チュートリアル: AKS 上のアプリケーションでワークロード ID を使用する
新規または既存のクラスターのデプロイでは、Azure ID クライアント ライブラリのサポートされないバージョンが実行されます サポートされているバージョンの Azure ID SDK を使用するようにコンテナー イメージを更新するか、移行サイドカーを使用します。

次のステップ