Azure Kubernetes Service (AKS) で Kubernetes API のMicrosoft Entra ID承認を使用する

適用対象: ✔️ AKS 自動 ✔️ AKS Standard

この記事では、Microsoft Entra ID ID を使用して、Azure Kubernetes Service (AKS)で Kubernetes API の呼び出しを承認する方法について説明します。 Kubernetes API のMicrosoft Entra ID承認では、Azure RBAC ロールの割り当てを使用して、Kubernetes リソースへのアクセスを許可します。 組み込みの Kubernetes リソースの場合は、クラスターまたは名前空間スコープで AKS 組み込みロール (Azure Kubernetes Service RBAC 閲覧者など) のいずれかを割り当てます。 カスタム リソース (CRD) の場合は、割り当て先がアクセスできる CRD グループまたは種類を指定する Azure ABAC 条件を持つカスタム ロールを割り当てます。 2 つのロールの割り当てが構成されます。1 つは標準の Kubernetes リソースへのアクセスを許可し、もう 1 つは特定のカスタム リソースへの条件付きアクセスを許可します。

ほとんどの運用ワークロードでは、AKS の推奨される運用環境対応の既定値は AKS Automatic です。 AKS 自動クラスターは、Kubernetes 承認用の Azure RBAC で事前構成されているため、ユーザー、グループ、およびサービス プリンシパルに適切なMicrosoft Entraロールの割り当てに集中できます。

AKS で使用可能な Kubernetes API 承認オプションの概念の概要については、「 クラスター承認の概念」を参照してください。

Note

Microsoft Entra ID と AKS の間で統合認証を使用する場合は、Kubernetes ロールベースのアクセス制御 (Kubernetes RBAC) で、Microsoft Entra ユーザー、グループ、またはサービス プリンシパルをサブジェクトとして使用できます。 Microsoft Entra ID承認を使用することで、Kubernetes のユーザー ID と資格情報を個別に管理する必要はありません。 ただし、Microsoft Entra IDロールの割り当てと Kubernetes RBAC バインドを個別に設定して管理する必要があります。

Note

AKS 自動クラスターは、Kubernetes 承認に Azure RBAC を使用するように事前構成されています。 AKS 自動クラスターで --enable-azure-rbac を有効にする必要はありません。 AKS Standard では、クラスター構成に基づいてAzure RBAC を有効または無効にすることができます。

Prerequisites

  • Azure CLI バージョン 2.24.0 以降がインストールされ、構成されている必要があります。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールを参照してください。
  • kubectlが必要で、最小バージョンは 1.18.3 です
  • Kubernetes API のMicrosoft Entra ID承認を追加する前に、クラスターでマネージド Microsoft Entra統合を有効にする必要があります。 マネージド Microsoft Entra 統合を有効にする必要がある場合は、「 AKS で Microsoft Entra ID を使用する」を参照してください。
  • 新しいロールの割り当てが認可サーバーに伝達されて更新されるまで、"最大で 5 分" かかることがあります。
  • Kubernetes API に対する Microsoft Entra ID 認可では、認証用に構成された Microsoft Entra テナントが、AKS クラスターを含むサブスクリプションのテナントと同じである必要があります。

AKS クラスター モードの動作

クラスター モード Azure の Kubernetes 認可のための RBAC
AKS Automatic 事前構成済み (既定で有効)
AKS Standard 省略可能 ( --enable-azure-rbac で有効)

マネージド Microsoft Entra統合とMicrosoft Entra ID承認を使用して新しい AKS クラスターを作成する

新しい運用ワークロードの場合は、AKS Automatic を使用します。 Kubernetes 承認のAzure RBAC は、AKS 自動クラスターで事前構成されています。

  1. Azure Kubernetes Service (AKS)自動クラスターの作成に関する説明に従って、AKS 自動クラスターを作成します

  2. 省略可能: az aks show コマンドを使用して、クラスターで Kubernetes 承認のAzure RBAC が有効になっていることを確認します。

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    az aks show \
      --resource-group $RESOURCE_GROUP \
      --name $CLUSTER_NAME \
      --query "aadProfile.enableAzureRbac" \
      --output tsv
    

