管理 SSH 以安全访问 Azure Kubernetes 服务 (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 功能。

安装 Azure CLI aks-preview 扩展

  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 在节点 VM 上安装的、用于 SSH 访问的公钥路径或密钥内容。 例如 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 不会自动更新节点池。 你随时都可以选择执行节点池更新操作。 只有在节点映像更新完成后,更新 SSH 密钥操作才会生效。

禁用 SSH 概述

为了提高安全性和支持企业的安全要求或策略,AKS 支持在群集和节点池级别禁用 SSH(预览版)。 与唯一支持的解决方案相比,禁用 SSH 会引入一种简化的方法,这要求在 AKS 子网/节点网络接口卡 (NIC) 上配置网络安全组规则。 禁用 SSH 仅支持虚拟机规模集节点池。

在群集创建时禁用 SSH,群集创建后才会生效。 但是,在现有群集或节点池上禁用 SSH 时,AKS 不会自动禁用 SSH。 你随时都可以选择执行节点池更新操作。 只有在节点映像更新完成后,禁用/启用 SSH 密钥操作才会生效。

注意

在群集级别禁用 SSH 时,它将应用于所有现有节点池。 在此操作后创建的任何节点池都将默认启用 SSH,需要再次运行这些命令才能禁用它。

SSH 参数 说明
disabled SSH 服务已禁用。
localuser 已启用 SSH 服务,并且具有 SSH 密钥的用户可以安全地访问节点。

注意

禁用 SSH 后,Kubectl 调试节点会继续工作,因为它不依赖于 SSH 服务。

在新群集部署上禁用 SSH

默认情况下,AKS 群集节点上的 SSH 服务对群集上运行的所有用户和 Pod 开放。 如果 Pod 中的容器遭到入侵,你可以阻止从任何网络直接通过 SSH 访问群集节点,以帮助限制攻击途径。 使用 az aks create 命令创建新群集,并在群集创建期间添加用于禁用所有节点池上的 SSH(预览版)的 --ssh-access disabled 参数。

重要

禁用 SSH 服务后,你无法通过 SSH 连接到群集来执行管理任务或进行故障排除。

注意

在新创建的群集上,禁用 ssh 将仅配置第一个系统节点池。 所有其他节点池都需要在节点池级别配置。

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-access disabled 参数以在节点池创建期间禁用 SSH。

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-access localuser 参数以在群集的相应节点池上重新启用 SSH(预览版)。 在以下示例中,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 服务状态

执行以下步骤,将 node-shell 用于一个节点上,并使用 systemctl 检查 SSH 服务状态。

  1. 通过运行命令 kubectl node-shell <node> 命令获取标准 bash shell。

    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 日志查看 Kubernetes 主节点日志