你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

管理 SSH 以安全访问 Azure Kubernetes 服务 (AKS) 节点

本文介绍如何在初始部署期间或稍后在 AKS 群集或节点池上配置 SSH 访问(预览版)。

AKS 支持以下配置选项来管理群集节点上的 SSH 访问:

  • 禁用的 SSH:完全禁用对群集节点的 SSH 访问以提高安全性
  • 基于 Entra ID 的 SSH:使用 Microsoft Entra ID 凭据进行 SSH 身份验证。 使用基于 Entra ID 的 SSH 的好处:
    • 集中式标识管理:使用现有的 Entra ID 标识访问群集节点
    • 无 SSH 密钥管理:无需生成、分发和轮换 SSH 密钥
    • 增强的安全性:利用条件访问和 MFA 等 Entra ID 安全功能
    • 审核和符合性:通过 Entra ID 日志集中记录访问事件
    • 实时访问:结合 Azure RBAC 进行精细访问控制
  • 本地用户 SSH:用于节点访问的传统基于 SSH 密钥的身份验证

重要说明

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

重要说明

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

先决条件

  • 本文需要 Azure CLI 2.61.0 或更高版本。 如果使用的是 Azure Cloud Shell,则表示已安装最新版本。

  • 需要 aks-preview 版本 9.0.0b1 或更高版本。

    • 如果还没有 aks-preview 扩展,请使用 az extension add 以下命令安装它:
      az extension add --name aks-preview
      
    • 如果已有 aks-preview 扩展,请更新该扩展,以确保使用 az extension update 以下命令获得最新版本:
      az extension update --name aks-preview
      
  • 使用 DisableSSHPreview 命令注册 az feature register 功能标志。

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

    状态显示为“已注册”需要几分钟时间

  • 使用 az feature show 命令验证注册状态。

    az feature show --namespace "Microsoft.ContainerService" --name "DisableSSHPreview"
    
  • 当状态显示“已注册”时,使用 命令刷新 Microsoft.ContainerService 资源提供程序的注册。az provider register

    az provider register --namespace Microsoft.ContainerService
    
  • 本文需要 Azure CLI 2.73.0 或更高版本。 如果使用的是 Azure Cloud Shell,则表示已安装最新版本。

  • 对于 Entra ID SSH,需要 aks-preview 版本 19.0.0b7 或更高版本。

    • 如果还没有 aks-preview 扩展,请使用 az extension add 以下命令安装它:
      az extension add --name aks-preview
      
    • 如果已有 aks-preview 扩展,请更新该扩展,以确保使用 az extension update 以下命令获得最新版本:
      az extension update --name aks-preview
      
  • 访问节点的相应 Azure RBAC 权限:

    • 所需操作Microsoft.Compute/virtualMachineScaleSets/*/read - 读取虚拟机规模集信息
      • 所需的数据操作
        • Microsoft.Compute/virtualMachineScaleSets/virtualMachines/login/action - 以常规用户身份进行身份验证并登录到 VM。
        • Microsoft.Compute/virtualMachines/loginAsAdmin/action - 使用根用户权限登录。
      • 内置角色虚拟机管理员登录 名或 虚拟机用户登录 名(用于非管理员访问)
  • 使用 EntraIdSSHPreview 命令注册 az feature register 功能标志。

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

    状态显示为“已注册”需要几分钟时间

  • 使用 az feature show 命令验证注册状态。

    az feature show --namespace "Microsoft.ContainerService" --name "EntraIdSSHPreview"
    
  • 当状态显示“已注册”时,使用 命令刷新 Microsoft.ContainerService 资源提供程序的注册。az provider register

    az provider register --namespace Microsoft.ContainerService
    
  • 本文需要 Azure CLI 2.61.0 或更高版本。 如果使用的是 Azure Cloud Shell,则表示已安装最新版本。
  • 需要 aks-preview 版本 9.0.0b1 或更高版本才能更新 nodepools 上的 SSH 访问方法。
    • 如果还没有 aks-preview 扩展,请使用 az extension add 以下命令安装它:
      az extension add --name aks-preview
      
    • 如果已有 aks-preview 扩展,请更新该扩展,以确保使用 az extension update 以下命令获得最新版本:
      az extension update --name aks-preview
      

设置环境变量。

为资源组、群集名称和位置设置以下环境变量:

export RESOURCE_GROUP="<your-resource-group-name>"
export CLUSTER_NAME="<your-cluster-name>"
export LOCATION="<your-azure-region>"

局限性

  • Entra ID SSH 尚不适用于 Windows 节点池的节点。
  • 由于 节点资源组锁定 阻止角色分配,Entra ID SSH 不支持 AKS 自动连接到节点。

配置 SSH 访问

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

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

注意

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

注意

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

创建资源组

使用 az group create 命令创建资源组。

az group create --name $RESOURCE_GROUP --location $LOCATION

在新群集部署上禁用 SSH

默认情况下,AKS 群集节点上的 SSH 服务对群集上运行的所有用户和 Pod 开放。 如果 Pod 中的容器遭到入侵,你可以阻止从任何网络直接通过 SSH 访问群集节点,以帮助限制攻击途径。

使用 az aks create 命令创建新群集,并在群集创建期间添加用于禁用所有节点池上的 SSH(预览版)的 --ssh-access disabled 参数。

重要说明

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

注意

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

az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --ssh-access disabled

片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。 以下示例类似于与禁用 SSH 相关的输出和结果:

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

为新节点池禁用 SSH

使用 az aks nodepool add 命令添加节点池,并添加 --ssh-access disabled 参数以在节点池创建期间禁用 SSH。

az aks nodepool add \
    --cluster-name $CLUSTER_NAME \
    --name mynodepool \
    --resource-group $RESOURCE_GROUP \
    --ssh-access disabled

在几分钟之后,该命令会完成并返回有关群集的 JSON 格式的信息,表明已成功创建 mynodepool。 以下示例类似于与禁用 SSH 相关的输出和结果:

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

为现有节点池禁用 SSH

重要说明

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

使用 az aks nodepool update 命令及其 --ssh-access disabled 参数来在现有节点池上禁用 SSH(此功能为预览版)。

az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --name mynodepool \
    --resource-group $RESOURCE_GROUP \
    --ssh-access disabled

几分钟后,该命令完成并返回有关指示 mynodepool 已成功更新的群集的 JSON 格式的信息。 以下示例类似于与禁用 SSH 相关的输出和结果:

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

若要使更改生效,需要使用 az aks nodepool upgrade 命令为节点池重置映像。

az aks nodepool upgrade \
    --cluster-name $CLUSTER_NAME \
    --name mynodepool \
    --resource-group $RESOURCE_GROUP \
    --node-image-only

重要说明

若要在现有群集上禁用 SSH,需要为此群集上的每个节点池禁用 SSH。

重新启用 SSH 访问

若要在节点池上重新启用 SSH 访问,请使用 --ssh-access localuser(对于传统的基于 SSH 密钥的访问)或 --ssh-access entraid(对于基于 Entra ID 的访问)更新节点池。 有关详细说明,请参阅相应的部分。

可以将 AKS 群集配置为使用 Microsoft Entra ID(以前为 Azure AD)对群集节点进行 SSH 身份验证。 这样就无需管理 SSH 密钥,并允许使用 Entra ID 凭据安全地访问节点。

创建资源组

使用 az group create 命令创建资源组。

az group create --name $RESOURCE_GROUP --location $LOCATION

在新群集上启用基于 Entra ID 的 SSH

使用 az aks create 带参数的 --ssh-access entraid 命令在群集创建期间启用基于 Entra ID 的 SSH 身份验证。

az aks create \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --ssh-access entraid

片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。 以下示例类似于输出:

"securityProfile": {
  "sshAccess": "EntraID"
},

为新节点池启用基于 Entra ID 的 SSH

在创建节点池时,使用 az aks nodepool add 命令和 --ssh-access entraid 参数以启用基于 Entra ID 的 SSH。

az aks nodepool add \
    --cluster-name $CLUSTER_NAME \
    --name mynodepool \
    --resource-group $RESOURCE_GROUP \
    --ssh-access entraid

几分钟后,该命令完成并返回 JSON 格式的信息,指示已成功使用基于 Entra ID 的 SSH 创建 mynodepool 。 以下示例类似于输出:

"securityProfile": {
  "sshAccess": "EntraID"
},

为现有节点池启用基于 Entra ID 的 SSH

使用 az aks nodepool update 命令,并通过 --ssh-access entraid 参数,在现有节点池上启用基于 Entra ID 的 SSH 功能。

az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --name mynodepool \
    --resource-group $RESOURCE_GROUP \
    --ssh-access entraid

几分钟后,该命令完成并返回 JSON 格式的信息,指示 mynodepool 已成功使用基于 Entra ID 的 SSH 更新。 以下示例类似于输出:

"securityProfile": {
  "sshAccess": "EntraID"
},

若要使更改生效,需要使用 az aks nodepool upgrade 命令为节点池重置映像。

az aks nodepool upgrade \
    --cluster-name $CLUSTER_NAME \
    --name mynodepool \
    --resource-group $RESOURCE_GROUP \
    --node-image-only

重要说明

若要在现有群集上启用基于 SSH 的 Entra ID,需要单独为每个节点池启用它。

本地用户 SSH 访问使用传统的基于 SSH 密钥的身份验证。 这是 AKS 群集的默认 SSH 访问方法。

创建资源组

使用 az group create 命令创建资源组。

az group create --name $RESOURCE_GROUP --location $LOCATION

使用 SSH 密钥创建 AKS 群集

通过 az aks create 命令,使用 SSH 公钥部署 AKS 群集。 可以使用 --ssh-key-value 参数指定密钥或密钥文件,或者使用 --ssh-access localuser 显式设置本地用户 SSH 访问权限。

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
--ssh-access localuser 使用基于密钥的身份验证显式启用本地用户 SSH 访问。
--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 $CLUSTER_NAME --resource-group $RESOURCE_GROUP --generate-ssh-key
    
  • 若要指定 SSH 公钥文件,请执行以下作:

    az aks create --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --ssh-key-value ~/.ssh/id_rsa.pub
    
  • 若要显式启用本地用户 SSH 访问,请:

    az aks create --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --ssh-access localuser --generate-ssh-key
    

为新节点池启用本地用户 SSH

在创建节点池期间,使用az aks nodepool add命令和--ssh-access localuser参数,以启用本地用户的SSH。

az aks nodepool add \
    --cluster-name $CLUSTER_NAME \
    --name mynodepool \
    --resource-group $RESOURCE_GROUP \
    --ssh-access localuser

为现有节点池启用本地用户 SSH

重要说明

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

使用 az aks nodepool update 命令和 --ssh-access localuser 参数在现有节点池上启用本地用户 SSH。

az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --name mynodepool \
    --resource-group $RESOURCE_GROUP \
    --ssh-access localuser

重要说明

若要使更改生效,需要使用 az aks nodepool upgrade 命令为节点池重置映像。

az aks nodepool upgrade \
    --cluster-name $CLUSTER_NAME \
    --name mynodepool \
    --resource-group $RESOURCE_GROUP \
    --node-image-only

更新现有 AKS 群集上的 SSH 公钥

使用 az aks update 命令更新群集上的 SSH 公钥(预览版)。 此操作将更新所有节点池上的密钥。 你可以使用 --ssh-key-value 参数指定密钥或密钥文件。

注意

支持在包含 AKS 群集的 Azure 虚拟机规模集上更新 SSH 密钥。

示例:

  • 若要指定新的 SSH 公钥值,请执行以下作:

    az aks update --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --ssh-key-value 'ssh-rsa AAAAB3Nza-xxx'
    
  • 若要指定 SSH 公钥文件,请执行以下作:

    az aks update --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --ssh-key-value ~/.ssh/id_rsa.pub
    

重要说明

更新 SSH 密钥后,AKS 不会自动更新节点池。 随时可以选择执行 节点池升级作。 只有在节点映像更新完成后,更新 SSH 密钥操作才会生效。 对于启用了 节点自动预配 的群集,可以通过将新标签应用到 Kubernetes NodePool 自定义资源来执行节点映像更新。

验证 SSH 服务状态

禁用 SSH 后,可以验证 SSH 服务是否在群集节点上处于非活动状态。

使用虚拟机规模集 az vmss run-command invoke 命令检查 SSH 服务状态。

az vmss run-command invoke --resource-group <node-resource-group> --name <vmss-name> --command-id RunShellScript --instance-id 0 --scripts "systemctl status ssh"

以下示例输出显示禁用 SSH 时的预期结果:

{
  "value": [
    {
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": "Enable succeeded: \n[stdout]\n○ ssh.service - OpenBSD Secure Shell server\n     Loaded: loaded (/lib/systemd/system/ssh.service; disabled; vendor preset: enabled)\n     Active: inactive (dead) since Wed 2024-01-03 15:36:53 UTC; 25min ago\n..."
    }
  ]
}

搜索 “活动 ”一词并验证其值是否为 Active: inactive (dead)“,这确认节点上已禁用 SSH。

启用基于 Entra ID 的 SSH 后,可以验证 SSH 服务是否处于活动状态,并针对群集节点上的 Entra ID 身份验证进行配置。

使用虚拟机规模集 az vmss run-command invoke 命令检查 SSH 服务状态。

az vmss run-command invoke --resource-group <node-resource-group> --name <vmss-name> --command-id RunShellScript --instance-id 0 --scripts "systemctl status ssh"

以下示例输出显示启用 SSH 时的预期结果:

{
  "value": [
    {
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": "Enable succeeded: \n[stdout]\n● ssh.service - OpenBSD Secure Shell server\n     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)\n     Active: active (running) since Wed 2024-01-03 15:40:20 UTC; 19min ago\n..."
    }
  ]
}

搜索 “活动 ”一词并验证其值是否为 Active: active (running)“,这确认节点上已启用 SSH。

配置本地用户 SSH 后,可以验证 SSH 服务是否在群集节点上处于活动状态。

使用虚拟机规模集 az vmss run-command invoke 命令检查 SSH 服务状态。

az vmss run-command invoke --resource-group <node-resource-group> --name <vmss-name> --command-id RunShellScript --instance-id 0 --scripts "systemctl status ssh"

以下示例输出显示启用 SSH 时的预期结果:

{
  "value": [
    {
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": "Enable succeeded: \n[stdout]\n● ssh.service - OpenBSD Secure Shell server\n     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)\n     Active: active (running) since Wed 2024-01-03 15:40:20 UTC; 19min ago\n..."
    }
  ]
}

搜索 “活动 ”一词并验证其值是否为 Active: active (running)“,这确认节点上已启用 SSH。

后续步骤

为了帮助解决与群集节点的 SSH 连接问题,可以查看 kubelet 日志查看 Kubernetes 主节点日志