次の方法で共有


Microsoft Entra ID と Kubernetes RBAC を使用してアクセスを制御する

適用対象: AKS on Azure Local バージョン 23H2

ユーザー認証に Microsoft Entra ID を使用するように Azure Kubernetes Service (AKS) を構成できます。 この構成では、Microsoft Entra 認証トークンを使用して Kubernetes クラスターにサインインします。 認証されると、ユーザーの ID またはグループ メンバーシップに基づいて、名前空間やクラスター リソースへのアクセスを管理するために、組み込みの Kubernetes のロールベースのアクセス制御 (Kubernetes RBAC) を使用できます。

この記事では、AKS の Microsoft Entra グループ メンバーシップに基づいて、Kubernetes クラスターで Kubernetes RBAC を使用してアクセスを制御する方法について説明します。 Microsoft Entra ID でデモ グループとユーザーを作成します。 次に、リソースを作成して表示するための適切なアクセス許可を付与するために、クラスターにロールとロール バインドを作成します。

前提条件

Microsoft Entra ID を使用して Kubernetes RBAC を設定する前に、次の前提条件が必要です。

  • Azure Arc クラスターによって有効になっている AKS。 クラスターを設定する必要がある場合は、Azure ポータルまたは Azure CLI を使用する手順を参照してください。
  • インストールされて構成されている Azure CLI。 CLI またはアップグレードをインストールする必要がある場合は、 Azure CLI のインストールを参照してください。
  • Azure CLI と connectedk8s 拡張機能。 Azure コマンド ライン インターフェイス (Azure CLI) は、Azure リソースを作成および管理するためのコマンド セットです。 Azure CLI があるかどうかを確認するには、コマンド ライン ツールを開き、「 az -v」と入力します。 また、 connectedk8s 拡張機能 をインストールして、Kubernetes クラスターへのチャネルを開きます。 インストールの方法については、「Azure CLI をインストールする方法」をご覧ください。
  • Kubectl。 Kubernetes コマンド ライン ツール ( kubectl を使用すると、Kubernetes クラスターを対象とするコマンドを実行できます。 kubectl がインストールされているかどうかを確認するには、コマンド ライン ツールを開き、「 kubectl version --client」と入力します。 kubectl クライアントのバージョンが 少なくともv1.24.0 以上であることを確認します。 インストール手順については、 kubectlを参照してください。
  • 直接モードまたはプロキシ モードで、指定されたアクセス許可を持つ Kubernetes クラスターにアクセスできます。
    • az aksarc get-credentials コマンドを使用して直接 Kubernetes クラスターにアクセスするには、Microsoft.HybridContainerService/provisionedClusterInstances/listUserKubeconfig/action が必要です。これは、Azure Kubernetes Service Arc Cluster User ロールのアクセス許可に含まれています。
    • az connectedk8s proxy コマンドを使用してプロキシ モードでどこからでも Kubernetes クラスターにアクセスするには、Microsoft.Kubernetes/connectedClusters/listClusterUserCredential/action が必要です。このアクセス許可は、Azure Arc 対応 Kubernetes Cluster User ロールのアクセス許可に含まれています。 一方、オンボード プロセスを実行するエージェントとマシンが、 Azure Arc 対応 Kubernetes ネットワーク要件のネットワーク要件を満たしていることを確認する必要があります。

最初のステップ (省略可能)

メンバーを含む Microsoft Entra グループがまだない場合は、グループを作成し、いくつかのメンバーを追加して、この記事の手順に従うことができます。

Microsoft Entra ID と Kubernetes RBAC の操作を示すために、Kubernetes RBAC と Microsoft Entra ID がクラスター リソースへのアクセスを制御する方法を示すために使用できるアプリケーション開発者向けの Microsoft Entra グループを作成できます。 運用環境では、Microsoft Entra テナント内の既存のユーザーとグループを使用できます。

Microsoft Entra ID でデモ グループを作成する

まず、 az ad group create コマンドを使用して、アプリケーション開発者向けにテナントの Microsoft Entra ID でグループを作成します。 次の例では、Azure テナントにサインインし、 appdev という名前のグループを作成するように求められます。

az login
az ad group create --display-name appdev --mail-nickname appdev

グループにユーザーを追加する

アプリケーション開発者向けに Microsoft Entra ID で作成されたグループの例を使用して、 appdev グループにユーザーを追加します。 このユーザー アカウントを使用して AKS クラスターにサインインし、Kubernetes RBAC 統合をテストします。

az ad group member add コマンドを使用して、前のセクションで作成した appdev グループにユーザーを追加します。 セッションを終了した場合は、 az loginを使用して Azure に再接続します。

$AKSDEV_ID = az ad user create --display-name <name> --password <strongpassword> --user-principal-name <name>@contoso.onmicrosoft.com
az ad group member add --group appdev --member-id $AKSDEV_ID

Microsoft Entra グループの AKS クラスター リソースにカスタム Kubernetes RBAC ロール バインドを作成する

Microsoft Entra グループがクラスターにアクセスできるように AKS クラスターを構成します。 グループとユーザーを追加する場合は、「 Microsoft Entra ID でデモ グループを作成するを参照してください。

  1. az aksarc get-credentials コマンドを使用して、クラスター管理者の資格情報を取得します。

    az aksarc get-credentials --name "$aks_cluster_name" --resource-group "$resource_group_name" --admin
    
  2. kubectl create namespace コマンドを使用して、Kubernetes クラスターに名前空間を作成します。 次の例では、dev という名前空間を作成します。

    kubectl create namespace dev
    

Kubernetes では、Role によって付与するアクセス許可が定義され、RoleBinding によってアクセス許可が目的のユーザーまたはグループに適用されます。 これらの割り当ては、特定の名前空間またはクラスター全体に適用できます。 詳細については、Kubernetes RBAC 認可の使用に関するページを参照してください。

dev 名前空間のロールを作成します。 このロールにより名前空間に完全なアクセス許可が付与されます。 運用環境では、さまざまなユーザーまたはグループに対してより細かいアクセス許可を指定できます。

  1. role-dev-namespace.yaml という名前のファイルを作成し、次の YAML マニフェストをコピーして貼り付けます。

    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: ["*"]
    
  2. kubectl apply コマンドを使用してロールを作成し、YAML マニフェストのファイル名を指定します。

    kubectl apply -f role-dev-namespace.yaml
    
  3. az ad group show コマンドを使って、appdev グループのリソース ID を取得します。 このグループは、次の手順で RoleBinding の件名として設定されます。

    az ad group show --group appdev --query objectId -o tsv
    

    az ad group show コマンドは、groupObjectIdとして使用する値を返します。

    38E5FA30-XXXX-4895-9A00-050712E3673A
    
  4. rolebinding-dev-namespace.yaml という名前のファイルを作成し、次の YAML マニフェストをコピーして貼り付けます。 appdev グループが名前空間アクセスに role-dev-namespace ロールを使用できるようにするロール バインドを確立します。 最後の行の groupObjectId を、az ad group show コマンドから返されたグループ オブジェクト ID に置き換えます。

    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: groupObjectId
    

    ヒント

    1 人のユーザーに対して RoleBinding を作成する場合は、 kind: User を指定し、 groupObjectId を例のユーザー プリンシパル名 (UPN) に置き換えます。

  5. kubectl apply コマンドを使用してRoleBindingを作成し、YAML マニフェストのファイル名を指定します。

    kubectl apply -f rolebinding-dev-namespace.yaml
    
    rolebinding.rbac.authorization.k8s.io/dev-user-access created
    

AKS クラスター リソースに Kubernetes RBAC の組み込みロールを使用する

Kubernetes には、組み込みのユーザー向けロールも用意されています。 次のような組み込みロールがあります。

  • スーパー ユーザー ロール (クラスター管理者)
  • ClusterRoleBinding を使ってクラスター全体に付与されることを目的としたロール
  • RoleBinding を使って特定の名前空間内で付与されることを目的としたロール(管理、編集、表示)

組み込みの Kubernetes RBAC ロールの詳細については、「 Kbernetes RBAC ユーザー向けロールを参照してください。

ユーザー向けロール

既定の ClusterRole 既定の ClusterRoleBinding 説明
cluster-admin system:masters グループ スーパー ユーザーアクセスを許可し、任意のリソースに対して任意のアクションを実行できます。 ClusterRoleBinding で使用する場合、このロールはクラスター内のすべてのリソースとすべての名前空間を完全に制御します。 RoleBinding で使うと、ロール バインドの名前空間内のすべてのリソース (名前空間自体を含む) を完全に制御できます。
admin なし ロール バインディングを使用して名前空間内で付与することを目的とした管理者アクセスを許可します。 ロール バインドで使用する場合は、名前空間内でロールとロール バインドを作成する機能など、名前空間内のほとんどのリソースへの読み取り/書き込みアクセスを許可します。 このロールでは、リソース クォータまたは名前空間自体への書き込みアクセスは許可されません。 このロールでは、Kubernetes v1.22 以降を使用して作成されたクラスター内のエンドポイントへの書き込みアクセスも許可されません。 詳細については、「 エンドポイントのアクセスを書き込む」を参照してください。
edit なし 名前空間内のほとんどのオブジェクトに対する読み取りと書き込みのアクセスが許可されます。 このロールでは、ロールまたはロールのバインドを表示または変更することはできません。 ただし、このロールを使用すると、名前空間内の任意の ServiceAccount としてシークレットにアクセスし、ポッドを実行できるため、名前空間内の任意の ServiceAccount の API アクセス レベルを取得するために使用できます。 このロールでは、Kubernetes v1.22 以降を使用して作成されたクラスター内のエンドポイントへの書き込みアクセスも許可されません。 詳細については、「 エンドポイントのアクセスを書き込む」を参照してください。
ビュー なし 名前空間内のほとんどのオブジェクトを表示するための読み取り専用アクセスが許可されます。 ロールまたはロールのバインドを表示することはできません。 シークレットの内容を読み取ると名前空間の ServiceAccount 資格情報にアクセスできるため、このロールではシークレットの表示は許可されません。これにより、名前空間内の任意の ServiceAccount (特権エスカレーションの形式) としての API アクセスが許可されます。

Microsoft Entra ID で組み込みの Kubernetes RBAC ロールを使用する

Microsoft Entra ID で組み込みの Kubernetes RBAC ロールを使用するには、次の手順に従います。

  1. 組み込みの view Kubernetes RBAC ロールを Microsoft Entra グループに適用します。

    kubectl create clusterrolebinding <name of your cluster role binding> --clusterrole=view --group=<Azure AD group object ID>
    
  2. 組み込みの view Kubernetes RBAC ロールを各 Microsoft Entra ユーザーに適用します。

    kubectl create clusterrolebinding <name of your cluster role binding> --clusterrole=view --user=<Azure AD user object ID>
    

Kubernetes クラスターへのアクセス

直接モードまたはプロキシ モードを使用して、指定されたアクセス許可を持つ Kubernetes クラスターにアクセスできるようになりました。

kubectl (ダイレクト モード) を使用してクラスターにアクセスする

指定したアクセス許可を持つ Kubernetes クラスターにアクセスするには、Kubernetes オペレーターに Microsoft Entra kubeconfig が必要です。この構成は、 az aksarc get-credentials コマンドを使用して取得できます。 このコマンドは、管理者ベースの kubeconfig とユーザーベースの kubeconfig へのアクセスを提供します。 管理者ベースの kubeconfig ファイルにはシークレットが含まれており、定期的に安全に保存およびローテーションする必要があります。 一方、ユーザー ベースの Microsoft Entra ID kubeconfig にはシークレットが含まれていないので、クライアント コンピューターから接続するユーザーに配布できます。

この Azure CLI コマンドを実行するには、 Microsoft.HybridContainerService/provisionedClusterInstances/listUserKubeconfig/action が必要です。これは、 Azure Kubernetes Service Arc クラスター ユーザー ロールのアクセス許可に含まれています。

az aksarc get-credentials -g $resource_group_name -n $aks_cluster_name --file <file-name>

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

kubectl get nodes

クライアント デバイスからクラスターにアクセスする (プロキシ モード)

az connectedk8s proxy コマンドを使用してプロキシ モードで任意の場所から Kubernetes クラスターにアクセスするには、Microsoft.Kubernetes/connectedClusters/listClusterUserCredential/action が必要です。これは、Azure Arc 対応 Kubernetes Cluster User ロールのアクセス許可に含まれています。

別のクライアント デバイスで次の手順を実行します。

  1. Microsoft Entra 認証を使用してサインインします。

  2. クラスターと通信するために必要なクラスター接続 kubeconfig を任意の場所から取得します (クラスターを囲むファイアウォールの外側からでも)。

    az connectedk8s proxy -n $aks_cluster_name -g $resource_group_name
    

    Note

    このコマンドは、プロキシを開き、現在のシェルをブロックします。

  3. 別のシェル セッションで、kubectl を使用してクラスターに要求を送信します。

    kubectl get pods -A
    

これで、default 名前空間の下にあるすべてのポッドの一覧が含まれている、クラスターからの応答が表示されます。

詳細については、「 クライアント デバイスからクラスターにアクセスする」を参照してください。

割り当てられた名前空間の外部でクラスター リソースを作成して表示する

dev名前空間の外部にあるポッドを表示するには、--all-namespaces フラグを指定して kubectl get pods コマンドを使用します。

kubectl get pods --all-namespaces

ユーザーのグループ メンバーシップには、このアクションを許可する Kubernetes ロールがありません。 アクセス許可がないと、次のエラーが生成されます。

Error from server (Forbidden): pods is forbidden: User cannot list resource "pods" in API group "" at the cluster scope

次のステップ