Share via


Azure Kubernetes Service (AKS) 的存取與身分識別選項

您可以透過各種方式驗證、授權、保護及控制 Kubernetes 叢集的存取:

  • 使用 Kubernetes 角色型存取控制 (Kubernetes RBAC),您可以只將所需的資源存取權授與使用者、群組和服務帳戶。
  • 使用 Azure Kubernetes Service (AKS),您可以使用 Microsoft Entra ID 和 Azure RBAC 進一步增強安全性和許可權結構。

Kubernetes RBAC 和 AKS 可協助您保護叢集存取,並只提供開發人員和操作員所需的最低許可權。

本文介紹可協助您在 AKS 中驗證和指派許可權的核心概念。

Kubernetes RBAC

Kubernetes RBAC 提供用戶動作的細微篩選。 使用此控制機制:

  • 您可以指派使用者或使用者群組許可權,以建立和修改資源,或檢視執行中應用程式工作負載的記錄。
  • 您可以將權限範圍設定為單一命名空間或整個 AKS 叢集。
  • 您可以建立 角色 來定義許可權,然後將這些角色指派給具有 角色系結的使用者。

如需詳細資訊,請參閱 使用 Kubernetes RBAC 授權

Role 和 ClusterRole

角色

使用 Kubernetes RBAC 將許可權指派給使用者之前,您必須先將使用者權力 定義為角色。 使用角色授與命名空間內的許可權。

注意

Kubernetes 角色 授與 許可權;它們不會 拒絕 許可權。

若要授與整個叢集的許可權,或授與指定命名空間以外的叢集資源,您可以改用 ClusterRoles

ClusterRoles

ClusterRole 會將許可權授與並套用到整個叢集的資源,而不是特定的命名空間。

RoleBinding 和 ClusterRoleBinding

定義角色以授與資源許可權之後,您會使用 RoleBinding 來指派這些 Kubernetes RBAC 許可權。 如果您的 AKS 叢集 與 Microsoft Entra 識別符整合,RoleBindings 會將許可權授與 Microsoft Entra 使用者,以在叢集內執行動作。 瞭解如何使用 Kubernetes 角色型訪問控制和 Microsoft Entra 身分識別來控制叢集資源的存取。

RoleBindings

使用 RoleBindings 將角色指派給指定命名空間的使用者。 使用 RoleBindings 時,您可以以邏輯方式隔離單一 AKS 叢集,只讓使用者存取其指派命名空間中的應用程式資源。

若要跨整個叢集系結角色,或系結至指定命名空間外部的叢集資源,請改用 ClusterRoleBindings

ClusterRoleBinding

使用 ClusterRoleBinding,您可以將角色系結至使用者,並套用至整個叢集的資源,而不是特定的命名空間。 此方法可讓您將 AKS 叢集中所有資源的存取權授與管理員,或支援工程師存取這些資源。

注意

Microsoft/AKS 會在內建 Kubernetes 角色 aks-service 和內建角色系結 aks-service-rolebinding下,以使用者同意來執行任何叢集動作。

此角色可讓 AKS 針對叢集問題進行疑難解答和診斷,但無法修改許可權或建立角色或角色系結,或其他高許可權動作。 只有在具有 Just-In-Time (JIT) 存取權的作用中支援票證下,才能啟用角色存取。 深入瞭解 AKS 支持原則

Kubernetes 服務帳戶

服務帳戶 是 Kubernetes 中的主要用戶類型之一。 Kubernetes API 會保存及管理服務帳戶。 服務帳戶認證會儲存為 Kubernetes 秘密,讓授權的 Pod 用來與 API Server 通訊。 大部分的 API 要求會為服務帳戶或一般使用者帳戶提供驗證權杖。

一般使用者帳戶會允許系統管理人員或開發人員適用的傳統存取,而不只是允許服務和程序的存取。 雖然 Kubernetes 不提供身分識別管理解決方案來儲存一般使用者帳戶和密碼,但您可以將外部身分識別解決方案整合到 Kubernetes 中。 針對 AKS 叢集,此整合式身分識別解決方案為 Microsoft Entra ID。

如需 Kubernetes 中身分識別選項的詳細資訊,請參閱 Kubernetes 驗證

Azure 角色型存取控制

Azure 角色型訪問控制 (RBAC) 是以 Azure Resource Manager 為基礎的授權系統,可提供更細緻的 Azure 資源存取管理。

RBAC 系統 描述
Kubernetes RBAC 設計用來處理 AKS 叢集中的 Kubernetes 資源。
Azure RBAC 設計用來處理 Azure 訂用帳戶內的資源。

