共用方式為


管理 SSH 以便安全存取 Azure Kubernetes Service (AKS) 節點

本文說明如何在初始部署期間或稍後在 AKS 叢集或節點集區上設定 SSH 金鑰 (預覽版)。

AKS 支援下列設定選項來管理叢集節點上的 SSH 金鑰:

  • 使用 SSH 金鑰建立叢集
  • 更新現有 AKS 叢集上的 SSH 金鑰
  • 停用並啟用 SSH 服務

重要

AKS 預覽功能可透過自助服務,以加入方式使用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

開始之前

  • 您需要 aks-preview 0.5.116 版或更新版本才能使用 [更新]
  • 您需要 aks-preview 1.0.0b6 版或更新版本才能使用 [停用]
  • [建立] 和 [更新] SSH 功能支援現有叢集上的 Linux、Windows 和 Azure Linux 節點集區。
  • 在執行 Windows Server 作業系統的節點集區上,此預覽不支援 [停用] SSH 功能。

安裝 aks-preview Azure CLI 延伸模組

  1. 使用 az extension add 命令安裝 aks-preview 延伸模組。

    az extension add --name aks-preview
    
  2. 使用 az extension update 命令,以更新為延伸模組最新版。

    az extension update --name aks-preview
    

註冊 DisableSSHPreview 功能旗標

若要使用 [停用] SSH 功能,請執行下列步驟,在您的訂用帳戶中註冊並加以啟用。

  1. 使用 az feature register 命令註冊 DisableSSHPreview 功能旗標。

    az feature register --namespace "Microsoft.ContainerService" --name "DisableSSHPreview"
    

    狀態需要幾分鐘的時間才會顯示「已註冊」

  2. 使用 az feature show 命令確認註冊狀態。

    az feature show --namespace "Microsoft.ContainerService" --name "DisableSSHPreview"
    
  3. 當狀態顯示為 [已註冊] 時,請使用 az provider register 命令來重新整理 Microsoft.ContainerService 資源提供者的註冊。

    az provider register --namespace Microsoft.ContainerService
    

搭配 SSH 金鑰建立 AKS 叢集

使用 az aks create 命令搭配 SSH 金鑰部署 AKS 叢集。 您可使用 --ssh-key-value 引數來指定金鑰或金鑰檔。

SSH 參數 描述 預設值
--generate-ssh-key 如果您沒有自己的 SSH 金鑰,請指定 --generate-ssh-key。 Azure CLI 會自動產生一組 SSH 金鑰,並將金鑰儲存在預設目錄 ~/.ssh/
--ssh-key-value 用來在 SSH 存取的節點 VM 上安裝的金鑰路徑或金鑰內容。 例如: ssh-rsa AAAAB...snip...UcyupgH azureuser@linuxvm ~/.ssh/id_rsa.pub
--no-ssh-key 如果您不需要 SSH 金鑰,請指定此引數。 不過,AKS 會自動產生一組 SSH 金鑰,因為 Azure 虛擬機器資源相依性不支援空的 SSH 金鑰檔案。 因此,金鑰不會傳回,而且無法用來透過 SSH 連線到節點 VM。 私密金鑰會予以捨棄且未儲存。

注意

如果未指定任何參數,Azure CLI 預設會參考儲存在 ~/.ssh/id_rsa.pub 檔案中的 SSH 金鑰。 如果找不到金鑰,命令會傳回訊息 An RSA key file or key value must be supplied to SSH Key Value

以下是此命令的範例:

  • 若要建立叢集並使用預設產生的 SSH 金鑰:

    az aks create --name myAKSCluster --resource-group MyResourceGroup --generate-ssh-key
    
  • 若要指定 SSH 金鑰檔案,請包含 --ssh-key-value 引數:

    az aks create --name myAKSCluster --resource-group MyResourceGroup --ssh-key-value ~/.ssh/id_rsa.pub
    

更新現有 AKS 叢集上的 SSH 公開金鑰

使用 az aks update 命令來更新叢集上的 SSH 金鑰 (預覽版)。 此作業會更新全部節點集區上的金鑰。 您可使用 --ssh-key-value 引數來指定金鑰或金鑰檔。

注意

具有 AKS 叢集的 Azure 虛擬機器擴展集支援更新 SSH 金鑰。

以下是此命令的範例:

  • 若要指定新的 SSH 金鑰值,請包含 --ssh-key-value 引數:

    az aks update --name myAKSCluster --resource-group MyResourceGroup --ssh-key-value 'ssh-rsa AAAAB3Nza-xxx'
    
  • 若要指定 SSH 金鑰檔案,請使用 --ssh-key-value 引數指定該檔案:

    az aks update --name myAKSCluster --resource-group MyResourceGroup --ssh-key-value ~/.ssh/id_rsa.pub
    

重要

更新 SSH 金鑰之後,AKS 不會自動更新您的節點集區。 您可以隨時選擇執行 nodepool 更新作業。 更新 SSH 金鑰作業會在節點映像更新完成之後生效。

停用 SSH 概觀

為了改善安全性和支援公司安全性需求或策略,AKS 支援在叢集和節點集區層級停用 SSH (預覽版)。 相較於唯一支援的解決方案,停用 SSH 引進簡化的方法,這需要在 AKS 子網/節點網路介面卡 (NIC) 上設定網路安全性群組規則。 停用 SSH 僅支援 虛擬機器擴展集 節點集區。

您在叢集建立時停用 SSH 時,這會在建立叢集之後生效。 不過,您在現有的叢集或節點集區上停用 SSH 時,AKS 不會自動停用 SSH。 您可以隨時選擇執行 nodepool 升級作業。 停用/啟用 SSH 金鑰作業會在節點映像更新完成之後生效。

注意

當您在叢集層級停用 SSH 時,它會套用至所有現有的節點集區中。 此作業之後所建立的任何節點集區預設都會啟用 SSH,您必須再次執行這些命令才能停用它。

SSH 參數 描述
disabled SSH 服務已停用。
localuser 已啟用 SSH 服務,且具有 SSH 金鑰的使用者可以安全地存取節點。

注意

kubectl 偵錯節點會在您停用 SSH 之後繼續運作,因為這不相依於 SSH 服務。

在新的叢集部署上停用 SSH

根據預設,AKS 叢集節點上的 SSH 服務可供叢集上執行的全部使用者和 Pod 使用。 如果 Pod 中的容器遭到入侵,您可以防止從任何網路直接透過 SSH 存取叢集節點,協助限制攻擊媒介。 使用 az aks create 命令來建立新的叢集,並在叢集建立期間包含 --ssh-access disabled 引數來停用全部節點集區上的 SSH (預覽版)。

重要

停用 SSH 服務之後,您無法透過 SSH 連線到叢集來執行系統管理工作或進行疑難排解。

注意

在新建立的叢集上,停用 ssh 只會設定第 1 個系統節點集區。 所有其他節點集區都必須在節點集區層級設定。

az aks create --resource-group myResourceGroup --name myManagedCluster --ssh-access disabled

幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。 下列範例與輸出和停用 SSH 相關的結果類似:

"securityProfile": {
"sshAccess": "Disabled"
},

停用現有叢集上的 SSH

使用 az aks update 命令來更新現有的叢集,並包含 --ssh-access disabled 引數以在叢集中的全部節點集區中停用 SSH (預覽版)。

az aks update --resource-group myResourceGroup --name myManagedCluster --ssh-access disabled

幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。 下列範例與輸出和停用 SSH 相關的結果類似:

"securityProfile": {
"sshAccess": "Disabled"
},

若要讓變更生效,您必須使用 az aks nodepool upgrade 命令重新安裝全部節點集區的映像。

az aks nodepool upgrade --cluster-name myManagedCluster --name mynodepool --resource-group myResourceGroup --node-image-only

重要

在此作業期間,全部虛擬機器擴展集執行個體都會升級並重新建立映像,以使用新的 SSH 設定。

停用新節點集區的 SSH

使用 az aks nodepool add 命令新增節點集區,並在節點集區建立期間包含要停用 SSH 的 --ssh-access disabled 引數。

az aks nodepool add --cluster-name myManagedCluster --name mynodepool --resource-group myResourceGroup --ssh-access disabled  

在幾分鐘之後,此命令就會完成,並以 JSON 格式傳回叢集的相關資訊,指出已成功建立 mynodepool。 下列範例與輸出和停用 SSH 相關的結果類似:

"securityProfile": {
"sshAccess": "Disabled"
},

停用現有節點集區的 SSH

使用 [az aks nodepool update][az-aks-nodepool-update] command with the --ssh-access disabled` 引數來停用現有節點集區上的 SSH (預覽版)。

az aks nodepool update --cluster-name myManagedCluster --name mynodepool --resource-group myResourceGroup --ssh-access disabled

在幾分鐘之後,此命令就會完成,並以 JSON 格式傳回叢集的相關資訊,指出已成功建立 mynodepool。 下列範例與輸出和停用 SSH 相關的結果類似:

"securityProfile": {
"sshAccess": "Disabled"
},

若要讓變更生效,您必須使用 az aks nodepool upgrade 命令來重新安裝節點集區的映像。

az aks nodepool upgrade --cluster-name myManagedCluster --name mynodepool --resource-group myResourceGroup --node-image-only

在現有叢集上重新啟用 SSH

使用 az aks update 命令來更新現有的叢集,並包含 --ssh-access localuser 引數以在叢集中的全部節點集區中包含要重新啟用 SSH (預覽版)。

az aks update --resource-group myResourceGroup --name myManagedCluster --ssh-access localuser

執行流程時會傳回下列訊息:

Only after all the nodes are reimaged, does the disable/enable SSH Access operation take effect."

重新啟用 SSH 之後,不會自動重新安裝節點的映像。 您可以隨時選擇執行重新安裝映像作業

重要

在此作業期間,全部虛擬機器擴展集執行個體都會升級並重新建立映像,以使用新的 SSH 公開金鑰。

重新啟用特定節點集區的 SSH

使用 az aks update 命令來更新特定的節點集區,並在叢集中的該節點集區中包含要重新啟用 SSH 的 --ssh-access localuser 引數 (預覽版)。 在下列範例中,nodepool1 是目標節點集區。

az aks nodepool update --cluster-name myManagedCluster --name nodepool1 --resource-group myResourceGroup --ssh-access localuser 

執行流程時會傳回下列訊息:

Only after all the nodes are reimaged, does the disable/enable SSH Access operation take effect.

重要

在此作業期間,全部虛擬機器擴展集執行個體都會升級並重新建立映像,以使用新的 SSH 公開金鑰。

SSH 服務狀態

執行下列步驟,以便在一個節點上使用節點殼層,並使用 systemctl 檢查 SSH 服務狀態。

  1. 執行命令 kubectl node-shell <node> 命令以取得標準 Bash 殼層。

    kubectl node-shell aks-nodepool1-20785627-vmss000001
    
  2. 執行 systemctl 命令來檢查 SSH 服務的狀態。

    systemctl status ssh
    

如果 SSH 已停用,下列範例輸出會顯示結果:

ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; disabled; vendor preset: enabled)
     Active: inactive (dead) since Wed 2024-01-03 15:36:57 UTC; 20min ago

如果已啟用 SSH,下列範例輸出會顯示結果:

ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-01-03 15:40:20 UTC; 19min ago

下一步

若要協助針對叢集節點的 SSH 連線問題進行疑難排解,您可以檢視 kubelet 記錄檢視 Kube 主要節點記錄