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

使用 Azure AD 和 OpenSSH 登录到 Azure 中的 Linux 虚拟机

若要改进 Azure 中 Linux 虚拟机 (VM) 的安全性,可以与 Azure Active Directory (Azure AD) 身份验证集成。 现在可以将 Azure AD 用作核心身份验证平台和证书颁发机构,使用 Azure AD 和基于 openSSH 证书的身份验证通过 SSH 连接到 Linux VM。 此功能使组织能够使用 Azure 基于角色的访问控制 (RBAC) 和条件访问策略来管理对 VM 的访问。

本文介绍如何创建和配置 Linux VM,以及如何使用基于 openSSH 证书的身份验证通过 Azure AD 登录。

使用 Azure AD 通过基于 openSSH 证书的身份验证登录到 Azure 中的 Linux VM 有许多安全优势。 它们包括:

  • 使用 Azure AD 凭据登录到 Azure Linux VM。
  • 获取基于 SSH 密钥的身份验证,无需向用户分发 SSH 密钥,或在部署的任何 Azure Linux VM 上预配 SSH 公钥。 相比需要担心过时 SSH 公钥蔓延而可能导致未经授权的访问,这种体验要简单得多。
  • 减少对本地管理员帐户、凭据盗用和弱凭据的依赖。
  • 通过为 Azure AD 配置密码复杂性和密码生存期策略,帮助维护 Linux VM 安全性。
  • 通过 RBAC,指定能够以常规用户或管理员特权用户身份登录到 VM 的人员。 当用户加入团队时,你可以更新 VM 的 Azure RBAC 策略,根据需要授予访问权限。 员工在离开你的组织时,其用户帐户会被禁用或从 Azure AD 中删除,然后他们就再也不能访问你的资源。
  • 使用条件访问来配置策略,以要求必须先通过多重身份验证或要求管理客户端设备(例如,合规设备或已建立混合 Azure AD 联接的设备),然后才能才能通过 SSH 连接到 Linux VM。
  • 使用 Azure 部署和审核策略来要求对 Linux VM 进行 Azure AD 登录,并标记未经批准的本地帐户。

使用 Azure Active Directory 登录 Linux VM 适用于使用 Active Directory 联合身份验证服务的客户。

受支持的 Linux 发行版和 Azure 区域

以下 Linux 发行版目前支持用于受支持区域中的部署:

分发 版本
通用基础 Linux Mariner (CBL-Mariner) CBL-Mariner 1、CBL-Mariner 2
CentOS CentOS 7、CentOS 8
Debian Debian 9、Debian 10、Debian 11
OpenSUSE openSUSE Leap 42.3、openSUSE Leap 15.1+
RedHat Enterprise Linux (RHEL) RHEL 7.4 至 RHEL 7.10、RHEL 8.3+
SUSE Linux Enterprise Server (SLES) SLES 12、SLES 15.1+
Ubuntu Server Ubuntu Server 16.04 到 Ubuntu Server 22.04

此功能目前支持以下 Azure 区域:

  • Azure 全球
  • Azure Government
  • Azure 中国世纪互联

不支持在 Azure Kubernetes 服务 (AKS) 群集上使用 Azure CLI 的 SSH 扩展。 有关详细信息,请参阅 AKS 的支持策略

如果选择在本地安装并使用 Azure CLI,它必须是 2.22.1 或更高版本。 运行 az --version 即可查找版本。 如需进行安装或升级,请参阅安装 Azure CLI

注意

此功能也适用于已启用 Azure Arc 的服务器

使用基于 openSSH 证书的身份验证满足 Azure AD 登录的要求

若要通过基于 SSH 证书的身份验证使 Azure AD 登录到 Azure 中的 Linux VM,请确保满足以下网络、虚拟机和客户端(SSH 客户端)要求。

网络

VM 网络配置必须允许通过 TCP 端口 443 对以下终结点进行出站访问。

