使用 Active Directory 單一登入來保護 AKS 混合式中 Kubernetes API 伺服器的連線

適用于:Azure Stack HCI 上的 AKS、Windows Server 上的 AKS

您可以使用 Active Directory (AD) 單一登入 (SSO) 認證,在 AKS 混合式中建立 Kubernetes API 伺服器的安全連線。

AKS 混合式 AD 概觀

若未 Active Directory 驗證,則使用者必須依賴以憑證為基礎的 kubeconfig 檔案,才能透過 kubectl 命令連接到 API 伺服器。 Kubeconfig 檔案包含需要謹慎散發的秘密,例如私用金鑰和憑證,這可能造成嚴重的安全性風險。

除了使用憑證型 kubeconfig,您也可以使用 AD SSO 認證作為連線到 API 伺服器的安全方式。 AD 與 AKS 混合式整合可讓使用者在已加入網域的電腦上使用其 SSO 認證連線到 API 伺服器 kubectl 。 這樣就不需要管理和散發包含私密金鑰的憑證型 kubeconfig 檔案。

AD 整合使用 AD kubeconfig,與以憑證為基礎的 kubeconfig 檔案不同,且不包含任何秘密。 但是,如果使用 Active Directory 認證連接時發生問題,則可將以憑證為基礎的 kubeconfig 檔案用於備份用途,例如疑難排解。

AD 整合還有另一個安全性優點,就是使用者和群組會以安全性識別碼 (SID) 的形式儲存。 和群組名稱不同,SID 是不可變且唯一的,因此不會出現命名衝突。

注意

目前,只有工作負載叢集支援 AD SSO 連線能力。

本檔將引導您完成下列步驟,以將 Active Directory 設定為身分識別提供者,並透過 kubectl 啟用 SSO:

  • 為 API 伺服器建立 AD 帳戶,然後建立與該帳戶相關聯的 keytab 檔案。 請參閱使用 keytab 檔案建立 AD 驗證,以建立 AD 帳戶並產生 keytab 檔案。
  • 使用 keytab 檔案在 Kubernetes 叢集上安裝 AD Auth。 在這個步驟中,系統會自動建立預設的角色型存取控制 (RBAC) 設定。
  • 在建立或編輯 RBAC 設定時,將群組名稱轉換為 SID,反之亦然。如需相關指示,請參閱建立和更新 AD 群組角色繫結

開始之前

在開始設定 Active Directory SSO 認證的程式之前,請確定您有下列可用項目:

  • 已安裝最新的 Aks-Hci PowerShell 模組。 如果您需要安裝該模組,請參閱下載並安裝 AksHci PowerShell 模組

  • 已安裝並設定 AKS 主機。 如果您需要安裝主機,請依照步驟來設定您的部署

  • Keytab 檔案可供使用。 如果無法使用,請遵循下列步驟來建立 API 伺服器 AD 帳戶和 keytab 檔案。

    注意

    您應該為特定的服務主體名稱 (SPN) 產生 keytab 檔案,而且此 SPN 必須對應至工作負載叢集的 API 伺服器 AD 帳戶。 您也必須確定整個 AD 驗證程式都使用相同的 SPN。 Keytab 檔案應該命名為 current. keytab

  • 每個 AKS 工作負載叢集都有一個 API 伺服器 AD 帳戶可供使用。

  • 用戶端電腦必須是已加入網域的 Windows 電腦。

使用 keytab 檔案建立 AD 驗證

步驟1:建立工作負載叢集並啟用 AD 驗證

安裝 AD 驗證之前,您必須先建立 AKS 工作負載叢集,並在叢集上啟用 AD 驗證附加元件。 如果您在建立新叢集時未啟用 AD 驗證,您稍後就無法加以啟用。

以系統管理員身分開啟 PowerShell,並使用命令的 -enableADAuth 參數執行 New-AksHciCluster 命令:

New-AksHciCluster -name mynewcluster1 -enableADAuth

針對每個工作負載叢集,請確定有一個可用的 API 伺服器 AD 帳戶。

如需建立工作負載叢集的詳細資訊,請參閱使用 Windows PowerShell 建立 Kubernetes 叢集

步驟 2:安裝 AD 驗證

在您可以安裝 AD 驗證之前,必須先安裝工作負載叢集,並在叢集上啟用 AD 驗證。 若要安裝 AD 驗證,請使用下列其中一個選項。

選項 1

針對已加入網域的 Azure Stack HCI 或 Windows Server 叢集,以系統管理員身分開啟 PowerShell,然後執行下列命令:

Install-AksHciAdAuth -name mynewcluster1 -keytab .\current.keytab -SPN k8s/apiserver@CONTOSO.COM -adminUser contoso\bob

注意

若為 SPN k8s/apiserver@CONTOSO.com,請使用 SPN k8s/apiserver@< 領域名稱 >的格式。 第一次嘗試時,請以大寫字母指定 < 領域名稱稱 > 。 不過,如果您有問題,請使用小寫字母建立 SPN。 Kerberos 區分大小寫。

