VMAccess 扩展用于对管理用户进行管理、配置 SSH 以及检查或修复 Azure Linux 虚拟机上的磁盘。 该扩展集成了 Azure 资源管理器模板。 还可以使用 Azure CLI、Azure PowerShell、Azure 门户和 Azure 虚拟机 REST API 调用它。
本文介绍如何通过 Azure CLI 和 Azure 资源管理器模板运行 VMAccess 扩展。 本文还提供针对 Linux 系统的疑难解答步骤。
注释
如果在安装 Microsoft Entra 登录扩展后使用 VMAccess 扩展重置 VM 的密码,请重新运行 Microsoft Entra 登录扩展,为 VM 重新启用Microsoft Entra 登录。
先决条件
支持的 Linux 分发
| 发布者 | 分销 | x64 | ARM64 | 
|---|---|---|---|
| Alma Linux 社区 | Alma Linux | 8.x+、9.x+ | 8.x+、9.x+ | 
| Credativ | Debian | 10+ | 11.x+ | 
| Microsoft | Azure Linux | 2.x | 2.x | 
| openSUSE 项目 | OpenSUSE | 12.3+ | 不支持 | 
| CIQ | Rocky Linux | 9.x+ | 9.x+ | 
| SUSE | SLES | 12.x+、15.x+ | 15.x SP4+ | 
| Canonical | Ubuntu (LTS 版本) | 18.04+, 20.04+, 22.04+, 24.04+ | 20.04+, 22.04+, 24.04+ | 
提示
- VMAccess 旨在重新获得对 VM 的访问权限(如果丢失了该权限)。 基于此原则,它会向用户名字段中指定的帐户授予 sudo 权限。 如果不希望用户获得 sudo 权限,请登录到 VM 并使用内置工具(例如 usermod、change 等)来管理非特权用户。
- 只能向一台 VM 应用一个扩展版本。 要运行另一个操作,可使用新配置更新现有扩展。
- 在用户更新期间,VMAccess 会先备份 sshd_config文件,然后对其进行修改。 它将ChallengeResponseAuthentication更改为no,并将PasswordAuthentication更改为yes。 要还原原始的已备份 SSH 配置,请在将restore_backup_ssh设置为True后运行 VMAccess。
扩展架构
VMAccess 扩展配置包括用户名、密码、SSH 密钥等的设置。可将此信息存储在配置文件中、在命令行中指定该信息,或者将其包括在 Azure 资源管理器模板中。 以下 JSON 架构包含可用于公共和受保护设置的所有属性。
{
  "type": "Microsoft.Compute/virtualMachines/extensions",
  "name": "<name>",
  "apiVersion": "2023-09-01",
  "location": "<location>",
  "dependsOn": [
          "[concat('Microsoft.Compute/virtualMachines/', <vmName>)]"
  ],
  "properties": {
    "publisher": "Microsoft.OSTCExtensions",
    "type": "VMAccessForLinux",
    "typeHandlerVersion": "1.5",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "check_disk": true,
      "repair_disk": false,
      "disk_name": "<disk-name>",
    },
    "protectedSettings": {
      "username": "<username>",
      "password": "<password>",
      "ssh_key": "<ssh-key>",
      "reset_ssh": false,
      "remove_user": "<username>",
      "expiration": "<expiration>",
      "remove_prior_keys": false,
      "restore_backup_ssh": true
    } 
  }
}
属性值
| 名称 | 值/示例 | 数据类型 | 
|---|---|---|
| apiVersion | 2023-09-01 | 日期 | 
| 发布服务器 | Microsoft.OSTCExtensions | 字符串 | 
| 类型 | VMAccessForLinux | 字符串 | 
| typeHandlerVersion | 1.5 | 整数 (int) | 
设置属性值
| 名称 | 数据类型 | DESCRIPTION | 
|---|---|---|
| check_disk | 布尔 | 是否检查磁盘(可选)。 只能将介于 check_disk和repair_disk之间的一个设置为 true。 | 
| 修复磁盘 | 布尔 | 是否检查磁盘(可选)。 只能将介于 check_disk和repair_disk之间的一个设置为 true。 | 
| 磁盘名称 (disk_name) | 字符串 | 要修复的磁盘的名称(当 repair_disk为 true 时是必需的)。 | 
| 用户名 | 字符串 | 要管理的用户的名称(用户帐户上的所有操作都需要)。 | 
| 密码 | 字符串 | 要为用户帐户设置的密码。 | 
| ssh_key | 字符串 | 要为用户帐户添加的 SSH 公钥。 SSH 密钥可以采用 ssh-rsa、ssh-ed25519或.pem格式。 | 
| reset_ssh | 布尔 | 是否重置 SSH。 如果为 true,它会将 sshd_config 文件替换为与该发行版的默认 SSH 配置对应的内部资源文件。 | 
| 移除用户 | 字符串 | 要移除的用户的名称。 不能与 reset_ssh、restore_backup_ssh和password一起使用。 | 
| 到期 | 字符串 | 要为帐户设置的过期日期,格式为 yyyy-mm-dd。 默认值为 never。 | 
| 删除先前的键 | 布尔 | 添加新密钥时是否移除旧的 SSH 密钥。 必须与 ssh_key一起使用。 | 
| restore_backup_ssh | 布尔 | 是否还原原始的已备份 sshd_config。 | 
模板部署
可使用 Azure 资源管理器 (ARM) 模板部署 Azure VM 扩展。 上一部分中详细说明的 JSON 架构可用于 ARM 模板,以在模板部署期间运行 VMAccess 扩展。 可在 GitHub 上找到包含 VMAccess 扩展的示例模板。
虚拟机扩展的 JSON 配置必须嵌套在模板的虚拟机资源片段中,具体来说是嵌套在虚拟机模板的 "resources": [] 对象中,对于虚拟机规模集而言,是嵌套在 "virtualMachineProfile":"extensionProfile":{"extensions" :[] 对象下。
Azure CLI 部署
使用 Azure CLI VM 用户命令
az vm user 下的以下 CLI 命令使用 VMAccess 扩展。 若要使用这些命令,需要 安装最新的 Azure CLI 并使用 az 登录登录到 Azure 帐户。
更新 SSH 密钥
以下示例更新名为 azureUser 的 VM 上用户 myVM 的 SSH 密钥:
az vm user update \
  --resource-group myResourceGroup \
  --name myVM \
  --username azureUser \
  --ssh-key-value ~/.ssh/id_rsa.pub
注释
              
              az vm user update 命令将新公钥文本追加到 VM 上管理员用户的 ~/.ssh/authorized_keys 文件。 此命令不会替换或删除任何现有的 SSH 密钥。 此命令不会使用 VMAccess 扩展移除部署时设置的先前密钥或后续更新。
重置密码
以下示例重置名为 azureUser 的 VM 上用户 myVM 的密码:
az vm user update \
  --resource-group myResourceGroup \
  --name myVM \
  --username azureUser \
  --password myNewPassword
重启 SSH
下面的示例将在名为 myVM 的 VM 上重启 SSH 守护程序,并将 SSH 配置重置为默认值:
az vm user reset-ssh \
  --resource-group myResourceGroup \
  --name myVM
注释
              
              az vm user reset-ssh 命令可将 sshd_config 文件替换为内部资源目录中的默认配置文件。 此命令不会还原在虚拟机上找到的原始 SSH 配置。
创建管理员/sudo 用户
以下示例创建名为 myNewUser、具有 sudo 权限的用户  。 此帐户使用 SSH 密钥在名为 myVM 的 VM 上进行身份验证。 丢失或忘记当前凭据时,此方法有助于重新获取对 VM 的访问权限。 作为最佳做法,应限制具有 sudo 权限的帐户  。
az vm user update \
  --resource-group myResourceGroup \
  --name myVM \
  --username myNewUser \
  --ssh-key-value ~/.ssh/id_rsa.pub
删除用户
以下示例将删除名为 myNewUser 的 VM 上名为 myVM 的用户:
az vm user delete \
  --resource-group myResourceGroup \
  --name myVM \
  --username myNewUser
使用 Azure CLI VM/虚拟机规模集扩展命令
还可以使用 az vm extension set 和 az vmss extension set 命令通过指定配置运行 VMAccess 扩展。
az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM \
  --name VMAccessForLinux \
  --publisher Microsoft.OSTCExtensions \
  --version 1.5 \
  --settings '{"check_disk":true}'
  --protected-settings '{"username":"user1","password":"userPassword"}'
参数 --settings 和 --protected-settings 也接受 JSON 文件路径。 例如,要更新用户的 SSH 公钥,请创建名为 update_ssh_key.json 的 JSON 文件并按以下格式添加设置。 将文件中的值替换为自己的信息:
{
  "username":"azureuser",
  "ssh_key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCZ3S7gGp3rcbKmG2Y4vGZFMuMZCwoUzZNGxxxxxx2XV2x9FfAhy8iGD+lF8UdjFX3t5ebMm6BnnMh8fHwkTRdOt3LDQq8o8ElTBrZaKPxZN2thMZnODs5Hlemb2UX0oRIGRcvWqsd4oJmxsXa/Si98Wa6RHWbc9QZhw80KAcOVhmndZAZAGR+Wq6yslNo5TMOr1/ZyQAook5C4FtcSGn3Y+WczaoGWIxG4ZaWk128g79VIeJcIQqOjPodHvQAhll7qDlItVvBfMOben3GyhYTm7k4YwlEdkONm4yV/UIW0la1rmyztSBQIm9sZmSq44XXgjVmDHNF8UfCZ1ToE4r2SdwTmZv00T2i5faeYnHzxiLPA3Enub7xxxxxxwFArnqad7MO1SY1kLemhX9eFjLWN4mJe56Fu4NiWJkR9APSZQrYeKaqru4KUC68QpVasNJHbuxPSf/PcjF3cjO1+X+4x6L1H5HTPuqUkyZGgDO4ynUHbko4dhlanALcriF7tIfQR9i2r2xOyv5gxJEW/zztGqWma/d4rBoPjnf6tO7rLFHXMt/DVTkAfn5wxxtLDwkn5FMyvThRmex3BDf0gujoI1y6cOWLe9Y5geNX0oj+MXg/W0cXAtzSFocstV1PoVqy883hNoeQZ3mIGB3Q0rIUm5d9MA2bMMt31m1g3Sin6EQ== azureuser@myVM"
}
通过以下命令运行 VMAccess 扩展:
az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM \
  --name VMAccessForLinux \
  --publisher Microsoft.OSTCExtensions \
  --version 1.5 \
  --protected-settings update_ssh_key.json
Azure PowerShell 部署
可以使用 Azure PowerShell 将 VMAccess 扩展部署到现有虚拟机或虚拟机规模集。 可以通过运行以下项将扩展部署到 VM:
$username = "<username>"
$sshKey = "<cert-contents>"
$settings = @{"check_disk" = $true};
$protectedSettings = @{"username" = $username; "ssh_key" = $sshKey};
Set-AzVMExtension -ResourceGroupName "<resource-group>" `
    -VMName "<vm-name>" `
    -Location "<location>" `
    -Publisher "Microsoft.OSTCExtensions" `
    -ExtensionType "VMAccessForLinux" `
    -Name "VMAccessForLinux" `
    -TypeHandlerVersion "1.5" `
    -Settings $settings `
    -ProtectedSettings $protectedSettings
还可以使用字符串提供和修改扩展设置:
$username = "<username>"
$sshKey = "<cert-contents>"
$settingsString = '{"check_disk":true}';
$protectedSettingsString = '{"username":"' + $username + '","ssh_key":"' + $sshKey + '"}';
Set-AzVMExtension -ResourceGroupName "<resource-group>" `
    -VMName "<vm-name>" `
    -Location "<location>" `
    -Publisher "Microsoft.OSTCExtensions" `
    -ExtensionType "VMAccessForLinux" `
    -Name "VMAccessForLinux" `
    -TypeHandlerVersion "1.5" `
    -SettingString $settingsString `
    -ProtectedSettingString $protectedSettingsString
要部署到虚拟机规模集,请运行以下命令:
$resourceGroupName = "<resource-group>"
$vmssName = "<vmss-name>"
$protectedSettings = @{
  "username" = "azureUser"
  "password" = "userPassword"
}
$publicSettings = @{
  "repair_disk" = $true
  "disk_name" = "<disk_name>"
}
$vmss = Get-AzVmss `
            -ResourceGroupName $resourceGroupName `
            -VMScaleSetName $vmssName
Add-AzVmssExtension -VirtualMachineScaleSet $vmss `
    -Name "<extension-name>" `
    -Publisher "Microsoft.OSTCExtensions" `
    -Type "VMAccessForLinux" `
    -TypeHandlerVersion "1.5"" `
    -AutoUpgradeMinorVersion $true `
    -Setting $publicSettings `
    -ProtectedSetting $protectedSettings
Update-AzVmss `
    -ResourceGroupName $resourceGroupName `
    -Name $vmssName `
    -VirtualMachineScaleSet $vmss
故障排除和支持
VMAccess 扩展日志存在于 VM 本地,并且在进行故障排除时,能够提供丰富的信息。
| 位置 | DESCRIPTION | 
|---|---|
| /var/log/waagent.log | 包含 Linux 代理中的日志,并显示何时更新扩展。 我们可以检查一下,以确保扩展程序正在运行。 | 
| /var/log/azure/Microsoft.OSTCExtensions.VMAccessForLinux/* | VMAccess 扩展会生成可在此处找到的日志。 该目录包含 CommandExecution.log,可在其中找到执行的每个命令及其结果,以及包含每个执行的单个日志的extension.log。 | 
| /var/lib/waagent/Microsoft.OSTCExtensions.VMAccessForLinux-<最新版本>/config/* | VMAccess VM 扩展的配置和二进制文件。 | 
还可以运行以下命令来检索 VMAccess 扩展的执行状态以及给定 VM 上的其他扩展:
az vm extension list --resource-group myResourceGroup --vm-name myVM -o table
错误消息
| 错误 | DESCRIPTION | 
|---|---|
| 虚拟机扩展 enablevmaccess 的预配已超时。完成扩展预配花费的时间过长。 扩展未报告消息。 有关故障排除的更多信息,请访问https://aka.ms/vmextensionlinuxtroubleshoot。 | 该错误消息表示虚拟机扩展 "enablevmaccess" 的预配由于完成时间过长而超时。 此外,扩展在此过程中未提供任何状态消息。 要解决此问题,请考虑检查虚拟机的性能和网络状况,然后重试预配操作。 有关更多信息,请参阅对虚拟机扩展进行故障排除。 | 
| VM 在处理扩展“enablevmaccess”(发布者“Microsoft.OSTCExtensions”和键入“VMAccessForLinux”)时报告了失败。 错误消息:“启用失败:未指定密码或ssh_key。 有关故障排除的更多信息,请访问 https://aka.ms/vmextensionlinuxtroubleshoot。 | 错误消息指示 VM 无法处理“enablevmaccess”扩展,因为未指定密码或 SSH 密钥。 此失败与“Microsoft.OSTCExtensions”发布服务器和“VMAccessForLinux”类型相关联。 若要解决此问题,请确保在扩展配置期间提供密码或 SSH 密钥。 | 
如需更多帮助,可以提交 Azure 支持事件。 转到 Azure 门户,然后选择“获取支持”。 有关 Azure 支持的详细信息,请阅读 Azure 支持计划 FAQ。
后续步骤
要查看代码、当前版本和其他文档,请参阅《VMAccess Linux - GitHub》。