Young Leaves

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 の付与が必要

参考資料