Azure 全球:

  • https://packages.microsoft.com:用于包安装和升级。
  • http://169.254.169.254:Azure 实例元数据服务终结点。
  • https://login.microsoftonline.com:用于基于 PAM(可插入身份验证模块)的身份验证流。
  • https://pas.windows.net:用于 Azure RBAC 流。

Azure 政府:

  • https://packages.microsoft.com:用于包安装和升级。
  • http://169.254.169.254:Azure 实例元数据服务终结点。
  • https://login.microsoftonline.us:用于基于 PAM 的身份验证流。
  • https://pasff.usgovcloudapi.net:用于 Azure RBAC 流。

Azure 中国世纪互联:

  • https://packages.microsoft.com:用于包安装和升级。
  • http://169.254.169.254:Azure 实例元数据服务终结点。
  • https://login.chinacloudapi.cn:用于基于 PAM 的身份验证流。
  • https://pas.chinacloudapi.cn:用于 Azure RBAC 流。

虚拟机

确保 VM 配置了以下功能:

  • 系统分配的托管标识。 使用 Azure 门户创建 VM 并选择 Azure AD 登录选项时,会自动选择此选项。 还可使用 Azure CLI 在新的或现有 VM 上启用系统分配的托管标识。
  • aadsshloginaadsshlogin-selinux(按需选择)。 这些包与 AADSSHLoginForLinux VM 扩展一起安装。 使用 Azure 门户或 Azure CLI 创建 VM 并启用 Azure AD 登录(“管理”选项卡)时,将安装扩展。

客户端

确保客户端满足以下要求:

  • SSH 客户端支持基于 OpenSSH 的证书进行身份验证。 可以配合使用 Azure CLI(2.21.1 或更高版本)和 OpenSSH(包含在 Windows 10 1803 或更高版本中)或使用 Azure Cloud Shell 来满足此要求。

  • 适用于 Azure CLI 的 SSH 扩展。 使用 az extension add --name ssh 安装此扩展。 使用 Azure Cloud Shell 时,无需安装此扩展,因为它已预安装。

    如果使用 Azure CLI 或支持 OpenSSH 证书的 Azure Cloud Shell 以外的任何其他 SSH 客户端,则仍需使用具有 SSH 扩展的 Azure CLI 检索临时 SSH 证书以及可选的配置文件。 然后将配置文件用于 SSH 客户端。

  • 客户端到 VM 公共或专用 IP 地址的 TCP 连接。 (也可以使用 ProxyCommand 或 SSH 转发到已连接的计算机。)

重要

基于 PuTTy 的 SSH 客户端不支持 openSSH 证书,不能用于通过 Azure AD 基于 openSSH 证书的身份验证登录。

为 Azure 中的 Linux VM 启用 Azure AD 登录

若要在 Azure 中为 Linux VM 使用 Azure AD 登录,需要先为 Linux VM 启用 Azure AD 登录选项。 然后需要为有权登录到 VM 的用户配置 Azure 角色分配。 最后使用支持 OpensSSH 的 SSH 客户端(如 Azure CLI 或 Azure Cloud Shell)通过 SSH 连接到 Linux VM。

可以通过两种方式为 Linux VM 启用 Azure AD 登录:

  • 创建 Linux VM 时的 Azure 门户体验
  • 创建 Linux VM 或使用现有 Linux VM 时的 Azure Cloud Shell 体验

Azure 门户

可以使用 Azure 门户为任何受支持 Linux 发行版启用 Azure AD 登录。

例如,若要在 Azure 中使用 Azure AD 登录创建 Ubuntu Server 18.04 长期支持 (LTS) VM,请执行以下操作:

  1. 使用有权创建 VM 的帐户登录到 Azure 门户,然后选择“+ 创建资源”。
  2. 在“常用”视图中,选择“Ubuntu Server 18.04 LTS”下的“创建”。
  3. 在“管理”选项卡上:
    1. 选中“使用 Azure Active Directory 登录”复选框。
    2. 确保选中“系统分配的托管标识”复选框。
  4. 完成创建虚拟机的其余体验。 必须使用用户名和密码或 SSH 公钥创建管理员帐户。

Azure Cloud Shell

Azure Cloud Shell 是免费的交互式 shell,可以使用它运行本文中的操作步骤。 Cloud Shell 中预安装并配置了常用的 Azure 工具以供你的帐户使用。 只需要选择“复制”按钮来复制代码,将其粘贴到 Cloud Shell 中,然后选择 Enter 键来运行它。

可通过多种方式打开 Cloud Shell:

  • 选择代码块右上角的“试用”。
  • 在浏览器中打开 Cloud Shell。
  • 选择 Azure 门户右上角菜单上的“Cloud Shell”按钮。

根据本文的要求,如果选择在本地安装并使用 Azure CLI,则需要使用 2.22.1 或更高版本。 运行 az --version 即可查找版本。 如需进行安装或升级,请参阅安装 Azure CLI

  1. 运行 az group create 创建资源组。
  2. 运行 az vm create 创建 VM。 使用受支持区域中支持的发行版。
  3. 使用 az vm extension set 安装 Azure AD 登录 VM 扩展。

以下示例部署一个 VM,然后安装该扩展以启用适用于 Linux VM 的 Azure AD 登录。 VM 扩展是小型应用程序,可在 Azure 虚拟机上提供部署后配置和自动化任务。 可根据需要自定义该示例以支持测试要求。

az group create --name AzureADLinuxVM --location southcentralus
az vm create \
    --resource-group AzureADLinuxVM \
    --name myVM \	
    --image UbuntuLTS \
    --assign-identity \
    --admin-username azureuser \
    --generate-ssh-keys
az vm extension set \
    --publisher Microsoft.Azure.ActiveDirectory \
    --name AADSSHLoginForLinux \
    --resource-group AzureADLinuxVM \
    --vm-name myVM

创建 VM 和支持资源需要几分钟时间。

可使用运行中的 VM 代理在现有(受支持的分发版)Linux VM 上安装 AADSSHLoginForLinux 扩展,以启用 Azure AD 身份验证。 如果将此扩展部署到以前创建的 VM,必须为该 VM 至少分配 1 GB 内存,否则安装将会失败。

在 VM 上成功安装扩展时,将显示 SucceededprovisioningState 值。 VM 必须有一个正在运行的 VM 代理来安装扩展。

为 VM 配置角色分配

创建 VM 后,需要配置 Azure RBAC 策略来确定可登录到 VM 的人员。 使用两个 Azure 角色来授权 VM 登录:

  • 虚拟机管理员登录:分配了此角色的用户可以使用管理员权限登录到 Azure 虚拟机。
  • 虚拟机用户登录:分配了此角色的用户可以使用常规用户权限登录到 Azure 虚拟机。

要允许用户通过 SSH 登录 VM,必须将“虚拟机管理员登录”或“虚拟机用户登录”角色分配给包含 VM 及其关联的虚拟网络、网络接口、公共 IP 地址或负载均衡器资源的资源组。

为 VM 分配“所有者”或“参与者”角色的 Azure 用户不会自动获得在 Azure AD 中通过 SSH 登录到 VM 的特权。 控制虚拟机的用户群和可访问虚拟机的用户群之间存在有意的(和经过审核的)分隔。

可以通过两种方式配置 VM 的角色分配:

  • Azure AD 门户体验
  • Azure Cloud Shell 体验

注意

虚拟机管理员登录角色和虚拟机用户登录角色使用 dataActions,可以在管理组、订阅、资源组或资源范围内进行分配。 建议在管理组、订阅或资源级别而不是在单个 VM 级别分配角色。 此做法可避免每个订阅的 Azure 角色分配限制达到上限的风险。

Azure AD 门户

若要为启用 Azure AD 的 Linux VM 配置角色分配,请执行以下操作:

  1. 对于资源组,选择包含 VM 及其关联的虚拟网络、网络接口、公共 IP 或负载均衡器资源的“资源组”。

  2. 选择“访问控制 (IAM)”。

  3. 选择“添加”>“添加角色分配”,打开“添加角色分配”页面 。

  4. 分配以下角色。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

    设置
    角色 虚拟机管理员登录或虚拟机用户登录
    将访问权限分配到 用户、组、服务主体或托管标识

    显示在 Azure 门户中添加角色分配的页面的屏幕截图。

片刻之后,会在所选范围内为安全主体分配角色。

Azure Cloud Shell

以下示例使用 az role assignment create 为当前的 Azure 用户分配登录到 VM 所需的“虚拟机管理员登录名”角色。 使用 az account show 获取当前 Azure 帐户的用户名,使用 az vm show 将 scope 设置为在前面的步骤中创建的 VM。

还可以在资源组或订阅级别分配范围。 应用正常的 Azure RBAC 继承权限。

username=$(az account show --query user.name --output tsv)
rg=$(az group show --resource-group myResourceGroup --query id -o tsv)

az role assignment create \
    --role "Virtual Machine Administrator Login" \
    --assignee $username \
    --scope $rg

注意

如果 Azure AD 域和登录用户名域不匹配,则必须使用 --assignee-object-id 指定用户帐户的对象 ID,而不是仅指定 --assignee 的用户名。 可以使用 az ad user list 获取用户帐户的对象 ID。

要详细了解如何使用 Azure RBAC 管理对 Azure 订阅资源的访问权限,请参阅分配 Azure 角色的步骤

安装适用于 Azure CLI 的 SSH 扩展

如果使用 Azure Cloud Shell,则无需进行其他设置,因为 Azure CLI 的最低所需版本和适用于 Azure CLI 的 SSH 扩展均已包含在 Cloud Shell 环境中。

运行以下命令以添加适用于 Azure CLI 的 SSH 扩展:

az extension add --name ssh

扩展所需的最低版本为 0.1.4。 使用以下命令检查安装的版本:

az extension show --name ssh

强制执行条件访问策略

可以强制实施使用 Azure AD 登录时启用的条件访问策略,例如:

  • 要求多重身份验证。
  • 运行 SSH 客户端的设备要求为合规设备或已建立混合 Azure AD 联接的设备。
  • 在授权访问 Azure 中的 Linux VM 之前检查风险。

显示在条件访问策略中的应用程序称为“Azure Linux VM 登录”。

注意

要求设备符合标准或在运行 SSH 客户端的设备上建立混合 Azure AD 联接的条件访问策略实施仅适用于在 Windows 和 macOS 上运行的 Azure CLI。 在 Linux 或 Azure Cloud Shell 上使用 Azure CLI 时不受支持。

缺少应用程序

如果条件访问中缺少 Azure Linux VM 登录应用程序,请确保应用程序不在租户中:

  1. 登录到 Azure 门户。
  2. 浏览到“Azure Active Directory”>“企业应用程序”。
  3. 移除筛选器,查看所有应用程序,然后搜索“VM”。 如果搜索结果中没有 Azure Linux VM 登录,则租户中缺少服务主体。

另一种验证方法是通过 Graph PowerShell:

  1. 安装 Graph PowerShell SDK(如果尚未安装)。

  2. 输入命令 Connect-MgGraph -Scopes "ServicePrincipalEndpoint.ReadWrite.All","Application.ReadWrite.All"

  3. 使用全局管理员帐户登录。

  4. 同意请求权限的提示。

  5. 输入命令 Get-MgServicePrincipal -ConsistencyLevel eventual -Search '"DisplayName:Azure Linux VM Sign-In"'

    如果此命令不生成任何输出并返回到 PowerShell 提示符,则可以使用以下 Graph PowerShell 命令创建服务主体:New-MgServicePrincipal -AppId ce6ff14a-7fdc-4685-bbe0-f6afdfcfa8e0

    成功的输出将显示:应用 ID 和应用程序名称 Azure Linux VM 登录已创建。

  6. 使用以下命令退出登录 Graph PowerShell:Disconnect-MgGraph

使用 Azure AD 用户帐户登录以通过 SSH 连接到 Linux VM

使用 Azure CLI 进行登录

输入 az login。 此命令将打开浏览器窗口,可在其中使用 Azure AD 帐户登录。

az login 

然后输入 az ssh vm。 以下示例自动解析 VM 的适当 IP 地址。

az ssh vm -n myVM -g AzureADLinuxVM

根据系统提示,在登录页上输入 Azure AD 登录凭据,执行多重身份验证,和/或检查设备情况。 仅当 Azure CLI 会话尚不满足条件访问的任何所需条件时,才会出现提示。 关闭浏览器窗口,返回 SSH 提示符,然后你会自动连接到 VM。

现在,你已使用分配的角色权限(例如“VM 用户”或“VM 管理员”)登录到 Linux 虚拟机。 如果你的用户帐户分配有“虚拟机管理员登录名”角色,则可使用 sudo 来运行需要 root 特权的命令。

使用 Azure Cloud Shell 登录

可以使用 Azure Cloud Shell 连接到 VM,无需在本地将任何内容安装到客户端计算机。 选择 Azure 门户右上角的 shell 图标,启动 Cloud Shell。

Cloud Shell 会自动连接到已登录用户的上下文中的会话。 现在再次运行 az login,并通过交互式登录流:

az login

然后,可以使用一般的 az ssh vm 命令通过 VM 的名称和资源组或 IP 地址进行连接:

az ssh vm -n myVM -g AzureADLinuxVM

注意

使用 Azure Cloud Shell 时,不支持实施要求设备符合标准或建立混合 Azure AD 联接的条件访问策略。

使用 Azure AD 服务主体登录以通过 SSH 连接到 Linux VM

Azure CLI 支持使用服务主体而不是用户帐户进行身份验证。 由于服务主体帐户不关联到任何特定用户,因此客户可以使用它们通过 SSH 连接到 VM,为可能有的任何自动化方案提供支持。 必须为服务主体分配 VM 管理员或 VM 用户权限。 可在订阅或资源组级别分配权限。

以下示例在资源组级别向服务主体分配 VM 管理员权限。 替换服务主体“对象 ID”、“订阅 ID”和“资源组名称”的占位符。

az role assignment create \
    --role "Virtual Machine Administrator Login" \
    --assignee-object-id <service-principal-objectid> \
    --assignee-principal-type ServicePrincipal \
    --scope “/subscriptions/<subscription-id>/resourceGroups/<resourcegroup-name>"

使用以下示例通过服务主体对 Azure CLI 进行身份验证。 有关详细信息,请参阅使用服务主体登录到 Azure CLI 一文。

az login --service-principal -u <sp-app-id> -p <password-or-cert> --tenant <tenant-id>

使用服务主体完成身份验证后,请运行普通 Azure CLI SSH 命令连接到 VM:

az ssh vm -n myVM -g AzureADLinuxVM

导出 SSH 配置以用于支持 OpenSSH 的 SSH 客户端

使用 Azure AD 登录到 Azure Linux VM 支持导出 OpenSSH 证书和配置。 这意味着可以使用支持基于 OpenSSH 的证书的任何 SSH 客户端通过 Azure AD 进行登录。 以下示例导出分配给 VM 的所有 IP 地址的配置:

az ssh config --file ~/.ssh/config -n myVM -g AzureADLinuxVM

或者,也可通过只指定 IP 地址来导出配置。 将以下示例中的 IP 地址替换为 VM 的公共或专用 IP 地址。 (必须自行连接专用 IP。)输入 az ssh config -h 帮助运行此命令。

az ssh config --file ~/.ssh/config --ip 10.11.123.456

然后,可以通过正常使用 OpenSSH 连接到 VM。 可以通过使用 OpenSSH 的任何 SSH 客户端进行连接。

使用 Azure AD 登录运行 sudo

分配有“VM 管理员”角色的用户成功通过 SSH 连接到 Linux VM 后,他们就能运行 sudo,而无需进行任何其他交互或满足身份验证要求。 分配有“VM 用户”角色的用户无法运行 sudo。

连接到虚拟机规模集中的 VM

支持虚拟机规模集,但启用和连接到虚拟机规模集中的 VM 的步骤略有不同:

  1. 创建虚拟机规模集或选择已存在的规模集。 为虚拟机规模集启用系统分配的托管标识:

    az vmss identity assign --name myVMSS --resource-group AzureADLinuxVM
    
  2. 在虚拟机规模集上安装 Azure AD 扩展:

    az vmss extension set --publisher Microsoft.Azure.ActiveDirectory --name AADSSHLoginForLinux --resource-group AzureADLinuxVM --vmss-name myVMSS
    

虚拟机规模集通常没有公共 IP 地址。 必须从另一台可以访问 Azure 虚拟网络的计算机连接到这些虚拟机规模集。 此示例演示如何使用虚拟机规模集中 VM 的专用 IP 从同一虚拟网络中的计算机进行连接:

az ssh vm --ip 10.11.123.456

注意

无法使用 --resource-group--name 交换机自动确定虚拟机规模集 VM 的 IP 地址。

从之前的(预览)版本迁移

如果使用基于设备代码流的面向 Linux 的早期版本 Azure AD 登录,请使用 Azure CLI 完成以下步骤:

  1. 在 VM 上卸载 AADLoginForLinux 扩展:

    az vm extension delete -g MyResourceGroup --vm-name MyVm -n AADLoginForLinux
    

    注意

    如果 VM 上目前有任何 Azure AD 用户登录,卸载扩展可能会失败。 请确保首先注销所有用户。

  2. 在 VM 上启用系统分配的托管标识:

    az vm identity assign -g myResourceGroup -n myVm
    
  3. 在 VM 上安装 AADSSHLoginForLinux 扩展:

    az vm extension set \
        --publisher Microsoft.Azure.ActiveDirectory \
        --name AADSSHLoginForLinux \
        --resource-group myResourceGroup \
        --vm-name myVM
    

使用 Azure Policy 满足标准并评估合规性

使用 Azure Policy 可以:

  • 确保为新的和现有的 Linux 虚拟机启用 Azure AD 登录。
  • 在合规性仪表板上大规模评估环境的合规性。

借助此功能,可以使用多个强制实施级别。 你可以标记环境中未启用 Azure AD 登录的新的和现有 Linux VM。 还可以使用 Azure Policy 在未启用 Azure AD 登录的新 Linux VM 上部署 Azure AD 扩展,并按照相同的标准来修正现有的 Linux VM。

除这些功能以外,还可以使用 Azure Policy 来检测并标记在其计算机上创建了未批准的本地帐户的 Linux VM。 若要了解详细信息,请参阅 Azure Policy

排查登录问题

使用以下部分来更正在尝试使用 Azure AD 凭证进行 SSH 时可能发生的常见错误。

无法从本地缓存中检索令牌

如果收到一条消息,指出无法从本地缓存中检索令牌,则必须再次运行 az login 并通过交互式登录流。 查看有关使用 Azure Cloud Shell 登录的部分。

拒绝访问:未分配 Azure 角色

如果在 SSH 提示符窗口中看到错误“未分配 Azure 角色”,请验证是否已为授予用户虚拟机管理员登录名或虚拟机用户登录名角色的 VM 配置 Azure RBAC 策略。 如果在 Azure 角色分配方面遇到问题,请参阅排查 Azure RBAC 的问题一文。

删除旧 (AADLoginForLinux) 扩展时出现问题

如果卸载脚本失败,该扩展可能会卡在“正在转换”状态。 发生这种情况时,扩展可能会遗留一些在移除过程中本应卸载的包。 对于这种情况,最好是手动卸载旧包,然后尝试运行 az vm extension delete 命令。

卸载旧包:

  1. 以具有管理员权限的本地用户身份登录。
  2. 确保没有任何用户已登录到 Azure AD。 调用 who -u 命令查看已登录的用户。 然后针对前一个命令报告的所有会话进程使用 sudo kill <pid>
  3. 运行 sudo apt remove --purge aadlogin (Ubuntu/Debian)、sudo yum erase aadlogin(RHEL 或 CentOS)或 sudo zypper remove aadlogin(openSUSE 或 SLES)。
  4. 如果命令失败,请在禁用脚本的情况下尝试使用低级别工具:
    1. 对于 Ubuntu/Debian,请运行 sudo dpkg --purge aadlogin。 如果由于脚本问题而仍然失败,请删除 /var/lib/dpkg/info/aadlogin.prerm 文件并重试。
    2. 对于其他任何平台,请运行 rpm -e –noscripts aadogin
  5. 对包 aadlogin-selinux 重复步骤 3-4。

扩展安装错误

将 AADSSHLoginForLinux VM 扩展安装到现有计算机可能会失败,并出现以下已知错误代码之一。

非零退出代码 22

如果获得退出代码 22,则 AADSSHLoginForLinux VM 扩展的状态在门户中显示为“正在转换”。

发生此故障的原因是需要系统分配的托管标识。

解决方案是:

  1. 卸载失败的扩展。
  2. 在 Azure VM 上启用系统分配的托管标识。
  3. 再次运行扩展安装命令。

非零退出代码 23

如果获得退出代码 23,则 AADSSHLoginForLinux VM 扩展的状态在门户中显示为“正在转换”。

如果仍安装较旧的 AADLoginForLinux VM 扩展,就会发生此故障。

解决方案是从 VM 中卸载较旧的 AADLoginForLinux VM 扩展。 新 AADSSHLoginForLinux VM 扩展的状态将在门户中更改为“预配成功”。

az ssh vm 命令失败,并出现 KeyError access_token

如果 az ssh vm 命令失败,说明使用的是过时的 Azure CLI 版本。

解决方案是将 Azure CLI 客户端升级到 2.21.0 或更高版本。

SSH 连接已关闭

用户使用 az login 成功登录后,通过 az ssh vm -ip <address>az ssh vm --name <vm_name> -g <resource_group> 连接到 VM 可能会失败,并出现“连接被 <ip_address> 端口 22 关闭”。

发生此错误的一个原因是未在此 VM 范围内为用户分配虚拟机管理员登录或虚拟机用户登录角色。 在这种情况下,解决方案是将此 VM 范围内的用户添加到其中一个 Azure RBAC 角色。

如果用户具有所需的 Azure RBAC 角色,但已在 VM 上禁用系统分配的托管标识,也会发生此错误。 在这种情况下,请执行以下操作:

  1. 在 VM 上启用系统分配的托管标识。
  2. 让用户等待几分钟再尝试使用 az ssh vm --ip <ip_address> 进行连接。

虚拟机规模集的连接问题

如果规模集实例正在运行旧模型,则虚拟机规模集 VM 连接可能会失败。

将规模集实例升级到最新模型可能会解决问题,尤其是自安装 Azure AD 登录扩展以来尚未进行升级的情况下。 升级实例会将标准规模集配置应用于单个实例。

sshd_config 中的 AllowGroups 或 DenyGroups 语句导致 Azure AD 用户首次登录失败

如果 sshd_config 包含 AllowGroupsDenyGroups 语句,则 Azure AD 用户的首次登录会失败。 如果该语句是在用户已经成功登录后添加的,则他们可以登录。

一种解决方案是从 sshd_config 中移除 AllowGroupsDenyGroups 语句。

另一种解决方案是将 AllowGroupsDenyGroups 移动到 sshd_config 中的 match user 部分。 确保匹配模板不包括 Azure AD 用户。

后续步骤