已部署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
相关产品推荐
相关产品推荐