透過 Azure RBAC,您可以建立角色定義來概述要套用的權限。 然後,您可以透過特定範圍的角色指派,指派使用者或群組此角色定義。 範圍可以是個別資源、資源群組或跨訂用帳戶。

如需詳細資訊,請參閱 什麼是 Azure 角色型訪問控制 (Azure RBAC)?

完全操作 AKS 叢集需要兩個層級的存取:

Azure RBAC 以授權存取 AKS 資源

透過 Azure RBAC,您可以為使用者提供(或身分識別)跨一或多個訂用帳戶細微存取 AKS 資源。 例如,您可以使用 Azure Kubernetes 服務參與者角色 來調整和升級叢集。 同時,具有 Azure Kubernetes Service Cluster 管理員 角色的另一位使用者只具有提取 管理員 kubeconfig的許可權。

使用 Azure RBAC 來定義 AKS 中 Kubernetes 組態檔的存取權。

適用於 Kubernetes 授權的 Azure RBAC

透過 Azure RBAC 整合,AKS 將使用 Kubernetes 授權 Webhook 伺服器,以便您可以使用 Azure 角色定義和角色指派來管理 Microsoft Entra 整合式 Kubernetes 叢集資源許可權和指派。

Azure RBAC for Kubernetes authorization flow

如上圖所示,使用 Azure RBAC 整合時,對 Kubernetes API 的所有要求都會遵循相同的驗證流程,如 Microsoft Entra 整合一節中所述

如果提出要求的身分識別存在於 Microsoft Entra ID 中,Azure 會與 Kubernetes RBAC 合作以授權要求。 如果身分識別存在於 Microsoft Entra ID 外部(亦即 Kubernetes 服務帳戶),授權將會延遲至一般的 Kubernetes RBAC。

在此案例中,您會使用 Azure RBAC 機制和 API 來指派用戶內建角色或建立自定義角色,就像使用 Kubernetes 角色一樣。

透過這項功能,您不僅授與使用者跨訂用帳戶的 AKS 資源許可權,還可以針對控制 Kubernetes API 存取的每個叢集內設定角色和許可權。 例如,您可以在訂用帳戶範圍上授與 Azure Kubernetes Service RBAC Reader 角色。 角色收件者將能夠列出並取得所有叢集的所有 Kubernetes 物件,而不需修改它們。

重要

使用此功能之前,您必須啟用 Azure RBAC for Kubernetes 授權。 如需詳細資訊和逐步指引,請遵循使用 適用於 Kubernetes 授權 的 Azure RBAC 操作指南。

內建角色

AKS 提供下列四個內建角色。 它們與 Kubernetes 內建角色 類似,但有一些差異,例如支援 CRD。 請參閱每個 Azure 內建角色所允許的動作完整清單。

角色 描述
Azure Kubernetes Service RBAC 讀取者 允許唯讀存取權來查看命名空間中的大部分物件。
不允許檢視角色或角色系結。
不允許檢視 SecretsSecrets讀取內容可存取ServiceAccount命名空間中的認證,以允許 API 存取命名空間ServiceAccount中的任何認證(許可權提升形式)。
Azure Kubernetes Service RBAC 寫入者 允許對命名空間中大部分物件的讀取/寫入存取。
不允許檢視或修改角色或角色系結。
允許存取 Secrets 和執行 Pod 做為命名空間中的任何 ServiceAccount,因此可用來取得命名空間中任何 ServiceAccount 的 API 存取層級。
Azure Kubernetes Service RBAC 管理員 允許系統管理員存取權,其目的是在命名空間內授與。
允許讀取/寫入命名空間(或叢集範圍)中的大部分資源,包括能夠在命名空間內建立角色和角色系結。
不允許對資源配額或命名空間本身的寫入存取權。
Azure Kubernetes Service RBAC 叢集管理員 可讓超級使用者存取在任何資源上執行任何動作。
提供叢集中和所有命名空間中每個資源的完整控制權。

Microsoft Entra 整合

使用 Microsoft Entra 整合增強 AKS 叢集安全性。 Microsoft Entra ID 是以數十年的企業身分識別管理為基礎,是多租用戶、雲端式目錄和身分識別管理服務,結合了核心目錄服務、應用程式存取管理和身分識別保護。 透過 Microsoft Entra ID,您可以將內部部署身分識別整合到 AKS 叢集,以提供單一來源的帳戶管理和安全性。

Microsoft Entra integration with AKS clusters

