如何使用 Secure Shell (SSH) 连接并登录到运行 Windows 的 Azure 虚拟机
适用于:✔️ Windows VM ✔️ 灵活规模集
Win32 OpenSSH 项目通过在 Windows 中提供原生支持,实现使用 Secure Shell 进行远程连接。 该功能在 Windows Server 2019 及更高版本中提供,并且可以使用虚拟机 (VM) 扩展添加到旧版 Windows。
以下示例使用变量。 可以在环境中设置变量,如下所示。
Shell |
示例 |
Bash/ZSH |
myResourceGroup='resGroup10' |
PowerShell |
$myResourceGroup='resGroup10' |
启用 SSH
首先,你需要在 Windows 计算机中启用 SSH。
部署适用于 Windows 的 SSH 扩展: 该扩展提供了 Win32 OpenSSH 解决方案的自动安装,类似于在较新版本的 Windows 中启用该功能。 使用以下示例部署扩展。
az vm extension set --resource-group $myResourceGroup --vm-name $myVM --name WindowsOpenSSH --publisher Microsoft.Azure.OpenSSH --version 3.0
Set-AzVMExtension -ResourceGroupName $myResourceGroup -VMName $myVM -Name 'OpenSSH' -Publisher 'Microsoft.Azure.OpenSSH' -Type 'WindowsOpenSSH' -TypeHandlerVersion '3.0'
{
"type": "Microsoft.Compute/virtualMachines/extensions",
"name": "[concat(parameters('VMName'), '/WindowsOpenSSH')]",
"apiVersion": "2020-12-01",
"location": "[parameters('location')]",
"properties": {
"publisher": "Microsoft.Azure.OpenSSH",
"type": "WindowsOpenSSH",
"typeHandlerVersion": "3.0"
}
}
resource windowsOpenSSHExtension 'Microsoft.Compute/virtualMachines/extensions@2020-12-01' = {
parent: virtualMachine
name: 'WindowsOpenSSH'
location: resourceGroup().location
properties: {
publisher: 'Microsoft.Azure.OpenSSH'
type: 'WindowsOpenSSH'
typeHandlerVersion: '3.0'
}
}
打开 TCP 端口
确保打开适当的端口(默认为 TCP 22)以允许连接到 VM。
az network nsg rule create -g $myResourceGroup --nsg-name $myNSG -n allow-SSH --priority 1000 --source-address-prefixes 208.130.28.4/32 --destination-port-ranges 22 --protocol TCP
Get-AzNetworkSecurityGroup -Name $MyNSG -ResourceGroupName $myResourceGroup | Add-AzNetworkSecurityRuleConfig -Name allow-SSH -access Allow -Direction Inbound -Priority 1000 -SourceAddressPrefix 208.130.28.4/32 -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange 22 -Protocol TCP | Set-AzNetworkSecurityGroup
{
"type": "Microsoft.Network/networkSecurityGroups/securityRules",
"apiVersion": "2021-08-01",
"name": "allow-SSH",
"properties": {
"access": "Allow",
"destinationAddressPrefix": "*",
"destinationPortRange": "22",
"direction": "Inbound",
"priority": "1000",
"protocol": "TCP",
"sourceAddressPrefix": "208.130.28.4/32",
"sourcePortRange": "*"
}
}
resource allowSSH 'Microsoft.Network/networkSecurityGroups/securityRules@2021-08-01' = {
name: 'allowSSH'
parent: MyNSGSymbolicName
properties: {
access: 'Allow'
destinationAddressPrefix: '*'
destinationPortRange: 'string'
destinationPortRanges: [
'22'
]
direction: 'Inbound'
priority: 1000
protocol: 'TCP'
sourceAddressPrefix: '208.130.28.4/32'
sourcePortRange: '*'
}
}
VM 必须使用公共 IP 地址。 要检查 VM 是否具有公共 IP 地址,请从左侧菜单中选择“概述”,然后查看“网络”部分。 如果看到“公共 IP 地址”旁边有一个 IP 地址,则 VM 具有公共 IP。 要了解有关将公共 IP 地址添加到现有 VM 的详细信息,请参阅将公共 IP 地址关联到虚拟机
验证 VM 是否正在运行。 在“概述”选项卡上的“概要”部分中,验证 VM 的状态是否为“正在运行”。 若要启动 VM,请在页面顶部,选择“启动”。
身份验证
可以使用用户名和密码或 SSH 密钥向 Windows 计算机进行身份验证。 Azure 不支持自动向 Windows 计算机预配公钥,但可以使用 RunCommand 扩展复制密钥。
SSH 和密钥概述
SSH 是一种加密的连接协议,利用该协议可以通过未受保护的连接进行安全登录。 虽然 SSH 提供加密连接,但是将密码用于 SSH 连接仍会使 VM 易受到暴力攻击。 建议使用公钥-私钥对(也称为“SSH 密钥”)通过 SSH 连接到 VM。
当你使用 SSH 客户端连接到 VM(具有公钥)时,远程 VM 会测试客户端以确保其具有正确的私钥。 如果客户端具有私钥,则授予其访问 VM 的权限。
根据组织的安全策略,可重复使用单个公钥-私钥对来访问多个 Azure VM 和服务。 无需对要访问的每个 VM 或服务使用单独的密钥对。
可与任何人共享公钥;但只有你(或本地安全基础结构)才应具有对私钥的访问权限。
Azure 目前支持以下密钥类型:
- SSH 协议 2 (SSH-2) RSA(Rivest、Shamir、Adleman),最小长度为 2048 位
- ED25519 密钥,固定长度为 256 位
目前不支持其他密钥格式,例如椭圆曲线 Diffie-Hellman (ECDH) 和椭圆曲线数字签名算法 (ECDSA)。
使用 RunCommand 扩展复制公钥。
RunCommand 扩展提供了一种简单的解决方案,用于将公钥复制到 Windows 计算机,并确保文件具有正确的权限。
az vm run-command invoke -g $myResourceGroup -n $myVM --command-id RunPowerShellScript --scripts "MYPUBLICKEY | Add-Content 'C:\ProgramData\ssh\administrators_authorized_keys' -Encoding UTF8;icacls.exe 'C:\ProgramData\ssh\administrators_authorized_keys' /inheritance:r /grant 'Administrators:F' /grant 'SYSTEM:F'"
Invoke-AzVMRunCommand -ResourceGroupName $myResourceGroup -VMName $myVM -CommandId 'RunPowerShellScript' -ScriptString "MYPUBLICKEY | Add-Content 'C:\ProgramData\ssh\administrators_authorized_keys' -Encoding UTF8;icacls.exe 'C:\ProgramData\ssh\administrators_authorized_keys' /inheritance:r /grant 'Administrators:F' /grant 'SYSTEM:F'"
{
"type": "Microsoft.Compute/virtualMachines/runCommands",
"apiVersion": "2022-03-01",
"name": "[concat(parameters('VMName'), '/RunPowerShellScript')]",
"location": "[parameters('location')]",
"properties": {
"timeoutInSeconds":600
"source": {
"script": "MYPUBLICKEY | Add-Content 'C:\\ProgramData\\ssh\\administrators_authorized_keys -Encoding UTF8';icacls.exe 'C:\\ProgramData\\ssh\\administrators_authorized_keys' /inheritance:r /grant 'Administrators:F' /grant 'SYSTEM:F'"
}
}
}
resource runPowerShellScript 'Microsoft.Compute/virtualMachines/runCommands@2022-03-01' = {
name: 'RunPowerShellScript'
location: resourceGroup().location
parent: virtualMachine
properties: {
timeoutInSeconds: 600
source: {
script: "MYPUBLICKEY | Add-Content 'C:\ProgramData\ssh\administrators_authorized_keys' -Encoding UTF8;icacls.exe 'C:\ProgramData\ssh\administrators_authorized_keys' /inheritance:r /grant 'Administrators:F' /grant 'SYSTEM:F'"
}
}
}
使用 Az CLI 进行连接
使用 Az SSH
命令连接到 Windows 计算机。
az ssh vm -g $myResourceGroup -n $myVM --local-user $myUsername
还可以通过 SSH 连接为特定 TCP 端口创建网络隧道。 一个很好的用例是远程桌面,默认为端口 3389。
az ssh vm -g $myResourceGroup -n $myVM --local-user $myUsername -- -L 3389:localhost:3389
从 Azure 门户进行连接
- 转到 Azure 门户以连接到 VM。 搜索并选择“虚拟机”。
- 从列表中选择虚拟机。
- 从左侧菜单中选择“连接”。
- 选择适合首选连接方式的选项。 门户可帮助你完成连接的先决条件。
后续步骤
了解如何将文件传输到现有 VM,请参阅使用 SCP 将文件移入和移出 VM。