選項 2

如果叢集主機未加入網域,請使用 SID 格式的系統管理員使用者名稱或組名,如下列範例所示:

Install-AksHciAdAuth -name mynewcluster1 -keytab .\current.keytab -SPN k8

若要尋找使用者帳戶的 SID,請參閱判斷使用者或群組的安全識別碼

繼續進行後續步驟之前,請記下下列專案:

  • 確定 keytab 檔案的名稱為 current.keytab
  • 取代對應至您環境的 SPN。
  • -AdminUser 參數會為具有叢集管理員權限的指定 AD 群組建立對應角色繫結。 將 contoso\bob (取代為與環境對應的 AD 群組或使用者,如) 上述選項 1 所示。

步驟 3:測試 AD webhook 和 keytab 檔案

您必須確定 AD webhook 是在 API 伺服器上執行,且 keytab 檔案會儲存為 Kubernetes 秘密。 若要取得工作負載叢集的憑證型 kubeconfig 檔案,請遵循下列步驟:

  1. 使用下列命令取得以憑證為基礎的 kubeconfig 檔案。 您將使用 kubeconfig 檔案,以本機主機的形式連接到叢集。

    Get-AksHciCredential -name mynewcluster1
    
  2. 使用您先前建立的憑證型 kubeconfig 檔案,在您連線到的伺服器上執行 kubectl,然後檢查 AD webhook 部署以確定其格式為 ad-auth-webhook-xxxx

    kubectl get pods -n=kube-system
    
  3. 執行 kubectl 以確認 keytab 檔案已部署為秘密,並列為 Kubernetes 秘密:

    kubectl get secrets -n=kube-system
    

步驟 4:建立 AD kubeconfig 檔案

成功部署 AD webhook 和 keytab 之後,請建立 AD kubeconfig 檔案。 建立檔案之後,您會將 AD kubeconfig 檔案複製到用戶端電腦,並使用該檔案來向 API 伺服器進行驗證。 不同於以憑證為基礎的 kubeconfig 檔案,AD kubeconfig 不是祕密,而且可以安全地複製為純文字。

以系統管理員身分開啟 PowerShell,並執行下列命令:

Get-AksHciCredential -name mynewcluster1 -configPath .\AdKubeconfig -adAuth

步驟 5:將 kubeconfig 和其他檔案複製到用戶端電腦

您應該將下列三個檔案從 AKS 工作負載叢集複製到用戶端電腦:

  • 將在上一個步驟中建立的 AD kubeconfig 檔案複製到 $env:USERPROFILE.kube\config。

  • 建立資料夾路徑 c:\adsso ,並將下列檔案從 AKS 工作負載叢集複製到用戶端電腦。

    • $env:ProgramFiles\AksHci 下的 Kubectl.exe 到 c:\adsso
    • $env:ProgramFiles\AksHci 下的 Kubectl-adsso.exe 到 c:\adsso

    注意

    當您執行 Get-AksHciCredential Cmdlet 時,會在伺服器上產生adsso.exe檔案。

步驟 6:從用戶端電腦連線至 API 伺服器

當您完成上述步驟之後,請使用您的 SSO 認證登入 Windows 已加入網域的用戶端電腦。 開啟 PowerShell,然後嘗試使用 kubectl 存取 API 伺服器。 如果作業順利完成,則您已正確設定 AD SSO。

建立和更新 AD 群組角色繫結

如步驟 2 所述,系統會為使用者及/或在安裝期間提供的群組建立具有叢集系統管理員權限的預設角色繫結。 Kubernetes 中的角色繫結會定義 AD 群組存取原則。 此步驟說明如何在 Kubernetes 中使用 RBAC 來建立新的 AD 群組角色繫結,以及編輯現有的角色繫結。 例如,叢集系統管理員可能會想要使用 AD 群組將額外的權限授與使用者 (這樣可讓程序更有效率)。 若要深入瞭解 RBAC,請參閱使用 RBAC 授權

當您建立或編輯其他 AD 群組 RBAC 專案時,主體名稱應具有 「 microsoft:activedirectory:CONTOSO\\group name 」 前置詞。 請注意,名稱必須包含以雙引號括住的網域名稱和前置詞。

以下是兩個範例:

範例 1

apiVersion: rbac.authorization.k8s.io/v1 
 kind: ClusterRoleBinding 
 metadata: 
   name: ad-user-cluster-admin 
 roleRef: 
   apiGroup: rbac.authorization.k8s.io 
   kind: ClusterRole 
   name: cluster-admin 
 subjects: 
 - apiGroup: rbac.authorization.k8s.io 
   kind: User 
   name: "microsoft:activedirectory:CONTOSO\Bob" 

範例 2

下列範例顯示如何為具有 AD 群組的命名空間建立自訂角色和角色繫結。 在此範例中,「SREGroup」是 Contoso Active Directory 中既有的群組。 當使用者新增至 AD 群組時,系統會立即授與他們權限。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: sre-user-full-access
  namespace: sre
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["*"]
  verbs: ["*"]