AKS Standard

  1. az group create コマンドを使用して、Azure リソース グループを作成します。

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=<azure-region>
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. az aks create コマンドを使用して、マネージド Microsoft Entra統合とMicrosoft Entra ID承認を使用して AKS Standard クラスターを作成します。

    export CLUSTER_NAME=<cluster-name>
    
    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --enable-aad \
        --enable-azure-rbac \
        --generate-ssh-keys
    

    出力は次の出力例のようになります。

    "AADProfile": {
        "adminGroupObjectIds": null,
        "clientAppId": null,
        "enableAzureRbac": true,
        "managed": true,
        "serverAppId": null,
        "serverAppSecret": null,
        "tenantId": "****-****-****-****-****"
    }
    

既存の AKS クラスターでMicrosoft Entra ID承認を有効にする

既存の AKS Standard クラスターの場合は、az aks update フラグを指定して --enable-azure-rbac コマンドを使用して、Kubernetes API のMicrosoft Entra ID承認を有効にします。

# Set environment variables
export RESOURCE_GROUP=<resource-group-name>
export CLUSTER_NAME=<cluster-name>

# Enable Microsoft Entra ID authorization for the Kubernetes API
az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --enable-azure-rbac

AKS 自動クラスターには、Kubernetes 承認のAzure RBAC が事前に構成されています。 AKS Automatic の --enable-azure-rbac を実行する必要はありません。

AKS の組み込みロール

AKS には、次の組み込みロールが用意されています。

役割 説明
Azure Kubernetes Service RBAC 閲覧者 名前空間内のほとんどのオブジェクトを表示するための読み取り専用アクセスが許可されます。 ロールとロールバインディングを表示することを許可しません。 シークレットの内容を読み取ると名前空間内の ServiceAccount 資格情報にアクセスできるため、このロールでは Secretsの表示は許可されません。これにより、名前空間内の任意の ServiceAccount (特権エスカレーションの形式) としての API アクセスが許可されます。
Azure Kubernetes Service RBAC ライター 名前空間内のほとんどのオブジェクトに対する読み取りと書き込みのアクセスが許可されます。 このロールでは、ロールまたはロールのバインドを表示または変更することはできません。 ただし、このロールを使用すると、 Secrets にアクセスし、名前空間内の任意の ServiceAccount としてポッドを実行できるため、名前空間内の任意の ServiceAccount の API アクセス レベルを取得するために使用できます。
Azure Kubernetes Service RBAC 管理者 名前空間内で付与されることが意図された、管理者アクセスが許可されます。 名前空間内でロールおよびロール バインドを作成する能力など、名前空間 (またはクラスター スコープ) 内のほとんどのリソースへの読み取りおよび書き込みアクセスが許可されます。 このロールでは、リソース クォータまたは名前空間自体への書き込みアクセスは許可されません。
Azure Kubernetes Service RBAC クラスター管理者 任意のリソースに対して任意のアクションを実行できるスーパー ユーザー アクセスが許可されます。 クラスター内のすべてのリソースとすべての名前空間を完全に制御できます。

クラスター アクセスのロールの割り当てを作成する

  1. az aks show コマンドを使用して AKS リソース ID を取得します。

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
  2. az role assignment create コマンドを使用してロールの割り当てを作成します。 <AAD-ENTITY-ID> には、サービス プリンシパルのユーザー名またはクライアント ID を指定できます。 次の例では、Azure Kubernetes Service RBAC 管理者ロールのロールの割り当てを作成します。

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # Create a role assignment for the Azure Kubernetes Service RBAC Admin role
    az role assignment create --role "Azure Kubernetes Service RBAC Admin" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
    

    Note

    az role assignment create コマンドを使用し、スコープを目的の名前空間に設定すると、クラスター内の特定の名前空間を対象とする Azure Kubernetes Service RBAC Reader ロール割り当てと Azure Kubernetes Service RBAC Writer ロール割り当てを作成できます。

    az role assignment create --role "Azure Kubernetes Service RBAC Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID/namespaces/<namespace-name>
    

カスタム ロール定義を作成する

