分享方式:


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 ID 整合,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 伺服器進行通訊。 大部分的 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 Service 參與者角色調整和升級叢集。 同時,擁有 Azure Kubernetes Service 叢集管理員角色的另一位使用者只有提取管理員 kubeconfig 的權限。

使用 Azure RBAC 定義 AKS 中 Kubernetes 設定檔的存取權限

適用於 Kube 的 Azure RBAC 授權

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

適用於 Kubernetes 的 Azure RBAC 授權流程

如上圖所示,使用 Azure RBAC 整合時,Kube API 的全部要求都會遵循相同的驗證流程,如「Microsoft Entra 整合」一節所述。

如果提出要求的身分識別存在於 Microsoft Entra ID 中,Azure 會與 Kubernetes RBAC 小組來授權要求。 如果身分識別存在於 Microsoft Entra ID (亦即 Kube 服務帳戶) 之外,授權會延遲至一般的 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 讀取者 允許唯讀存取來查看命名空間中的大部分物件。
不允許檢視角色或角色繫結。
不允許檢視 Secrets。 讀取 Secrets 內容可讓您存取命名空間中的 ServiceAccount 認證,讓 API 存取如同命名空間中的任何 ServiceAccount (一種權限提升形式)。
Azure Kubernetes Service RBAC 寫入者 允許命名空間中大部分物件的讀取/寫入存取權。
不允許檢視或修改角色或角色繫結。
允許以命名空間中的任何 ServiceAccount 身分存取 Secrets 和執行 Pod,因此可用來取得命名空間中任何 ServiceAccount 的 API 存取層級。
Azure Kubernetes Service RBAC 管理員 允許管理員存取權,其用途是在命名空間內授與。
允許命名空間 (或叢集範圍) 中大部分的資源的讀取/寫入存取權 ,包括可在命名空間內建立角色和角色繫結。
不允許對資源配額或命名空間本身的寫入權限。
Azure Kubernetes Service RBAC 叢集管理員 允許進階使用者在任何資源上執行的存取權。。
提供叢集中和全部命名空間中每個資源的完整控制權。

Microsoft Entra 整合

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

Microsoft Entra 與 AKS 叢集整合

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

  1. 若要取得 kubectl 設定內容,使用者可執行 az aks get-credentials 命令。
  2. 使用者之後透過 kubectl 與 AKS 叢集互動時,系統會提示他們使用其 Microsoft Entra 認證登入。

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

透過 OpenID Connect 向 AKS 叢集提供 Microsoft Entra 驗證。 OpenID Connect 是以 OAuth 2.0 通訊協定為建置基礎的身分識別層。 如需 OpenID Connect 的詳細資訊,請參閱 OpenID Connect 文件。 從 Kubernetes 叢集內部,Webhook 權杖驗證用來確認驗證權杖。 Webhook 權杖驗證已設定並當作 AKS 叢集的一部分管理。

Webhook 和 API 伺服器

Webhook 和 API 伺服器驗證流程

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

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

參閱 AKS 受控 Microsoft Entr 整合操作指南,瞭解如何將 AKS 與 Microsoft Entra ID 整合。

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
在 Standard 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 為基礎的負載平衡器後端集區。

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 整合時,使用者如何向 Kube 進行驗證的快速摘要。 在全部情況下,使用者的命令序列為:

  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 群組 使用時機
使用用戶端憑證的舊版管理員登入 Azure Kubernetes Service 叢集管理員角色。 此角色允許 az aks get-credentials--admin 旗標搭配使用,此旗標會將舊版 (非 Microsoft Entra) 叢集管理員憑證下載到使用者的 .kube/config。 這是「Azure Kubernetes Service 叢集管理員角色」的唯一用途。 n/a 如果您遭到永久封鎖,因為無法存取擁有叢集存取權的有效 Microsoft Entra 群組。
使用手動 (叢集) RoleBindings 的 Microsoft Entra ID Azure Kubernetes Service 叢集使用者角色。 「使用者」角色允許 az aks get-credentials 在沒有 --admin 旗標的情況下使用。 (這是「Azure Kubernetes Service 叢集使用者角色」的唯一用途。)在啟用 Microsoft Entra ID 功能的叢集上,結果是將空項目下載到 .kube/config,這會在 kubectl 第一次使用時觸發瀏覽器型驗證。 使用者不在上述任何群組中。 由於使用者不在任何叢集管理員群組中,因此其權限完全由叢集管理員所設定的任何 RoleBindings 或 ClusterRoleBindings 控制。 (Cluster)RoleBindings 將 Microsoft Entra 使用者或 Microsoft Entra 群組提名為其 subjects。 如果未設定任何這類繫結,使用者將無法執行任何 kubectl 命令。 如果您想要更精細的存取控制,而且您不使用 Azure RBAC for Kubernetes 授權。 請注意,設定繫結的使用者必須透過下表所列的其他方法之一登入。
管理員群組成員的 Microsoft Entra ID 同上 使用者是此處所列其中一個群組的成員。 AKS 會自動產生 ClusterRoleBinding,將全部列出的群組繫結至 cluster-admin Kubernetes 角色。 因此,這些群組中的使用者能夠以 kubectl 身分執行全部的 cluster-admin 命令。 如果您想要方便使用者授與完整的管理員權限,而且使用 Azure RBAC 進行 Kubernetes 授權。
使用「適用於 Kube 的 Azure RBAC」授權的 Microsoft Entra ID 兩個角色:
首先,Azure Kubernetes Service 叢集使用者角色 (如上所述)。
其次,其中一個上面所列的「Azure Kubernetes Service RBAC...」角色,或您自己的自訂替代角色。
啟用適用於 Kubernetes 的 Azure RBAC 授權 時,[設定] 索引標籤上的 [管理員角色] 欄位無關。 您正在使用適用於 Kubernetes 的 Azure RBAC 授權。 這種方法可讓您更精細地控制,而不需要設定 RoleBindings 或 ClusterRoleBindings。

下一步

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