Azure Kubernetes Service で Microsoft Entra ポッドマネージド ID を使用する (プレビュー)

Microsoft Entra ポッドマネージド ID では、Kubernetes プリミティブを使用して Azure リソース用マネージド ID と Microsoft Entra ID の ID をポッドに関連付けます。 管理者は、ID とバインドを Kubernetes プリミティブとして作成し、ID プロバイダーとしての Microsoft Entra ID に依存する Azure リソースにポッドがアクセスできるようにします。

重要

Microsoft Entra ワークロード ID を確認することをお勧めします。 この認証方法により、ポッドマネージド ID (プレビュー) が置き換えられます。これにより、Kubernetes のネイティブ機能と統合され、アプリケーションに代わって任意の外部 ID プロバイダーとフェデレーションされます。

Azure Kubernetes Service のオープンソースの Microsoft Entra ポッド マネージド ID (プレビュー) は、2022 年 10 月 24 日に非推奨となり、プロジェクトは 2023 年 9 月にアーカイブされました。 詳細については、非推奨に関する通知を参照してください。 AKS マネージド アドオンは、2024 年 9 月に非推奨となります。

AKS マネージド アドオンを無効にするには、次のコマンドを使用します。az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

始める前に

Azure CLI バージョン 2.20.0 以降がインストールされている必要があります。

制限事項

  • クラスターに対して最大 200 のポッドマネージド ID が許可されます。
  • クラスターに対して最大 200 のポッドマネージド ID の例外が許可されます。
  • ポッドマネージド ID は、Linux ノード プールでのみ使用できます。
  • この機能は、Virtual Machine Scale Sets でサポートされているクラスターでのみサポートされています。

aksプレビューの Azure CLI 拡張機能をインストールする

重要

AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。

aksプレビュー拡張機能をインストールして、次のコマンドを実行します:

az extension add --name aks-preview

次のコマンドを実行して、リリースされた最新バージョンの拡張機能に更新します:

az extension update --name aks-preview

'EnablePodIdentityPreview' 機能フラグを登録する

EnablePodIdentityPreview 機能フラグは、次の例のとおり、EnablePodIdentityPreview コマンドを使用して登録します。

az feature register --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

状態が [登録済み] と表示されるまでに数分かかります。 登録の状態は、az feature show コマンドで確認します。

az feature show --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

状態が Registered として表示されたら、az provider register コマンドを使用して Microsoft.ContainerService リソース プロバイダーの登録を最新の情報に更新します。

az provider register --namespace Microsoft.ContainerService

操作モードのオプション

Microsoft Entra ポッドマネージド ID では、次の 2 つの操作モードがサポートされています。

  • standard モード: このモードでは、次の 2 つのコンポーネントが AKS クラスターにデプロイされます。
    • Managed Identity Controller (MIC): MIC は Kubernetes API サーバーを介してポッド、AzureIdentity、および AzureIdentityBinding の変更を監視する Kubernetes コントローラーです。 MIC は関連する変更を検出すると、必要に応じて AzureAssignedIdentity を追加または削除します。 具体的には、ポッドがスケジュールされている場合、MIC は、作成フェーズ中にノード プールによって使用される基になる仮想マシン スケール セットに Azure 上のマネージド ID を割り当てます。 ID を使用しているすべてのポッドが削除された場合、同じマネージド ID が他のポッドによって使用されていない限り、ノード プールの仮想マシン スケール セットから ID が削除されます。 MIC は、AzureIdentity または AzureIdentityBinding が作成または削除された場合にも同様のアクションを実行します。
    • Node Management Identity (NMI): NMI は、AKS クラスターの各ノードでデーモンセットとして実行されるポッドです。 NMI は、各ノード上の Azure Instance Metadata Service に対するセキュリティ トークン要求をインターセプトし、それを自身にリダイレクトして、トークンを要求している ID にポッドがアクセスできるか検証し、アプリケーションに代わって Microsoft Entra テナントからトークンをフェッチします。
  • managed モード: このモードで提供されるのは、NMI のみです。 AKS クラスター アドオンを使用してインストールすると、ユーザーによる CLI コマンドに応答して、Kubernetes プリミティブ (AzureIdentity と AzureIdentityBinding) の作成と ID の割り当てが Azure によって管理されます。 そうではなく、Helm Chart を使用してインストールした場合、ID は、ユーザーが手動で割り当て、管理する必要があります。 詳細については、managed モードのポッド ID に関するページを参照してください。

インストール ガイドに示すように Helm チャートまたは YAML マニフェストを介して Microsoft Entra ポッドマネージド ID をインストールする場合、standard または managed モードを選択できます。 そうではなく、この記事に示すように、AKS クラスター アドオンを使用して Microsoft Entra のポッドマネージド ID をインストールする場合、セットアップでは managed モードが使用されます。

Azure Container Networking Interface (CNI) を使用して AKS クラスターを作成する

Note

これは、推奨される既定の構成です。

