Kubernetes 認可に Azure ロールベースのアクセス制御を使用する

この記事では、Kubernetes 認可に Azure RBAC を使用する方法について説明します。これにより、Azure リソース、AKS、Kubernetes リソース全体で統合された管理とアクセス制御が可能になります。 詳細については、「Kubernetes 認可のための Azure RBAC」を参照してください。

Note

Microsoft Entra ID と AKS の間の統合認証を使っているときは、Kubernetes のロールベースのアクセス制御 (Kubernetes RBAC) の対象として、Microsoft Entra のユーザー、グループ、またはサービス プリンシパルを使用できます。 この機能を使うと、Kubernetes に対するユーザーの ID と資格情報を個別に管理する必要がなくなります。 ただし、それでも Azure RBAC と Kubernetes RBAC は個別に設定して管理する必要があります。

開始する前に

  • Azure CLI バージョン 2.24.0 以降がインストールされ、構成されている必要があります。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
  • kubectl バージョン 1.18.3 以降が必要です。
  • Kubernetes 認可用の Azure RBAC を追加する前に、クラスターでマネージド Microsoft Entra 統合を有効にする必要があります。 マネージド Microsoft Entra 統合を有効にする必要がある場合は、「AKS で Microsoft Entra ID を使用する」を参照してください。
  • CRD があり、カスタム ロール定義を作成する場合、現時点で CRD をカバーする唯一の方法は Microsoft.ContainerService/managedClusters/*/read を使用することです。 残りのオブジェクトについては、Microsoft.ContainerService/apps/deployments/read などの特定の API グループを使用できます。
  • 新しいロールの割り当てが認可サーバーに伝達されて更新されるまで、"最大で 5 分" かかることがあります。
  • Azure RBAC for Kubernetes Authorizationでは、認証用に構成された Microsoft Entra テナントと、AKS クラスターが含まれるサブスクリプションのテナントが同じである必要があります。

マネージド Microsoft Entra 統合と Kubernetes 認可用の Azure RBAC を備えた新しい AKS クラスターを作成する

  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 統合と Kubernetes 認可用の Azure RBAC を備えた AKS クラスターを作成します。

    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 クラスターで Azure RBAC を有効にする

  • --enable-azure-rbac フラグを指定した az aks update コマンドを使って、既存の AKS クラスターで Kubernetes の認可用に Azure RBAC を有効にします。

    az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --enable-azure-rbac
    

AKS クラスターで Kubernetes 認可用の Azure RBAC を無効にする

  • 既存の AKS クラスターから Kubernetes 認可用の Azure RBAC を削除するには、--disable-azure-rbac フラグを指定した az aks update コマンドを使用します。

    az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --disable-azure-rbac
    

AKS の組み込みロール

AKS には、次の組み込みロールがあります。

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

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

  1. az aks show コマンドを使用して AKS リソース 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 管理者" ロールに対するロールの割り当てを作成します。

    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 閲覧者ロールと Azure Kubernetes Service RBAC ライター ロールの割り当てを作成できます。

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

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

次のカスタム ロール定義の例では、ユーザーはデプロイの読み取りのみ許可され、それ以外は何も許可されません。 使用可能なアクションの全一覧については、Microsoft.ContainerService 操作に関するページを参照してください。

  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 に割り当てます。

    az role assignment create --role "AKS Deployment Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
    

kubectl で Kubernetes 認可に Azure RBAC を使用する

  1. Azure Kubernetes Service クラスター ユーザー組み込みロールがあることを確認し、az aks get-credentials コマンドを使用して AKS クラスターの kubeconfig を取得します。

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. これで、kubectl を使ってクラスターを管理できます。 たとえば、kubectl get nodes を使用してクラスター内のノードを一覧表示できます。

    kubectl get nodes
    

    出力例:

    NAME                                STATUS   ROLES   AGE    VERSION
    aks-nodepool1-93451573-vmss000000   Ready    agent   3h6m   v1.15.11
    aks-nodepool1-93451573-vmss000001   Ready    agent   3h6m   v1.15.11
    aks-nodepool1-93451573-vmss000002   Ready    agent   3h6m   v1.15.11
    

kubelogin で Kubernetes 認可に Azure RBAC を使用する

AKS で kubelogin プラグインが作成されました。これは、非対話型ログイン、以前の kubectl バージョン、新しいクラスターにサインインする必要のない複数クラスター間での SSO の利用などのシナリオを実現するのに役立ちます。

  1. kubelogin プラグインを使うには、次のコマンドを実行します。

    export KUBECONFIG=/path/to/kubeconfig
    kubelogin convert-kubeconfig
    
  2. これで、kubectl を使ってクラスターを管理できます。 たとえば、kubectl get nodes を使用してクラスター内のノードを一覧表示できます。

    kubectl get nodes
    

    出力例:

    NAME                                STATUS   ROLES   AGE    VERSION
    aks-nodepool1-93451573-vmss000000   Ready    agent   3h6m   v1.15.11
    aks-nodepool1-93451573-vmss000001   Ready    agent   3h6m   v1.15.11
    aks-nodepool1-93451573-vmss000002   Ready    agent   3h6m   v1.15.11
    

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

ロール割り当ての削除

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

    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 クラスターを削除します。

    az group delete --name $RESOURCE_GROUP --yes --no-wait
    

次のステップ

AKS の認証、認可、Kubernetes RBAC、Azure RBAC について詳しくは、以下を参照してください。