Privileged Identity Management (PIM) を使用して Azure Kubernetes Service (AKS) クラスターへのアクセスを制御する
さまざまなチームのアクセス許可を設定する場合は、指定したチームに既定のアクセス許可を設定し、必要に応じて特定のユーザーに特権アクセスを付与することができます。 Microsoft Entra ID で Azure Kubernetes Service (AKS) を使用すると、Just-In-Time (JIT) 要求用に Privileged Identity Management (PIM) を設定できます。
この記事では、次のことについて説明します。
- たとえば、Microsoft Entra グループ メンバーシップに基づいて AKS クラスターにアクセスしたり操作を実行したりする、グループの既定のロールを設定します。
- AKS クラスターにアクセスするための基本的なロールを構成します。
- 自分でロールをアクティブにして、AKS クラスターへの Just-In-Time アクセスを取得します。
- Just-In-Time アクセスの承認要求を承認または拒否するように承認者を設定します。
Note
Microsoft Entra Privileged Identity Management (PIM) には、Premium P2 SKU を必要とする Microsoft Entra ID P2 または Microsoft Entra ID Governance 機能があります。 詳細については、「Microsoft Entra ID ガバナンス ライセンスの基礎」と価格ガイドに関する記事を参照してください。
前提条件
この記事では、Microsoft Entra ID 統合を使用する既存の AKS クラスターがあることを前提としています。 お持ちでない場合は、Microsoft Entra ID 統合を使用して AKS クラスターを作成するに関する記事を参照してください。
Microsoft Entra ID でデモ グループを作成する
このセクションでは、Microsoft Entra ID に 3 つのグループを作成します。
- default: このグループには、AKS クラスター内のリソースへの "読み取り専用" アクセス (
Azure Kubernetes Service RBAC Reader
) があります。 - admin: このグループには、AKS クラスター内のリソースへの "管理者" アクセス (
Azure Kubernetes Service RBAC Admin
) があります。 - approver: このグループには、AKS クラスターへの Just-In-Time アクセスの "要求を承認または拒否する" ためのアクセス許可があります。
別の approver グループを作成する代わりに、default および admin グループのみを使用できます。 ただし、admin グループに承認アクセス許可を含める場合、Just-In-Time アクセスを取得するメンバーは、自分の要求と他のユーザーの要求を承認できます。 運用環境ではこの構成を使用しないことをお勧めしますが、テスト目的には役立ちます。
default グループを作成する
az aks show
コマンドを使用して、AKS クラスターの "リソース ID" を取得します。AKS_ID=$(az aks show \ --resource-group <resource-group-name> \ --name <cluster-name> \ --query id \ --output tsv)
az group show
コマンドを使用して、AKS クラスターの "リソース グループ ID" を取得します。RG_ID=$(az group show \ --resource-group <resource-group-name> \ --query id \ --output tsv)
az ad group create
コマンドを使用して、default グループを作成します。DEFAULT_ID=$(az ad group create \ --display-name default \ --mail-nickname default \ --query id \ --output tsv)
az role assignment create
コマンドを使って、default グループに Azure ロールの割り当てを作成します。特定の要件に応じて、default グループに割り当てることができる "3 つ" のロールがあります。
Azure Kubernetes Service RBAC Reader
: AKS クラスターのスコープで割り当てられ、クラスター内のほとんどのリソースへの基本的な読み取り専用アクセスが提供されます。Reader
: リソース グループのスコープで割り当てられ、リソース グループ内のリソースへの読み取り専用アクセスが提供されます。Azure Kubernetes Service Cluster User Role
: AKS クラスターのスコープで割り当てられ、AKS クラスターの kubeconfig コンテキストを取得するためのアクセスが付与されます。
# Assign the Azure Kubernetes Service RBAC Reader role to the default group az role assignment create \ --role "Azure Kubernetes Service RBAC Reader" \ --assignee $DEFAULT_ID \ --scope $AKS_ID # Assign the Reader role to the default group az role assignment create \ --role "Reader" \ --assignee $DEFAULT_ID \ --scope $RG_ID # Assign the Azure Kubernetes Service Cluster User Role to the default group az role assignment create \ --role "Azure Kubernetes Service Cluster User Role" \ --assignee $DEFAULT_ID \ --scope $AKS_ID
admin グループを作成する
az ad group create
コマンドを使用して、admin グループを作成します。ADMIN_ID=$(az ad group create \ --display-name admin \ --mail-nickname admin \ --query id \ --output tsv)
az role assignment create
コマンドを使用して、Azure Kubernetes Service RBAC Admin
ロールを admin グループに割り当てます。az role assignment create \ --role "Azure Kubernetes Service RBAC Admin" \ --assignee $ADMIN_ID \ --scope $AKS_ID
Note
手動スケーリングなど、admin グループのユーザーにノード プール設定の変更を許可する場合は、次のコマンドを使用して、クラスター ノード プールに Contributor
ロールの割り当てを作成する必要があります。
az role assignment create \
--role "Contributor" \
--assignee $ADMIN_ID \
--scope $AKS_ID/nodepools/<node-pool-name>
これにより、AKS リソースのスケールインまたはアウトを行うためのアクセス許可のみが付与されることに注意してください。 仮想マシン スケール セット リソースでのスケールインまたはアウトを許可する場合は、仮想マシン スケール セット レベルで割り当てを作成する必要があります。
approver グループを作成する
az ad group create
コマンドを使用して、approver グループを作成します。APPROVER_ID=$(az ad group create \ --display-name approver \ --mail-nickname approver \ --query id \ --output tsv)
Microsoft Entra ID でデモ ユーザーを作成する
このセクションでは、既定のロールのみを持つ通常のユーザーと、"通常" のユーザーからの Just-In-Time 要求を承認または拒否できる特権ユーザーの 2 人のユーザーを Microsoft Entra ID に作成します。
az ad user create
コマンドを使用して、通常のユーザーを作成します。DOMAIN=contoso.com PASSWORD=Password1 NUSER_ID=$(az ad user create \ --display-name n01 \ --password ${PASSWORD} \ --user-principal-name n01@${DOMAIN} \ --query id \ --output tsv)
az ad group member add
コマンドを使用して、通常のユーザーを default グループに追加します。az ad group member add \ --group $DEFAULT_ID \ --member-id $NUSER_ID
az ad user create
コマンドを使用して、特権ユーザーを作成します。PUSER_ID=$(az ad user create \ --display-name p01 \ --password ${PASSWORD} \ --user-principal-name p01@${DOMAIN} \ --query id \ --output tsv)
az ad group member add
コマンドを使用して、特権ユーザーを approver グループに追加します。az ad group member add \ --group $APPROVER_ID \ --member-id $PUSER_ID
admin グループの Privileged Identity Management (PIM) を有効にする
- Azure portal のホーム ページで、[Microsoft Entra ID] を選択します。
- サービス メニューの [管理] で [グループ] を選択し、次に admin グループを選択します。
- サービス メニューの [アクティビティ] で [Privileged Identity Management] を選択し、次に [このグループの PIM を有効にする] を選択します。
admin グループの承認者を設定する
Azure portal のホーム ページで、[Privileged Identity Management] を検索して選択します。
サービス メニューの [管理] で [グループ] を選択し、次に admin グループを選択します。
サービス メニューの [管理] で [割り当て]>[割り当ての追加] を選択します。
[割り当ての追加] ページの [メンバーシップ] タブで、選択したロールとして [メンバー] を選択し、選択したメンバーとして [既定] を選択し、次に [次へ] を選択します。
[設定] タブで、割り当ての種類として [資格あり] を選択し、次に [割り当てる] を選択します。
サービス メニューの [管理] で [設定]>[メンバー]>[編集] を選択します。
[ロール設定の編集 - メンバー] ページで、[アクティブにするには承認が必要です] チェック ボックスをオンにし、選択した承認者として approver グループを追加します。
Note
[アクティブにするには承認が必要です] チェック ボックスをオンにしない場合、default グループのユーザーは自分でロールをアクティブにして、承認なしで AKS クラスターへの Just-In-Time アクセスを取得できます。 approver グループのユーザーは、グループのメンバーである必要があります。 ユーザーを [所有者] として設定した場合でも、グループ所有者にはロールの割り当てではなく、グループに対する管理者権限しかないため、Just-In-Time 要求を確認することはできません。 競合することなく、同じグループのメンバーと所有者としてユーザーを設定できます。
その他の必要な変更を行ってから、[更新] を選択します。
PIM 構成の詳細については、グループの PIM の構成に関する記事を参照してください。
既定のロールを使用してクラスター リソースを操作する
次に、default グループのメンバーである通常のユーザーを使用して、AKS クラスターへのアクセスを試みることができます。
az login
コマンドを使用して、通常のユーザーとして Azure portal にログインします。az login --username n01@$DOMAIN --password ${PASSWORD}
az aks get-credentials
コマンドを使用して、クラスターにアクセスするためのユーザー資格情報を取得します。az aks get-credentials --resource-group <resource-group-name> --name <cluster-name>
kubectl get
コマンドを使用して、クラスター ポッドにアクセスしてみてください。kubectl get pods --namespace kube-system
出力は次の出力例のようになります。これは、
kube-system
名前空間のポッドを示しています。NAME READY STATUS RESTARTS AGE azure-ip-masq-agent-2rdd9 1/1 Running 0 30h azure-policy-767c9d9d9d-886rf 1/1 Running 0 31h cloud-node-manager-92t6h 1/1 Running 0 30h coredns-789789675-b2dhg 1/1 Running 0 31h coredns-autoscaler-77bbc46446-pgt92 1/1 Running 0 31h csi-azuredisk-node-lnzrf 3/3 Running 0 30h csi-azurefile-node-lhbxr 3/3 Running 0 31h konnectivity-agent-7645d94b-9wqct 1/1 Running 0 30h kube-proxy-lkx4w 1/1 Running 0 31h metrics-server-5955767688-lpbjb 2/2 Running 0 30h
kubectl get
コマンドを使用して、クラスター シークレットにアクセスしてみてください。kubectl get secrets --namespace kube-system
出力は次の出力例のようになります。これは、ユーザーがシークレットにアクセスするためのアクセス許可を持っていないため、エラー メッセージを示しています。
Error from server (Forbidden): secrets is forbidden: User "[email protected]" cannot list resource "secrets" in API group "" in the namespace "kube-system": User does not have access to the resource in Azure. Update role assignment to allow access.
Azure Kubernetes Service RBAC Reader
ロールにはシークレットにアクセスするためのアクセス許可がないため、このエラーが予想されます。
AKS クラスターへの Just-In-Time アクセスを要求する
今回は、「Privileged Identity Management でグループのメンバーシップまたは所有権をアクティブにする」の手順を使用して、Just-In-Time アクセスを一時的な Azure Kubernetes Service RBAC Admin
として要求できます。 承認者として要求を承認または拒否する方法については、「グループのメンバーと所有者のアクティブ化要求を承認する」を参照してください。
管理者ロールを使用してクラスター リソースを操作する
Azure Kubernetes Service RBAC Admin
ロールを一時的に追加した後、管理者のアクセス許可を必要とするクラスター リソースにアクセスできます。
次の
kubelogin
コマンドを使用して、既存の保存されているトークンを削除します。kubelogin remove-tokens
Note
アクセス許可がないためにエラーが発生した場合は、ログインして、
az login
コマンドを使用してアクセス許可を更新します。kubectl get secrets
コマンドを使用して、クラスター シークレットにもう一度アクセスしてみてください。kubectl get secrets --namespace kube-system
出力は、
kube-system
名前空間のシークレットを示す次の出力例のようになります。NAME TYPE DATA AGE bootstrap-token-sw3rck bootstrap.kubernetes.io/token 4 35h konnectivity-certs Opaque 3 35h
ユーザーは
Azure Kubernetes Service RBAC Admin
ロールを持っているため、シークレットにアクセスできるようになりました。
トークンの有効期間に関する考慮事項
トークンの有効期間の設計により、kubectl
や kubelogin
などの CLI ツールを使用するユーザーにロールを付与する場合、アクティブ化期間は厳密には "60 分" 未満にすることはできません。 期間が 60 分未満に設定されている場合でも、実際の有効期間は 60 から 75 分のままになります。
kubelogin
が Microsoft ID プラットフォームからトークンを取得しようとすると、access_token
と refresh_token
が今後の使用のために返されます。 access_token
は API に要求を行い、refresh_token
は、現在の access_token
の有効期限が切れたときに新しいものを取得するために使用されます。 生成された access_token
は取り消すことはできませんが、refresh_token
は取り消すことができます。 refresh_token
が取り消された場合、ユーザーは新しい refresh_token
を取得するために再認証する必要があります。 refresh_token
を手動で取り消すには、Revoke-AzureADUserAllRefreshToken
を使用できます。
次のステップ
詳細については、次の記事を参照してください。
Azure Kubernetes Service