Azure CNI とポッドマネージド ID が有効になっている AKS クラスターを作成します。 次のコマンドを実行すると、az group create を使用して myResourceGroup という名前のリソース グループが作成され、az aks create コマンドを使用して myResourceGroup リソース グループに myAKSCluster という名前の AKS クラスターが作成されます。

az group create --name myResourceGroup --location eastus
az aks create -g myResourceGroup -n myAKSCluster --enable-pod-identity --network-plugin azure

az aks get-credentials を使用して、AKS クラスターにサインインします。 また、このコマンドにより、ご使用の開発用コンピューターに kubectl クライアント証明書がダウンロードされて構成されます。

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

Note

AKS クラスターでポッドマネージド ID を有効にすると、aks-addon-exception という名前の AzurePodIdentityException が kube-system 名前空間に追加されます。 AzurePodIdentityException を使用すると、NMI サーバーによって傍受されることなく、特定のラベルがあるポッドから Azure Instance Metadata Service (IMDS) エンドポイントにアクセスできます。 aks-addon-exception を使用すると、Microsoft Entra ポッドマネージド ID などの AKS ファーストパーティのアドオンを、AzurePodIdentityException を手動で構成しなくても動作させることができます。 必要に応じて、az aks pod-identity exception addaz aks pod-identity exception deleteaz aks pod-identity exception update、または kubectl を使用して、AzurePodIdentityException を追加、削除、更新することができます。

Azure CNI で既存の AKS クラスターを更新する

ポッドマネージド ID が含まれるように、Azure CNI で既存の AKS クラスターを更新します。

az aks update -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity

Microsoft Entra ポッドマネージド ID で Kubernet ネットワーク プラグインを使用する

重要

Kubernet を使用してクラスターで Microsoft Entra ポッドマネージド ID を実行することは、セキュリティ上の懸念のため、お勧めされる構成ではありません。 既定の Kubenet 構成では、ARP スプーフィングを防止できません。この構成は、ポッドが別のポッドとして機能し、意図していない ID にアクセスするために使用される可能性があります。 Kubernet を使用してクラスターで Microsoft Entra ポッドマネージド ID を有効にする前に、軽減策の手順に従い、ポリシーを構成してください。

軽減策

クラスター レベルでこの脆弱性を緩和するには、Azure の組み込みのポリシー "Kubernetes cluster containers should only use allowed capabilities" (Kubernetes クラスター コンテナーには許可された機能のみを使用する) を使用して、CAP_NET_RAW 攻撃を制限することができます。

NET_RAW を [必須のドロップ機能] に追加します

image

Azure Policy を使用していない場合は、OpenPolicyAgent アドミッション コントローラーと Gatekeeper Validating Webhook を併用することができます。 クラスターに既にゲートキーパーがインストールされている場合は、K8sPSPCapabilities タイプの ConstraintTemplate を追加します。

kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/master/library/pod-security-policy/capabilities/template.yaml

NET_RAW 機能を使用してポッドの生成を制限するテンプレートを追加します。

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPCapabilities
metadata:
  name: prevent-net-raw
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces:
      - "kube-system"
  parameters:
    requiredDropCapabilities: ["NET_RAW"]

Kubernet ネットワーク プラグインを使用して AKS クラスターを作成する

Kubenet ネットワーク プラグインとポッドマネージド ID が有効になっている AKS クラスターを作成します。

az aks create -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

Kubernet ネットワーク プラグインを使用して既存の AKS クラスターを更新する

ポッドマネージド ID が含まれるように、Kubenet ネットワーク プラグインを使用して、既存の AKS クラスターを更新します。

az aks update -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

ID の作成

重要

ID を作成するには、お使いのサブスクリプションに、関連するアクセス許可 (所有者など) が必要です。

az identity create を使用して、デモ ポッドによって使用される ID を作成し、IDENTITY_CLIENT_ID および IDENTITY_RESOURCE_ID の変数を設定します。

az group create --name myIdentityResourceGroup --location eastus
export IDENTITY_RESOURCE_GROUP="myIdentityResourceGroup"
export IDENTITY_NAME="application-identity"
az identity create --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
export IDENTITY_CLIENT_ID="$(az identity show -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME} --query clientId -otsv)"
export IDENTITY_RESOURCE_ID="$(az identity show -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME} --query id -otsv)"

マネージド ID にアクセス許可を割り当てる

ポッドに割り当てられるマネージド ID には、実行するアクションに合致したアクセス許可を付与する必要があります。

デモを実行するには、IDENTITY_CLIENT_ID マネージド ID に、AKS クラスターの仮想マシン スケール セットを含むリソース グループに対する仮想マシン共同作成者のアクセス許可が付与されている必要があります。

# Obtain the name of the resource group containing the Virtual Machine Scale set of your AKS cluster, commonly called the node resource group
NODE_GROUP=$(az aks show -g myResourceGroup -n myAKSCluster --query nodeResourceGroup -o tsv)

# Obtain the id of the node resource group 
NODES_RESOURCE_ID=$(az group show -n $NODE_GROUP -o tsv --query "id")

# Create a role assignment granting your managed identity permissions on the node resource group
az role assignment create --role "Virtual Machine Contributor" --assignee "$IDENTITY_CLIENT_ID" --scope $NODES_RESOURCE_ID