組み込みの Kubernetes リソースの場合、カスタム ロール定義は、 Microsoft.ContainerService/managedClusters/の下の対応する API グループ アクションを参照します。 次の例では、ユーザーがデプロイのみを読み取り、それ以外は何も読み取れないことを許可します。 考えられるアクションの完全な一覧については、 Microsoft.ContainerService 操作を参照してください。

カスタム リソースの場合、カスタム ロールは、 Microsoft.ContainerService/managedClusters/customresources/readなどの該当するカスタム リソース データ アクションを付与する必要があります。 カスタム ロールだけでは、カスタム リソース定義 (CRD) グループまたは種類によるアクセスはフィルター処理されません。 そのフィルター処理を適用するには、ロールの割り当てにAzure ABAC 条件を追加します。 完全な手順については、「 ABAC 条件を使用してカスタム リソース アクセスを制限する」を参照してください。

  1. 独自のカスタム ロール定義を作成するには、次のファイルをコピーし、 <YOUR-SUBSCRIPTION-ID> を独自のサブスクリプション ID に置き換えて、 deploy-view.jsonとして保存します。

    {
        "Name": "AKS Deployment Reader",
        "Description": "Lets you view all deployments in cluster/namespace.",
        "Actions": [],
        "NotActions": [],
        "DataActions": [
            "Microsoft.ContainerService/managedClusters/apps/deployments/read"
        ],
        "NotDataActions": [],
        "assignableScopes": [
            "/subscriptions/<YOUR-SUBSCRIPTION-ID>"
        ]
    }
    
  2. az role definition create コマンドを使用してロール定義を作成し、前の手順で作成した--role-definition ファイルにdeploy-view.jsonを設定します。

    az role definition create --role-definition @deploy-view.json 
    
  3. az role assignment create コマンドを使用して、ユーザーまたは他の ID にロール定義を割り当てます。

        # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # Create a role assignment for the AKS Deployment Reader role
    az role assignment create --role "AKS Deployment Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
    

ABAC 条件を使用してカスタム リソース アクセスを制限する (プレビュー)

Important

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

ABAC 条件を使用すると、クラスターごとの Kubernetes RBAC RoleRoleBinding マニフェストを記述することなく、特定のカスタム リソース (CRD) グループと種類に対するMicrosoft Entra IDロールの割り当てをMicrosoft Entra IDから一元的にフィルター処理できます。 Azure ABAC の詳細については、「Azure ロール割り当て条件とは」をご覧ください。

ABAC 条件を使用する場合

この機能は、次の場合に使用します。

  • 担当者がリストまたは取得できる CRD グループまたは種類を制限します。
  • すべてのクラスターで Kubernetes RBAC Role オブジェクトと RoleBinding オブジェクトを管理することなく、Microsoft Entra ID からのカスタム リソース アクセス境界を一元的に適用します。
  • 異なる演算子によって発行された CRD を区別します (たとえば、secrets-store.csi.x-k8s.ioをブロックしながらsecurity.istio.ioを許可します)。

使用可能な条件属性

AKS クラスターで Kubernetes API の条件を作成する場合は、次の要求属性を使用できます。

特性 説明
Microsoft.ContainerService/managedClusters/customResources:group アクセスするカスタム リソースの API グループ (たとえば、 secrets-store.csi.x-k8s.io)。
Microsoft.ContainerService/managedClusters/customResources:kind アクセスするカスタム リソースの種類 (たとえば、 secretproviderclasses)。

ABAC 条件をロールの割り当てに追加する

