VMAccess 扩展用于对管理用户进行管理、配置 SSH 以及检查或修复 Azure Linux 虚拟机上的磁盘。 该扩展集成了 Azure 资源管理器模板。 还可以使用 Azure CLI、Azure PowerShell、Azure 门户和 Azure 虚拟机 REST API 调用它。
本文介绍如何通过 Azure CLI 和 Azure 资源管理器模板运行 VMAccess 扩展。 本文还提供针对 Linux 系统的疑难解答步骤。
注释
如果你在安装 Microsoft Entra Login 扩展组件后使用 VMAccess 扩展重置 VM 的密码,请重新运行 Microsoft Entra Login 扩展组件,为 VM 重新启用 Microsoft Entra Login。
先决条件
支持的 Linux 分发
Linux 发行版 | x64 | ARM64 |
---|---|---|
Alma Linux | 9.x+ | 9.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
文件,然后对其进行修改。 它将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 | date |
出版商 | Microsoft.OSTCExtensions | 字符串 |
类型 | VMAccessForLinux | 字符串 |
typeHandlerVersion | 1.5 | 整数 (int) |
设置属性值
名称 | 数据类型 | DESCRIPTION |
---|---|---|
check_disk | 布尔 | 是否检查磁盘(可选)。 只能将介于 check_disk 和 repair_disk 之间的一个设置为 true。 |
repair_disk | 布尔 | 是否检查磁盘(可选)。 只能将介于 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。 |
remove_prior_keys | 布尔 | 添加新密钥时是否移除旧的 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 login 登录到 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/VMSS 扩展命令
还可以使用 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
如需更多帮助,可以提交 Azure 支持事件。 转到 Azure 门户,然后选择“获取支持”。 有关 Azure 支持的详细信息,请阅读 Azure 支持计划 FAQ。
后续步骤
要查看代码、当前版本和其他文档,请参阅《VMAccess Linux - GitHub》。