- apiGroups: ["batch"]
  resources:
  - jobs
  - cronjobs
  verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: ad-user-cluster-admin
  namespace: sre
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: sre-user-full-access
subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: "microsoft:activedirectory:CONTOSO\SREGroup" 

套用 YAML 檔案之前,應該一律使用 命令將 群組和使用者名稱 轉換成 SID:

kubectl-adsso nametosid <rbac.yml>

同樣地,若要更新現有的 RBAC,您可以先將 SID 轉換為使用者易記的群組名稱,然後再進行變更。 若要轉換 SID,請使用下列命令:

kubectl-adsso sidtoname <rbac.yml>

變更與 API 伺服器帳戶相關聯的 AD 帳戶密碼

當 API 伺服器帳戶的密碼變更時,您必須解除安裝 AD 驗證附加元件,並使用更新後的目前和先前 keytabs 來重新安裝。

每次您變更密碼時,都必須將目前的 keytab (current.keytab) 重新命名為 previous. keytab。 然後,請確定您將新密碼命名為 current.keytab

重要

檔案必須分別命名為 current.keytabprevious. keytab。 現有的角色系結不會受到這項變更的影響。

解除安裝並重新安裝 AD 驗證

您可能會想要在 API 伺服器的帳戶變更、密碼更新時重新安裝 AD SSO,或針對失敗進行疑難排解。

若要解除安裝 AD 驗證,請以系統管理員身分開啟 PowerShell,然後執行下列命令:

Uninstall-AksHciAdAuth -name mynewcluster1

若要重新安裝 AD 驗證,請以系統管理員身分開啟 PowerShell,然後執行下列命令:

Install-AksHciAdAuth -name mynewcluster1 -keytab <.\current.keytab> -previousKeytab <.\previous.keytab> -SPN <service/principal@CONTOSO.COM> -adminUser CONTOSO\Bob

注意

若要避免用戶端有快取票證的停機時間, -previousKeytab 只有在您變更密碼時,才需要 參數。

建立 API 伺服器 AD 帳戶和 keytab 檔案

建立 AD 帳戶和 keytab 檔案涉及兩個步驟。 首先,使用服務主體名稱為 API 伺服器建立新的 AD 帳戶/使用者, (SPN) ,然後為 AD 帳戶建立 keytab 檔案。

步驟 1:為 API 伺服器建立新的 AD 帳戶或使用者

使用 New-aduser PowerShell 命令來建立具有 SPN 的新 AD 帳戶/使用者。 以下為範例:

New-ADUser -Name apiserver -ServicePrincipalNames k8s/apiserver -AccountPassword (ConvertTo-SecureString "password" -AsPlainText -Force) -KerberosEncryptionType AES128 -Enabled 1

步驟 2:建立 AD 帳戶的 keytab 檔案

若要建立 keytab 檔案,您可以使用 ktpass Windows 命令。

以下是 ktpass 的使用範例:

ktpass /out current.keytab /princ k8s/apiserver@CONTOSO.COM /mapuser contoso\apiserver_acct /crypto all /pass p@$$w0rd /ptype KRB5_NT_PRINCIPAL

注意

如果您在名稱專案中看到傳 回的 DsCrackNames 錯誤0x2,請確定 /mapuser 的參數格式 mapuser DOMAIN\user 為 ,其中 DOMAIN 是 echo %userdomain% 的輸出。

判斷使用者或群組的安全識別碼

使用下列兩個選項之一來尋找您帳戶或其他帳戶的 SID:

  • 若要尋找與您帳戶相關聯的 SID,請在主目錄的命令提示字元中,輸入下列命令:

    whoami /user
    
  • 若要尋找與其他帳戶相關聯的 SID,請以系統管理員身分開啟 PowerShell,然後執行下列動作:

    (New-Object System.Security.Principal.NTAccount(<CONTOSO\Bob>)).Translate([System.Security.Principal.SecurityIdentifier]).value
    

針對憑證進行疑難排解

Webhook 和 API 伺服器會使用憑證來相互驗證 TLS 連接。 此憑證會在 500 天內到期。 若要確認憑證是否已過期,請從 ad-auth-webhook 容器查看記錄:

kubectl logs ad-auth-webhook-xxx

如果您看到憑證驗證錯誤,請完成解除安裝並重新安裝 webhook 的步驟,並取得新的憑證。

最佳做法和清除

  • 針對每個叢集使用唯一的帳戶。
  • 請勿跨叢集重複使用 API 伺服器帳戶的密碼。
  • 當您建立叢集後,請立即刪除 keytab 檔案的本機複本,並確認 SSO 認證可正常運作。
  • 刪除為 API 伺服器建立的 Active Directory 使用者。 如需詳細資訊,請參閱 Remove-ADUser

後續步驟

在本操作指南中,您已瞭解如何設定 AD 驗證,以安全地連線到具有 SSO 認證的 API 伺服器。 接著,您可以: