You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已部署Azure VM能否配置使用Azure KeyVault?批量配置方法咨询

解答:将现有Azure虚拟机接入Azure Key Vault管理密码/密钥

当然可以!不管你已经部署的是Windows还是Linux虚拟机,都能配置为使用Azure Key Vault来托管密码、密钥和证书——这不仅能避免明文存储凭据的风险,还能实现自动轮换、细粒度权限控制等安全最佳实践。而且完全可以通过PowerShell或Azure CLI完成批量配置,下面是具体的操作步骤:

前提准备

在开始批量配置前,先确认以下几点:

  • 你的Azure Key Vault已创建,并且启用了软删除和清除保护(这是防止意外丢失凭据的必备配置)
  • 准备好要配置的VM范围(比如按资源组、订阅筛选)
  • 确保你有足够的权限(比如VM Contributor、Key Vault Contributor)

使用PowerShell批量配置

1. 获取目标VM列表

先筛选出需要配置的VM,比如指定资源组:

# 获取指定资源组下的所有VM
$targetVMs = Get-AzVM -ResourceGroupName "your-resource-group-name"

# 如果是跨资源组,可直接获取订阅内所有VM再筛选
# $targetVMs = Get-AzVM | Where-Object { $_.Name -match "your-vm-name-pattern" }

2. 为VM启用系统托管身份

系统托管身份会自动生成身份凭证,不需要手动管理,适合批量场景:

foreach ($vm in $targetVMs) {
    # 更新VM以启用系统托管身份
    Update-AzVM -ResourceGroupName $vm.ResourceGroupName -VM $vm -IdentityType SystemAssigned
    Write-Host "已为VM $($vm.Name)启用系统托管身份"
}

3. 为VM身份分配Key Vault访问权限

让VM的身份能读取Key Vault中的密钥/密码:

$keyVault = Get-AzKeyVault -VaultName "your-keyvault-name"

foreach ($vm in $targetVMs) {
    # 获取VM的身份主体ID
    $vmPrincipalId = (Get-AzVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name).Identity.PrincipalId
    
    # 分配密钥和密码的读取权限
    Set-AzKeyVaultAccessPolicy -VaultName $keyVault.VaultName `
        -ObjectId $vmPrincipalId `
        -PermissionsToSecrets Get,List `
        -PermissionsToKeys Get,List
    
    Write-Host "已为VM $($vm.Name)分配Key Vault访问权限"
}

4. 安装Key Vault VM扩展(分Windows/Linux)

这个扩展负责在VM内部同步Key Vault的凭据,需要针对不同系统分别安装:

Windows VM:

foreach ($vm in $targetVMs | Where-Object { $vm.StorageProfile.OsDisk.OsType -eq "Windows" }) {
    Set-AzVMExtension -ResourceGroupName $vm.ResourceGroupName `
        -VMName $vm.Name `
        -Name "AzureKeyVaultForWindows" `
        -Publisher "Microsoft.Azure.KeyVault" `
        -Type "KeyVaultForWindows" `
        -TypeHandlerVersion "1.0" `
        -SettingString '{ "secretsManagementSettings": { "pollingIntervalInS": "3600", "observedCertificates": "", "certificateStoreName": "My", "certificateStoreLocation": "LocalMachine", "requireInitialSync": true } }'
    
    Write-Host "已为Windows VM $($vm.Name)安装Key Vault扩展"
}

Linux VM:

foreach ($vm in $targetVMs | Where-Object { $vm.StorageProfile.OsDisk.OsType -eq "Linux" }) {
    Set-AzVMExtension -ResourceGroupName $vm.ResourceGroupName `
        -VMName $vm.Name `
        -Name "AzureKeyVaultForLinux" `
        -Publisher "Microsoft.Azure.KeyVault" `
        -Type "KeyVaultForLinux" `
        -TypeHandlerVersion "1.0" `
        -SettingString '{ "secretsManagementSettings": { "pollingIntervalInS": "3600", "observedCertificates": "", "certificateStoreLocation": "/var/lib/waagent/Microsoft.Azure.KeyVault/", "requireInitialSync": true } }'
    
    Write-Host "已为Linux VM $($vm.Name)安装Key Vault扩展"
}

使用Azure CLI批量配置

如果你更习惯用CLI,下面是对应的批量操作步骤:

1. 获取目标VM列表

先导出VM的基本信息(名称、资源组、系统类型):

# 获取指定资源组下的VM列表,输出为JSON
target_vms=$(az vm list --resource-group "your-resource-group-name" --query "[].{name:name, resourceGroup:resourceGroup, osType:storageProfile.osDisk.osType}" -o json)

2. 为VM启用系统托管身份

# 遍历VM列表,逐个启用身份
echo "$target_vms" | jq -c '.[]' | while read vm; do
    vm_name=$(echo "$vm" | jq -r '.name')
    rg_name=$(echo "$vm" | jq -r '.resourceGroup')
    
    az vm identity assign --name "$vm_name" --resource-group "$rg_name"
    echo "已为VM $vm_name启用系统托管身份"
done

3. 为VM身份分配Key Vault访问权限

key_vault_name="your-keyvault-name"

echo "$target_vms" | jq -c '.[]' | while read vm; do
    vm_name=$(echo "$vm" | jq -r '.name')
    rg_name=$(echo "$vm" | jq -r '.resourceGroup')
    
    # 获取VM的身份主体ID
    principal_id=$(az vm identity show --name "$vm_name" --resource-group "$rg_name" --query principalId -o tsv)
    
    # 分配读取权限
    az keyvault set-policy --name "$key_vault_name" --object-id "$principal_id" --secret-permissions get list --key-permissions get list
    echo "已为VM $vm_name分配Key Vault访问权限"
done

4. 安装Key Vault VM扩展(分Windows/Linux)

Windows VM:

echo "$target_vms" | jq -c '.[] | select(.osType=="Windows")' | while read vm; do
    vm_name=$(echo "$vm" | jq -r '.name')
    rg_name=$(echo "$vm" | jq -r '.resourceGroup')
    
    az vm extension set --resource-group "$rg_name" --vm-name "$vm_name" --name "KeyVaultForWindows" --publisher "Microsoft.Azure.KeyVault" --version "1.0" --settings '{ "secretsManagementSettings": { "pollingIntervalInS": "3600", "observedCertificates": "", "certificateStoreName": "My", "certificateStoreLocation": "LocalMachine", "requireInitialSync": true } }'
    echo "已为Windows VM $vm_name安装Key Vault扩展"
done

Linux VM:

echo "$target_vms" | jq -c '.[] | select(.osType=="Linux")' | while read vm; do
    vm_name=$(echo "$vm" | jq -r '.name')
    rg_name=$(echo "$vm" | jq -r '.resourceGroup')
    
    az vm extension set --resource-group "$rg_name" --vm-name "$vm_name" --name "KeyVaultForLinux" --publisher "Microsoft.Azure.KeyVault" --version "1.0" --settings '{ "secretsManagementSettings": { "pollingIntervalInS": "3600", "observedCertificates": "", "certificateStoreLocation": "/var/lib/waagent/Microsoft.Azure.KeyVault/", "requireInitialSync": true } }'
    echo "已为Linux VM $vm_name安装Key Vault扩展"
done

额外注意事项

  • 扩展默认每3600秒(1小时)同步一次Key Vault的凭据,你可以修改pollingIntervalInS参数调整频率
  • 如果需要自动轮换本地管理员密码,还需在Key Vault中配置密码轮换策略,并在扩展设置中指定对应的secret名称
  • 为了安全,建议在Key Vault的防火墙规则中只允许目标VM所在的虚拟网络访问,而不是开放所有Azure服务
  • 对于Linux系统,同步的凭据会存储在/var/lib/waagent/Microsoft.Azure.KeyVault/路径下,你的应用程序可以直接读取这些文件

内容的提问来源于stack exchange,提问作者bonafide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:15:10