次の例では、カスタム リソースへの読み取りアクセスを許可する AKS CRD 閲覧者カスタム ロールを作成します。 次に、secretproviderclasses グループ (シークレット ストア CSI ドライバーのAzure Key Vault プロバイダーによって使用される CRD) 内のsecrets-store.csi.x-k8s.ioへのアクセスのみを許可する条件でロールを割り当てます。

  1. 次のロール定義を crd-reader.json という名前のファイルに保存し、 <YOUR-SUBSCRIPTION-ID> を独自のサブスクリプション ID に置き換えます。

    {
        "Name": "AKS CRD Reader",
        "Description": "Lets you read custom resources in the cluster.",
        "Actions": [],
        "NotActions": [],
        "DataActions": [
            "Microsoft.ContainerService/managedClusters/customresources/read"
        ],
        "NotDataActions": [],
        "assignableScopes": [
            "/subscriptions/<YOUR-SUBSCRIPTION-ID>"
        ]
    }
    
  2. az role definition create コマンドを使用してロール定義を作成します。

    az role definition create --role-definition @crd-reader.json
    
  3. 次の条件を abac-condition.txt という名前のファイルに保存します。 この条件により、カスタム リソース以外の読み取りは変更されずに通過でき、カスタム リソースの読み取りは特定のグループと種類に制限されます。

    (
     (
      !(ActionMatches{'Microsoft.ContainerService/managedClusters/customresources/read'})
     )
     OR
     (
      @Request[Microsoft.ContainerService/managedClusters/customResources:group] StringEqualsIgnoreCase 'secrets-store.csi.x-k8s.io'
      AND
      @Request[Microsoft.ContainerService/managedClusters/customResources:kind] StringEqualsIgnoreCase 'secretproviderclasses'
     )
    )
    
  4. az role assignment create コマンドを使用して、条件を使用してロールの割り当てを作成します。

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # Create a role assignment for the AKS CRD Reader role with an ABAC condition
    az role assignment create \
        --role "AKS CRD Reader" \
        --assignee <AAD-ENTITY-ID> \
        --scope $AKS_ID \
        --condition "$(cat abac-condition.txt)" \
        --condition-version "2.0" \
        --description "Allow reads on SecretProviderClass resources only"
    

Azure portal を使用して条件を追加することもできます。 [ ロールの割り当ての追加 ] ページで、[ 条件 ] タブを選択し、[ 条件の追加] を選択し、ビジュアル エディターを使用して式を作成します。

条件を確認する

ロールの割り当てが反映されたら (最大 5 分)、担当者としてサインインし、許可された CRD を読み取ることができるが、他の CRD は読み取れないことを確認します。

  1. az aks get-credentials コマンドを使用してクラスターの資格情報を取得します。

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the cluster credentials
    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. 条件で許可されるsecretproviderclasses グループのsecrets-store.csi.x-k8s.ioを一覧表示します。 コマンドは成功し、既存のリソースまたは空のリスト (または CRD がクラスターにインストールされていない場合は見つからないエラー) を返す必要があります。

    kubectl get secretproviderclasses.secrets-store.csi.x-k8s.io --all-namespaces
    
  3. 条件がブロックする Istio authorizationpolicies グループのsecurity.istio.ioを一覧表示します。 コマンドは、Microsoft Entra ID承認 Webhook からのForbidden エラーで失敗します (Istio CRD がクラスターにインストールされていると仮定します。それ以外の kubectl場合は、API サーバーが承認 Webhook に到達する前に見つからないエラーが返されます)。

    kubectl get authorizationpolicies.security.istio.io --all-namespaces
    

リソースをクリーンアップする

Microsoft Entra ID承認を無効にする

az aks update コマンドで --disable-azure-rbac フラグを使用して、Microsoft Entra ID の認証を削除します。

# Set environment variables
export RESOURCE_GROUP=<resource-group-name>
export CLUSTER_NAME=<cluster-name>

# Disable Microsoft Entra ID authorization for the Kubernetes API
az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --disable-azure-rbac

ロール割り当ての削除

  1. az role assignment list コマンドを使用してロールの割り当てを一覧表示します。

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # List role assignments for the AKS cluster
    az role assignment list --scope $AKS_ID --query [].id --output tsv
    
  2. az role assignment delete コマンドを使用してロールの割り当てを削除します。

    az role assignment delete --ids <LIST OF ASSIGNMENT IDS>
    

ロールの定義の削除

az role definition delete コマンドを使用してカスタム ロール定義を削除します。

az role definition delete --name "AKS Deployment Reader"

リソース グループと AKS クラスターを削除する

az group delete コマンドを使用して、リソース グループ (およびそれに含まれる AKS クラスター) を削除します。

# Set environment variables
export RESOURCE_GROUP=<resource-group-name>

# Delete the resource group and all resources in it
az group delete --name $RESOURCE_GROUP --yes --no-wait

AKS の詳細については、次の記事を参照してください。