透過與 Microsoft Entra 整合的 AKS 叢集,您可以允許使用者或群組存取命名空間內或叢集上的 Kube 資源。

  1. 若要取得組 kubectl 態內容,用戶會 執行 az aks get-credentials 命令。
  2. 當使用者與 AKS 叢集 kubectl互動時,系統會提示使用者使用其 Microsoft Entra 認證登入。

此方法提供單一來源,用於使用者帳戶管理和密碼認證。 使用者只能存取叢集管理員所定義的資源。

Microsoft Entra 驗證會提供給具有 OpenID 連線 的 AKS 叢集。 OpenID 連線 是以 OAuth 2.0 通訊協定為基礎的身分識別層。 如需 OpenID 連線 的詳細資訊,請參閱 OpenID 連線 檔。 從 Kubernetes 叢集內部, Webhook 令牌驗證 可用來驗證驗證令牌。 Webhook 令牌驗證已設定及管理為 AKS 叢集的一部分。

Webhook 和 API 伺服器

Webhook and API server authentication flow

如上圖所示,API 伺服器會呼叫 AKS Webhook 伺服器,並執行下列步驟:

  1. kubectl 會使用 Microsoft Entra 用戶端應用程式,使用 OAuth 2.0 裝置授權授與流程登入使用者。
  2. Microsoft Entra ID 提供access_token、id_token和refresh_token。
  3. 使用者向 提出要求 kubectl ,並使用 來自 kubeconfig的access_token。
  4. kubectl 會將access_token傳送至 API Server。
  5. API 伺服器已設定為使用驗證 WebHook 伺服器來執行驗證。
  6. 驗證 Webhook 伺服器會藉由檢查 Microsoft Entra 公開簽署密鑰來確認 JSON Web 令牌簽章是否有效。
  7. 伺服器應用程式會使用使用者提供的認證,從 MS Graph API 查詢登入使用者的群組成員資格。
  8. 回應會傳送至 API Server,其中包含用戶主體名稱 (UPN) 宣告存取令牌,以及根據物件標識碼的使用者群組成員資格等用戶資訊。
  9. API 會根據 Kubernetes 角色/RoleBinding 來執行授權決策。
  10. 授權之後,API 伺服器會傳回對 kubectl的回應。
  11. kubectl 提供意見反應給使用者。

瞭解如何將 AKS 與 Microsoft Entra 識別碼與 AKS 管理的 Microsoft Entra 整合操作指南整合。

AKS 服務權限

建立叢集時,AKS 會產生或修改它所需的資源(例如 VM 和 NIC),以代表使用者建立和執行叢集。 此身分識別與叢集建立期間建立的叢集身分識別許可權不同。

建立和操作叢集許可權的身分識別

建立和操作叢集的身分識別需要下列許可權。

權限 原因
Microsoft.Compute/diskEncryptionSets/read 讀取磁碟加密集標識碼的必要專案。
Microsoft.Compute/proximityPlacementGroups/write 更新鄰近放置群組的必要專案。
Microsoft.Network/applicationGateways/read
Microsoft.Network/applicationGateways/write
Microsoft.Network/virtualNetworks/subnets/join/action
設定應用程式閘道並加入子網的必要專案。
Microsoft.Network/virtualNetworks/subnets/join/action 使用自定義 VNET 時,必須設定子網的網路安全組。
Microsoft.Network/publicIPAddresses/join/action
Microsoft.Network/publicIPPrefixes/join/action
在標準 Load Balancer 上設定輸出公用 IP 的必要專案。
Microsoft.OperationalInsights/workspaces/sharedkeys/read
Microsoft.OperationalInsights/workspaces/read
Microsoft.OperationsManagement/solutions/write
Microsoft.OperationsManagement/solutions/read
Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
建立及更新適用於容器的Log Analytics工作區和 Azure 監視的必要專案。
Microsoft.Network/virtualNetworks/joinLoadBalancer/action 設定 IP 型 Load Balancer 後端集區的必要專案。

AKS 叢集身分識別許可權

AKS 叢集身分識別會使用下列許可權,此身分識別會建立及與 AKS 叢集建立關聯。 每個權限都用於下列原因:

