适用于 Linux 的 VMAccess 扩展

注意

本文引用了 CentOS,这是一个接近生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑你的使用和规划。 有关详细信息,请参阅 CentOS 生命周期结束指南

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 重新启用 Azure AD 登录。

先决条件

支持的 Linux 分发

Linux 发行版 x64 ARM64
Alma Linux 9.x+ 9.x+
CentOS 7.x+、8.x+ 7.x+
Debian 10+ 11.x+
Azure Linux 2.x 2.x
OpenSUSE 12.3+ 不支持
Rocky Linux 9.x+ 9.x+
SLES 12.x+、15.x+ 15.x SP4+
Ubuntu 18.04+、20.04+、22.04+ 20.04+、22.04+

提示

  • VMAccess 旨在重新获得对 VM 的访问权限(如果丢失了该权限)。 基于此原则,它会向用户名字段中指定的帐户授予 sudo 权限。 如果不希望用户获得 sudo 权限,请登录到 VM 并使用内置工具(例如 usermod、chage 等)管理非特权用户。
  • 只能向一台 VM 应用一个扩展版本。 要运行另一个操作,可使用新配置更新现有扩展。
  • 在用户更新期间,VMAccess 会在事先备份 sshd_config 文件后备份该文件。 要还原原始的已备份 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 date
publisher Microsoft.OSTCExtensions string
type VMAccessForLinux string
typeHandlerVersion 1.5 int

设置属性值

名称 数据类型 描述
check_disk boolean 是否检查磁盘(可选)。 只能将介于 check_diskrepair_disk 之间的一个设置为 true。
repair_disk boolean 是否检查磁盘(可选)。 只能将介于 check_diskrepair_disk 之间的一个设置为 true。
disk_name string 要修复的磁盘的名称(当 repair_disk 为 true 时是必需的)。
username string 要管理的用户的名称(用户帐户上的所有操作都需要)。
password string 要为用户帐户设置的密码。
ssh_key string 要为用户帐户添加的 SSH 公钥。 SSH 密钥可以采用 ssh-rsassh-ed25519.pem 格式。
reset_ssh boolean 是否重置 SSH。 如果为 true,它会将 sshd_config 文件替换为与该发行版的默认 SSH 配置对应的内部资源文件。
remove_user string 要移除的用户的名称。 不能与 reset_sshrestore_backup_sshpassword 一起使用。
expiration string 要为帐户设置的过期日期,格式为 yyyy-mm-dd。 默认值为“从不”。
remove_prior_keys boolean 添加新密钥时是否移除旧的 SSH 密钥。 必须与 ssh_key 一起使用。
restore_backup_ssh boolean 是否还原原始备份的 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 login 登录到 Azure 帐户。

更新 SSH 密钥

以下示例更新名为 myVM 的 VM 上用户 azureUser 的 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 扩展移除部署时设置的先前密钥或后续更新。

重置密码

以下示例重置名为 myVM 的 VM 上用户 azureUser 的密码:

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

删除用户

以下示例将删除名为 myVM 的 VM 上名为 myNewUser 的用户:

az vm user delete \
  --resource-group myResourceGroup \
  --name myVM \
  --username myNewUser

使用 Azure CLI VM/VMSS 扩展命令

还可以使用 az vm extension setaz 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 本地,并且在进行故障排除时,能够提供丰富的信息。

位置 说明
/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

如果需要更多帮助,可以联系 Azure 社区支持中的 Azure 专家。 或者,你也可以提出 Azure 支持事件。 转到 Azure 门户,然后选择“获取支持”。 有关 Azure 支持的详细信息,请阅读 Azure 支持计划 FAQ

后续步骤

要查看代码、当前版本和其他文档,请参阅《VMAccess Linux - GitHub》。