ポッド ID を作成する

az aks pod-identity add を使用して、クラスターのポッドマネージド ID を作成します。

export POD_IDENTITY_NAME="my-pod-identity"
export POD_IDENTITY_NAMESPACE="my-app"
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME} --identity-resource-id ${IDENTITY_RESOURCE_ID}

Note

"POD_IDENTITY_NAME" は RFC 1123 に定義されている有効な DNS サブドメイン名にする必要があります。

Note

pod-identity add を使用してポッドマネージド ID を割り当てると、Azure CLI ではポッドマネージド ID (IDENTITY_RESOURCE_ID) を介して、マネージド ID オペレーター ロールをクラスター ID に付与しようとします。

Azure は、Azure の ID を表す AzureIdentity リソースと、AzureIdentity をセレクターに接続する AzureIdentityBinding リソースをクラスターに作成します。 これらのリソースは、次を使用して表示できます。

kubectl get azureidentity -n $POD_IDENTITY_NAMESPACE
kubectl get azureidentitybinding -n $POD_IDENTITY_NAMESPACE

サンプル アプリケーションを実行する

ポッドで Microsoft Entra ポッドマネージド ID を使用するには、ポッドに AzureIdentityBinding のセレクターと一致する値が指定された aadpodidbinding ラベルが必要です。 既定では、セレクターはポッドマネージド ID の名前と一致しますが、az aks pod-identity add を呼び出す際に --binding-selector オプションを使用して設定することもできます。

Microsoft Entra ポッドマネージド ID を使用してサンプル アプリケーションを実行するには、次の内容を含む demo.yaml ファイルを作成します。 POD_IDENTITY_NAMEIDENTITY_CLIENT_ID、および IDENTITY_RESOURCE_GROUP を、前の手順の値に置き換えます。 SUBSCRIPTION_ID を実際のサブスクリプション ID に置き換えます。

Note

前の手順では、POD_IDENTITY_NAMEIDENTITY_CLIENT_ID、および IDENTITY_RESOURCE_GROUP の変数を作成しました。 echo などのコマンドを使用して、変数に設定した値 (echo $POD_IDENTITY_NAME など) を表示できます。

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: $POD_IDENTITY_NAME
spec:
  containers:
  - name: demo
    image: mcr.microsoft.com/oss/azure/aad-pod-identity/demo:v1.6.3
    args:
      - --subscriptionid=$SUBSCRIPTION_ID
      - --clientid=$IDENTITY_CLIENT_ID
      - --resourcegroup=$IDENTITY_RESOURCE_GROUP
    env:
      - name: MY_POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: MY_POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
      - name: MY_POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
  nodeSelector:
    kubernetes.io/os: linux

ポッド定義には、前の手順で az aks pod-identity add を実行したポッドマネージド ID の名前と一致する値を持つ、aadpodidbinding ラベルが含まれていることに注目してください。

kubectl apply を使用して、ポッドマネージド ID と同じ名前空間に demo.yaml をデプロイします。

kubectl apply -f demo.yaml --namespace $POD_IDENTITY_NAMESPACE

kubectl logs を使用して、サンプル アプリケーションが正常に実行されていることを確認します。

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

ログに、トークンが正常に取得されたこと、および GET 操作が正常に完了したことが表示されていることを確認します。

...
successfully doARMOperations vm count 0
successfully acquired a token using the MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token)
successfully acquired a token, userAssignedID MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token) clientID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
successfully made GET on instance metadata
...

複数の ID を使用してアプリケーションを実行する

アプリケーションで複数の ID を使用できるようにするには、--binding-selector を、ポッド ID を作成するときと同じセレクターに設定します。

az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_1} --identity-resource-id ${IDENTITY_RESOURCE_ID_1} --binding-selector myMultiIdentitySelector
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_2} --identity-resource-id ${IDENTITY_RESOURCE_ID_2} --binding-selector myMultiIdentitySelector

次に、ポッド YAML の aadpodidbinding フィールドを、指定したバインディング セレクターに設定します。

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: myMultiIdentitySelector
...

既存のクラスターでポッドマネージド ID を無効にする

既存のクラスターでポッドマネージド ID を無効にするには、クラスターからポッド マネージド ID を削除します。 次に、クラスターでその機能を無効にします。

az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az aks update --resource-group myResourceGroup --name myAKSCluster --disable-pod-identity

クリーンアップ

クラスターから Microsoft Entra ポッドマネージド ID を削除するには、クラスターからサンプル アプリケーションとポッドマネージド ID を削除します。 次に、ID とクラスター ID のロールの割り当てを削除します。

kubectl delete pod demo --namespace $POD_IDENTITY_NAMESPACE
az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az identity delete -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME}
az role assignment delete --role "Managed Identity Operator" --assignee "$IDENTITY_CLIENT_ID" --scope "$IDENTITY_RESOURCE_ID"

次の手順

マネージド ID の詳細については、Azure リソースのマネージド ID に関するページを参照してください。