Azure Kubernetes Service の マネージドMicrosoft Entra 統合を有効化しEntra ID ユーザーでAKS クラスターに接続する
Azure Kubernetes Service (以下AKS) のクラスターで不正なユーザーアクセスや操作を防止し、セキュリティを強化したいことがあります。今回はAKS のMicrosoft Entra 統合とAzure RBAC を使い、AKS クラスターのユーザー操作を制限する方法について説明します。

実施環境
Azure CLI | 2.68.0 |
---|---|
Kubernetes (AKS) | 1.31.3 |
前提条件
- Azure CLI およびAzure CloudShell の実行環境があること
AKS のMicrosoft Entra 統合とは
AKS のMicrosoft Entra 統合はクラスターの資格情報取得や操作について、Entra ID の認証とAzure RBAC またはKubernetes RBAC を使い管理する機能です。Entra ID のユーザー、グループを利用するため、テナント外のアクセスを制限し、クラスターのアクセス制御も行えます。Entra 統合を使うことで、AKS クラスターへの不正なアクセスや操作を防げます。
AKS クラスターにおけるRBAC
AKS にはKubernetes RBAC とAzure RBAC の2種類があります。Kubernetes RBAC はクラスター内の操作を制限するために使います。YAML 形式でロールを定義し、Entra ID ユーザーまたはグループをロールに紐づけます。例では名前空間・dev に対しEntra ID のグループへのアクセス権限を付与するRBAC を定義しています。
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: dev-user-full-access
namespace: dev
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["batch"]
resources:
- jobs
- cronjobs
verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: dev-user-access
namespace: dev
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: dev-user-full-access
subjects:
- kind: Group
namespace: dev
name: <Entra ID group objectId>
Azure RBAC はAKS クラスターにおけるユーザー操作、資格情報の取得を制御するロールとなります。設定はEntra ID のユーザーやグループ、マネージドID に対してロールを付与します。特定のユーザー、グループ単位でAKS クラスターの操作を制限したい場合に利用します。詳細なクラスター制限を行いたい場合はカスタムロールやKubernetes RBAC の設定が必要です。
Azure RBAC ではAKS クラスターに対して以下の組み込みロールがあります。
Azure Kubernetes Service クラスター管理者ロール | AKS クラスター内でリソースの作成、更新、閲覧などの操作に加え管理者操作ができる。Azure CLI でのクラスターコマンドの実行も可能。 |
---|---|
Azure Kubernetes Service クラスターユーザーロール | AKS クラスター内でリソースの作成、更新、閲覧などの操作が可能。 |
Azure Kubernetes Service クラスターの監視ユーザー | AKS クラスター内でリソースの閲覧や監視が可能。リソースの作成、更新は不可。AKS クラスターでローカルアカウントを有効にする必要がある。 |
今回の構成
今回はAKS クラスターへ接続可能なグループ・ユーザーとAKS クラスターに接続できないグループ・ユーザーの2種類を作成し、AKS クラスターへの接続を確認します。Azure CLI の実行環境はAzure CloudShell を利用するものとします。
Entra ID グループ、ユーザーの作成
拡張機能の追加後、Entra ID 統合とRBAC の検証用グループ、ユーザーを作成します。今回はAKS の権限を持っているグループと持っていないグループの2種類を作成します。domain 名とpassword は任意の値を入力してください。
# AKS権限を付与するグループを作成する
az ad group create --display-name aksoperator --mail-nickname aksoperator
# ユーザーを作成しAKS権限のグループに所属させる
# ユーザー作成時にidが表示されるため、グループ所属時にはそちらを指定する
az ad user create --display-name akstestuser1 --user-principal-name akstestuser1@<domain名> --password <password>
az ad group member add --group aksoperator --member-id "<group id>"
# AKS権限のないグループを作成する
az ad group create --display-name aksnotoperator --mail-nickname aksnotoperator
# AKS権限のないグループにユーザーを作成する
# ユーザー作成時にidが表示されるため、こちらをメモする
az ad user create --display-name akstestuser2 --user-principal-name akstestuser2@<domain名> --password <password>
az ad group member add --group aksnotoperator --member-id "<ユーザーのidの値>"
リソースグループ、AKS クラスターの作成
Entra ID グループ、ユーザー作成後、リソースグループ、AKS クラスターを作成します。AKS 作成時にMicrosoft Entra 統合のオプションを指定することで作成と同時に有効化できます。Azure CLI のコマンドではログインユーザーからテナントID を取得していますが、ユーザーと異なるテナントID を指定したい場合は任意のテナントID を設定してください。
# リソースグループを作成する
az group create --name rg-entraintegtest --location japaneast
# AKSクラスターを作成する
az aks create \
--resource-group rg-entraintegtest \
--name aks-entraintegtest \
--kubernetes-version 1.31.3 \
--enable-aad \
--enable-azure-rbac \
--disable-local-accounts \
--generate-ssh-keys
AKS クラスターへの資格情報取得、操作に必要なロールを付与
AKS クラスター作成後、AKS クラスターへの接続、操作に必要なロールをグループへ付与します。AKS クラスターの資格情報を取得するためには Azure Kubernetes Service Cluster User Role またはAzure Kubernetes Service Cluster Admin Role の付与が必要となります。今回は付与したグループとそうでないグループで動作の確認を行うため、片方のグループにのみロールを付与します。
# Microsoft Entra統合をするグループのIDを取得する
AKS_ALLOW_GROUP_ID=$(az ad group show --group aksoperator --query id --output tsv)
AKS_DENY_GROUP_ID=$(az ad group show --group aksnotoperator --query id --output tsv)
# グループにサブスクリプションの読み取り権限を付与する
# サブスクリプションは付与したいIDを指定する
az role assignment create \
--assignee ${AKS_ALLOW_GROUP_ID} \
--role "Reader" \
--scope "/subscriptions/<subscription id>"
az role assignment create \
--assignee ${AKS_DENY_GROUP_ID} \
--role "Reader" \
--scope "/subscriptions/<subscription id>"
# AKS許可のグループにAKSクラスターの読み取り用ユーザーの権限を付与する
AKS_ID=$(az aks show \
--resource-group rg-entraintegtest \
--name aks-entraintetest \
--query id --output tsv)
az role assignment create \
--assignee ${AKS_ALLOW_GROUP_ID} \
--role "Azure Kubernetes Service Cluster User Role" \
--scope ${AKS_ID}
クライアントGo 資格情報プラグイン・kubelogin
Microsoft Entra 統合ではAzure の認証情報を実装するクライアントGo 資格情報プラグイン・kubelogin を利用しログインします。Kubernetes 1.24 以降のAKS クラスターからMicrosoft Entra ID 統合の認証にkubelogin を利用します。Azure CloudShell ではインストール済みですが、ローカルPC 上でkubelogin を利用する場合はOS に合わせてインストールしてください。
Installation - Azure Kubelogin
kubelogin はMicrosoft Entra OAuth 2.0 を使い認証を行います。kubelogin でサポートされている認証方法は以下となります。
- デバイス コード
- Azure CLI
- Web ブラウザーの対話型
- サービス プリンシパル
- マネージド ID
- ワークロード ID
kubelogin では convert-kubeconfig コマンドで認証情報のファイルを作成するか環境変数・KUBECONFIG でkubeconfig ファイルを指定する方法があります。本記事では convert-kubeconfig でkubeconfig を作成しAzure CLI 認証方法でログインします。
AKS クラスターに接続
Entra ID グループへのロールの付与が完了したら、akstestuser1 でログインしAKS クラスターに接続します。
# AKSクラスターで操作するユーザーでログインする
# 権限ありの場合はakstestuser1、権限無しの場合はakstestuser2でログインする
az login
# AKSクラスターの資格情報を取得する
az aks get-credentials --resource-group rg-entraintegtest --name aks-entraintegtest
# Azure CLIモードのkubeloginでログインする
kubelogin convert-kubeconfig -l azurecli
# AKSクラスターのノード情報を確認する
kubectl get nodes
権限がある場合はAKS クラスターのノード情報が表示されます。
akstestuser1 [ ~ ]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
aks-nodepool1-28148931-vmss000003 Ready <none> 146m v1.31.3
aks-nodepool1-28148931-vmss000004 Ready <none> 146m v1.31.3
aks-nodepool1-28148931-vmss000005 Ready <none> 146m v1.31.3
AKS の資格情報取得、閲覧権限のないユーザーで実行した場合、権限がない旨のエラーで資格情報を取得できないことを確認します。
akstestuser2 [ ~ ]$ az aks get-credentials --resource-group rg-entraintegtest --name aks-entraintetest
(AuthorizationFailed) The client 'akstestuser2@kdkwakaba.com' with object id 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' does not have authorization to perform action 'Microsoft.ContainerService/managedClusters/listClusterUserCredential/action' over scope '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-entraintegtest/providers/Microsoft.ContainerService/managedClusters/aks-entraintegtest' or the scope is invalid. If access was recently granted, please refresh your credentials.
Code: AuthorizationFailed
Message: The client 'akstestuser2@kdkwakaba.com' with object id 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' does not have authorization to perform action 'Microsoft.ContainerService/managedClusters/listClusterUserCredential/action' over scope '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-entraintegtest/providers/Microsoft.ContainerService/managedClusters/aks-entraintetest' or the scope is invalid. If access was recently granted, please refresh your credentials.
Microsoft Entra 統合のAKS クラスターに対し、権限の持っているユーザーでkubelogin コマンドを実行せずにAKS クラスターの情報を確認しようとすると、サインインを求められます。
akstestuser1 [ ~ ]$ kubectl get nodes
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXXX to authenticate.
リソースのクリーンアップ
動作確認後、リソースとEntra ID ユーザー、グループをクリーンアップします。
# リソースグループを削除する
az group delete --name rg-entraintegtest
# Entra IDのユーザー、グループを削除する
az ad user delete --id akstestuser1@<domain名>
az ad user delete --id akstestuser2@<domain名>
az ad group delete --group aksoperator
az ad group delete --group aksnotoperator
まとめ
- AKS クラスターではMicrosoft Entra 統合とRBAC を使うことでクラスターのアクセス制御、セキュリティ対策ができる
- Microsoft Entra 統合でAKS クラスターにログインする場合、kubelogin プラグインを利用する
- AKS クラスターの資格情報を取得するにはグループまたはユーザーに Azure Kubernetes Service Cluster User Role の付与が必要