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

適用対象: AKS on Azure Stack HCI 23H2

インフラストラクチャ管理者は、Azure ロールベースのアクセス制御 (Azure RBAC) を使用して、 kubeconfig ファイルにアクセスできるユーザーとアクセス許可を制御できます。 Kubernetes オペレーターは、指定されたアクセス許可に基づいて、 kubectl ツールを使用して Kubernetes クラスターと対話できます。 Azure CLI では、アクセス資格情報と kubeconfig 構成ファイルを取得して、 kubectl を使用して AKS クラスターに接続する簡単な方法が提供されます。

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

この記事では、Microsoft Entra ID と Azure ロールの割り当てで Kubernetes クラスター承認に Azure RBAC を使用する方法について説明します。

概念の概要については、「 Azure RBAC for Kubernetes Authorization for AKS enabled by Azure Arc」を参照してください。

開始する前に

開始する前に、以下の前提条件を確認してください。

  • AKS on Azure Stack HCI 23H2 では現在、Kubernetes クラスターの作成時にのみ Azure RBAC の有効化がサポートされています。 Kubernetes クラスターの作成後に Azure RBAC を有効にすることはできません。

  • 最新バージョンの aksarcconnectedk8s Azure CLI 拡張機能をインストールします。 Azure RBAC を有効にするには、 aksarc 拡張機能バージョン 1.1.1 以降を実行する必要があることに注意してください。 現在のバージョンを調べるには、az --version を実行します。 Azure CLI をインストールまたはアップグレードする必要がある場合は、 Azure CLI のインストールを参照してください。

    az extension add --name aksarc
    az extension add --name connectedk8s
    

    aksarc拡張機能を既にインストールしている場合は、拡張機能を最新バージョンに更新します。

    az extension update --name aksarc
    az extension update --name connectedk8s
    
  • Kubernetes クラスターと対話するには、 kubectlkubelogin をインストールする必要があります。

  • Kubernetes クラスターの作成時に Azure RBAC を有効にするには、次のアクセス許可が必要です。

    • Kubernetes クラスターを作成するには、 Azure Kubernetes Service Arc Contributor ロールが必要です。
    • --enable-azure-rbac パラメーターを使用するには、Microsoft.Authorization/roleAssignments/write アクセス許可にアクセスするための Role Based Access Control Administrator ロールが必要です。 詳細については、Azure の組み込みロールに関するページを参照してください。
    • 新しいロールの割り当てが認可サーバーに伝達されて更新されるまで、"最大で 5 分" かかることがあります。
  • Azure RBAC が有効になったら、直接モードまたはプロキシ モードを使用して、特定のアクセス許可を使用して 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 ネットワーク要件で指定されているネットワーク要件を満たしていることを確認する必要があります。
  • kubectlを使用するには、Azure RBAC または AAD 管理グループを使用してアクセスできます。

    • Azure RBAC で kubectl を使用するには、接続されたクラスター リソースをスコープとする Azure Arc Kubernetes Viewer ロールが必要です。
    • AAD 管理グループで kubectl を使用するには、特定のロールは必要ありませんが、接続されているクラスター リソースの add-admin-group リストのいずれかのグループに含まれている必要があります。

手順 1: Azure RBAC 対応 Kubernetes クラスターを作成する

承認用の Azure RBAC 対応 Kubernetes クラスターと、認証用の Microsoft Entra ID を作成できます。

az aksarc create -n $aks_cluster_name -g $resource_group_name --custom-location $customlocation_ID --vnet-ids $logicnet_Id --generate-ssh-keys --control-plane-ip $controlplaneIP --enable-azure-rbac

数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。

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

Azure Arc で有効になっている AKS には、次の組み込みロールが用意されています。

ロール 説明
Azure Arc Kubernetes ビューアー 名前空間内のほとんどのオブジェクトを表示するための読み取り専用アクセスが許可されます。
ロールまたはロールのバインドを表示することはできません。
シークレットに対するreadアクセス許可により名前空間内のServiceAccount資格情報にアクセスできるため、secretsの表示は許可されません。これにより、名前空間内の任意のServiceAccountとしての API アクセスが可能になります (特権エスカレーションの形式)。
Azure Arc Kubernetes ライター 名前空間内のほとんどのオブジェクトに対する読み取りと書き込みのアクセスが許可されます。
ロールまたはロールバインドの表示または変更を許可しません。
名前空間内の任意のServiceAccountとしてsecretsアクセスし、ポッドを実行できるようにします。そのため、名前空間内の任意のServiceAccountの API アクセス レベルを取得するために使用できます。
Azure Arc Kubernetes 管理者 名前空間内で付与されることが意図された、管理者アクセスが許可されます。
名前空間内でロールおよびロール バインドを作成する能力など、名前空間 (またはクラスター スコープ) 内のほとんどのリソースへの読み取りおよび書き込みアクセスが許可されます。
リソース クォータまたは名前空間自体への書き込みアクセスは許可されません。
Azure Arc Kubernetes クラスター管理者 "スーパー ユーザー" アクセスが任意のリソースに対して任意のアクションを実行できるようにします。
クラスター内およびすべての名前空間内のすべてのリソースを完全に制御できます。

az role assignment create コマンドを使用して、ロールの割り当てを作成できます。

まず、ロールを割り当てるターゲット クラスターの $ARM-ID を取得します。

$ARM_ID = (az connectedk8s show -g "$resource_group_name" -n $aks_cluster_name --query id -o tsv)

次に、 az role assignment create コマンドを使用して、Kubernetes クラスターにロールを割り当てます。 最初の手順の $ARM_ID と、この手順の assignee-object-id を指定する必要があります。 assignee-object-idには、Microsoft Entra ID またはサービス プリンシパル クライアント ID を指定できます。

次の例では、 Azure Arc Kubernetes Viewer ロールを Kubernetes クラスターに割り当てます。

az role assignment create --role "Azure Arc Kubernetes Viewer" --assignee <assignee-object-id> --scope $ARM_ID

この例では、スコープはクラスターの Azure Resource Manager ID です。 Kubernetes クラスターを含むリソース グループにすることもできます。

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

ロールの割り当てで使用する独自のロールの定義を作成することもできます。

次の例は、ユーザーがデプロイの読み取りのみを許可するロール定義を示しています。 詳細については、ロールの定義の作成に使用できるデータ アクションの完全な一覧を参照してください。 カスタム ロールの作成の詳細については、「カスタム ロールを作成する ステップ」を参照してください。

独自のカスタム ロール定義を作成するには、次の JSON オブジェクトを custom-role.json という名前のファイルにコピーします。 <subscription-id> プレースホルダーは、実際のサブスクリプション ID に置き換えます。 カスタム ロールでは、いずれかのデータ アクションを使用し、ロールの割り当てが作成されたスコープ (クラスターまたは名前空間) 内のすべてのデプロイを表示できます。

{
    "Name": "AKS Arc Deployment Reader",
    "Description": "Lets you view all deployments in cluster/namespace.",
    "Actions": [],
    "NotActions": [],
    "DataActions": [
        "Microsoft.Kubernetes/connectedClusters/apps/deployments/read"
    ],
    "NotDataActions": [],
    "assignableScopes": [
        "/subscriptions/<YOUR SUBSCRIPTION ID>"
    ]
}

カスタム ロールとその作成方法については、「 Azure カスタム ロールを参照してください。

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

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

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

az role assignment create --role "AKS Arc Deployment Reader" --assignee <assignee-object-id> --scope $ARM_ID

手順 3: 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 Cluster User ロールのアクセス許可に含まれています。

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 $CLUSTER_NAME -g $RESOURCE_GROUP
    

    Note

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

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

    kubectl get pods -A
    

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

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

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

ロール割り当ての削除

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

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

ロールの定義の削除

az role definition delete -n "AKS Arc Deployment Reader"

次のステップ