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

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

この記事では、Kubernetes 認可に Azure RBAC を使用する方法について説明します。これにより、Azure リソース、AKS、Kubernetes リソース全体で統合された管理とアクセス制御が可能になります。 詳細については、「Kubernetes 認可のための Azure 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 クラスターを作成する

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

az group create --name myResourceGroup --location westus2

az aks create コマンドを使用して、マネージド Microsoft Entra 統合と Kubernetes 認可用の Azure RBAC を備えた AKS クラスターを作成します。

az aks create -g myResourceGroup -n myManagedCluster --enable-aad --enable-azure-rbac

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

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

既存の AKS クラスターで Azure RBAC を有効にする

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

az aks update -g myResourceGroup -n myAKSCluster --enable-azure-rbac

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

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

az aks update -g myResourceGroup -n myAKSCluster --disable-azure-rbac

ユーザーがクラスターにアクセスするためのロールの割り当てを作成する

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 クラスター管理者 任意のリソースに対して任意のアクションを実行できるスーパー ユーザー アクセスが許可されます。 これにより、クラスター内およびすべての名前空間内のすべてのリソースを完全に制御できます。

AKS クラスター全体を範囲としたロールの割り当ては、Azure portal でクラスター リソースの [アクセス制御 (IAM)] ブレードを使用して、または次の Azure CLI コマンドを使用して行うことができます。

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

AKS_ID=$(az aks show -g myResourceGroup -n myManagedCluster --query id -o tsv)

az role assignment create コマンドを使用してロールの割り当てを作成します。 <AAD-ENTITY-ID> には、ユーザー名またはサービス プリンシパルのクライアント ID を指定できます。

az role assignment create --role "Azure Kubernetes Service RBAC Admin" --assignee <AAD-ENTITY-ID> --scope $AKS_ID

注意

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>

Note

Azure portal では、必要な名前空間をスコープとするロールの割り当てを作成すると、スコープで名前空間の "ロールの割り当て" を表示できなくなります。 これを見つけるには、az role assignment list コマンドを使用します。または、ロールの割り当て先ユーザーまたはグループのロールの割り当てを一覧表示します。

az role assignment list --scope $AKS_ID/namespaces/<namespace-name>

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

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

独自のカスタム ロール定義を作成するには、次のファイルをコピーし、<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>"
    ]
}

az role definition create コマンドを使用し、--role-definition を前の手順で作成した deploy-view.json ファイルに設定して、ロール定義を作成します。

az role definition create --role-definition @deploy-view.json 

az role assignment create コマンドを使用して、ロール定義をユーザーまたはその他の ID に割り当てます。

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

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

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

az aks get-credentials -g myResourceGroup -n myManagedCluster

これで、kubectl を使用してクラスターを管理できます。 たとえば、kubectl get nodes を使用してクラスター内のノードを一覧表示できます。 初めて実行するとき、次の例に示すようにサインインする必要があります。

kubectl get nodes
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.

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 を利用するなど、追加のシナリオを利用可能にするのに役立ちます。

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

export KUBECONFIG=/path/to/kubeconfig
kubelogin convert-kubeconfig

kubectl と同様に、初めて実行するとき、次の例に示すようにログインする必要があります。

kubectl get nodes
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.

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

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

ロール割り当ての削除

# List role assignments
az role assignment list --scope $AKS_ID --query [].id -o tsv

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

ロールの定義の削除

az role definition delete -n "AKS Deployment Reader"

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

az group delete -n myResourceGroup

次の手順

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