權限 原因
Microsoft.ContainerService/managedClusters/*
建立使用者及操作叢集的必要專案
Microsoft.Network/loadBalancers/delete
Microsoft.Network/loadBalancers/read
Microsoft.Network/loadBalancers/write
必須設定LoadBalancer服務的負載平衡器。
Microsoft.Network/publicIPAddresses/delete
Microsoft.Network/publicIPAddresses/read
Microsoft.Network/publicIPAddresses/write
需要尋找及設定LoadBalancer服務的公用IP。
Microsoft.Network/publicIPAddresses/join/action 設定 LoadBalancer 服務的公用 IP 所需的專案。
Microsoft.Network/networkSecurityGroups/read
Microsoft.Network/networkSecurityGroups/write
建立或刪除 LoadBalancer 服務的安全性規則的必要專案。
Microsoft.Compute/disks/delete
Microsoft.Compute/disks/read
Microsoft.Compute/disks/write
Microsoft.Compute/locations/DiskOperations/read
設定 AzureDisks 的必要專案。
Microsoft.Storage/storageAccounts/delete
Microsoft.Storage/storageAccounts/listKeys/action
Microsoft.Storage/storageAccounts/read
Microsoft.Storage/storageAccounts/write
Microsoft.Storage/operations/read
設定 AzureFile 或 AzureDisk 記憶體帳戶的必要專案。
Microsoft.Network/routeTables/read
Microsoft.Network/routeTables/routes/delete
Microsoft.Network/routeTables/routes/read
Microsoft.Network/routeTables/routes/write
Microsoft.Network/routeTables/write
設定節點路由表和路由的必要專案。
Microsoft.Compute/virtualMachines/read 需要尋找 VMAS 中虛擬機器的資訊,例如區域、容錯網域、大小和數據磁碟。
Microsoft.Compute/virtualMachines/write 將 AzureDisks 連結至 VMAS 中虛擬機的必要專案。
Microsoft.Compute/virtualMachineScaleSets/read
Microsoft.Compute/virtualMachineScaleSets/virtualMachines/read
Microsoft.Compute/virtualMachineScaleSets/virtualmachines/instanceView/read
需要尋找虛擬機擴展集中虛擬機的資訊,例如區域、容錯網域、大小和數據磁碟。
Microsoft.Network/networkInterfaces/write 將 VMAS 中的虛擬機新增至負載平衡器後端位址池的必要專案。
Microsoft.Compute/virtualMachineScaleSets/write 需要將虛擬機擴展集新增至負載平衡器後端位址池,以及相應放大虛擬機擴展集中的節點。
Microsoft.Compute/virtualMachineScaleSets/delete 若要將虛擬機擴展集刪除至負載平衡器後端位址池,以及相應減少虛擬機擴展集中的節點,則為必要專案。
Microsoft.Compute/virtualMachineScaleSets/virtualmachines/write 附加 AzureDisks 並將虛擬機從虛擬機擴展集新增至負載平衡器的必要專案。
Microsoft.Network/networkInterfaces/read 搜尋 VMAS 中虛擬機的內部 IP 和負載平衡器後端位址池的必要專案。
Microsoft.Compute/virtualMachineScaleSets/virtualMachines/networkInterfaces/read 需要搜尋虛擬機擴展集中虛擬機的內部IP和負載平衡器後端位址池。
Microsoft.Compute/virtualMachineScaleSets/virtualMachines/networkInterfaces/ipconfigurations/publicipaddresses/read 在虛擬機擴展集中尋找虛擬機的公用IP的必要專案。
Microsoft.Network/virtualNetworks/read
Microsoft.Network/virtualNetworks/subnets/read
需要確認子網是否存在於另一個資源群組中的內部負載平衡器。
Microsoft.Compute/snapshots/delete
Microsoft.Compute/snapshots/read
Microsoft.Compute/snapshots/write
設定 AzureDisk 快照集的必要專案。
Microsoft.Compute/locations/vmSizes/read
Microsoft.Compute/locations/operations/read
尋找尋找 AzureDisk 磁碟區限制所需的虛擬機大小。

其他叢集身分識別許可權

建立具有特定屬性的叢集時,您需要下列叢集身分識別的額外許可權。 由於這些許可權不會自動指派,因此您必須在建立叢集身分識別之後將其新增至叢集身分識別。

權限 原因
Microsoft.Network/networkSecurityGroups/write
Microsoft.Network/networkSecurityGroups/read
如果在另一個資源群組中使用網路安全組,則為必要專案。 必須設定LoadBalancer服務的安全性規則。
Microsoft.Network/virtualNetworks/subnets/read
Microsoft.Network/virtualNetworks/subnets/join/action
如果在另一個資源群組中使用子網,例如自定義 VNET,則為必要專案。
Microsoft.Network/routeTables/routes/read
Microsoft.Network/routeTables/routes/write
如果在另一個資源群組中使用與路由表相關聯的子網,例如具有自定義路由表的自定義 VNET,則為必要。 需要確認子網是否已存在於其他資源群組中的子網。
Microsoft.Network/virtualNetworks/subnets/read 如果在另一個資源群組中使用內部負載平衡器,則為必要專案。 需要確認資源群組中內部負載平衡器是否已存在子網。
Microsoft.Network/privatednszones/* 如果在另一個資源群組中使用私人 DNS 區域,例如自定義 privateDNSZone,則為必要專案。

AKS 節點存取

AKS 預設不需要節點存取。 如果利用特定元件,則節點需要下列存取權。

存取 原因
kubelet 必須授與 MSI 對 ACR 的存取權。
http app routing 「隨機名稱」的寫入許可權所需。aksapp.io。
container insights 必須授與Log Analytics工作區的許可權。

摘要

檢視數據表,以取得使用者如何在啟用 Microsoft Entra 整合時向 Kubernetes 進行驗證的快速摘要。 在所有情況下,使用者的命令順序為:

  1. 執行 az login 以向 Azure 進行驗證。

  2. 執行 az aks get-credentials 以將叢集的認證下載到 .kube/config

  3. 執行 kubectl 命令。

    • 第一個命令可能會觸發瀏覽器型驗證來向叢集進行驗證,如下表所述。

在 Azure 入口網站 中,您可以找到:

  • 二個數據行中參考的角色授與 (Azure RBAC 角色授與)會顯示在 [存取控制] 索引標籤上
  • [組態] 索引標籤上會顯示 [叢集 管理員 Microsoft Entra 群組。
    • 在 Azure CLI 中也找到參數名稱 --aad-admin-group-object-ids
描述 需要角色授與 叢集管理員 Microsoft Entra group(s) 使用時機
使用客戶端憑證的舊版系統管理員登入 Azure Kubernetes Service 管理員 角色。 此角色允許az aks get-credentials與 旗標搭配--admin使用,此旗標會將舊版(非 Microsoft Entra) 叢集管理員憑證下載至使用者的 .kube/config。 這是「Azure Kubernetes 管理員 角色」的唯一用途。 n/a 如果您永久封鎖,無法存取具有叢集存取權的有效 Microsoft Entra 群組。
Microsoft Entra ID with manual (Cluster)RoleBindings Azure Kubernetes Service 叢集使用者角色。 「使用者」角色允許 az aks get-credentials 在沒有旗標的情況下 --admin 使用。 (這是「Azure Kubernetes Service 叢集使用者角色」的唯一用途。在啟用 Microsoft Entra ID 的叢集上,結果是將空白項目下載.kube/config,這會在第一次使用 kubectl時觸發瀏覽器型驗證。 使用者不在上述任何群組中。 因為使用者不在任何叢集 管理員 群組中,因此其許可權完全由叢集系統管理員所設定的任何 RoleBindings 或 ClusterRoleBindings 控制。 (叢集)RoleBindings 將 Microsoft Entra 使用者或 Microsoft Entra 群組 提名為其 subjects。 如果未設定這類系結,使用者將無法執行任何 kubectl 命令。 如果您想要更細緻的訪問控制,而且您不使用適用於 Kubernetes 授權的 Azure RBAC。 請注意,設定系結的用戶必須以下表所列的其他方法之一登入。
依系統管理員群組成員的 Microsoft Entra 識別碼 同上 使用者是此處所列其中一個群組的成員。 AKS 會自動產生 ClusterRoleBinding,將所有列出的群組系結至 cluster-admin Kubernetes 角色。 因此,這些群組中的使用者可以以 身分cluster-admin執行所有kubectl命令。 如果您想要方便授與使用者完整的系統管理員許可權,且 不使用 Azure RBAC 進行 Kubernetes 授權。
適用於 Kubernetes 授權的 Azure RBAC 的 Microsoft Entra 識別碼 兩個角色:
首先, Azure Kubernetes Service 叢集使用者角色 (如上所述)。
其次,「Azure Kubernetes Service RBAC...」之一以上所列的角色,或您自己的自定義替代方案。
啟用適用於 Kubernetes 授權的 Azure RBAC 時,[組態] 索引卷標上的 [系統管理員角色] 字段無關緊要。 您正在使用 Azure RBAC 進行 Kubernetes 授權。 這種方法可讓您更細緻地控制,而不需要設定 RoleBindings 或 ClusterRoleBindings。

下一步

如需核心 Kubernetes 和 AKS 概念的詳細資訊,請參閱下列文章: