管理 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
扩展
使用
az extension add
命令安装 aks-preview 扩展。az extension add --name aks-preview
使用
az extension update
命令更新到扩展的最新版本。az extension update --name aks-preview
注册 DisableSSHPreview
功能标志
若要使用“禁用”SSH 功能,请执行以下步骤在订阅中注册和启用该功能。
使用
az feature register
命令注册DisableSSHPreview
功能标志。az feature register --namespace "Microsoft.ContainerService" --name "DisableSSHPreview"
状态显示为“已注册”需要几分钟时间。
使用
az feature show
命令验证注册状态。az feature show --namespace "Microsoft.ContainerService" --name "DisableSSHPreview"
当状态反映为已注册时,使用
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 服务状态。
通过运行命令
kubectl node-shell <node>
命令获取标准 bash shell。kubectl node-shell aks-nodepool1-20785627-vmss000001
运行
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 主节点日志。