通过 Azure PowerShell 对虚拟机规模集中的 OS 和附加数据磁盘进行加密
Azure PowerShell 模块用于从 PowerShell 命令行或脚本创建和管理 Azure 资源。 本文介绍如何使用 Azure PowerShell 创建和加密虚拟机规模集。 若要详细了解如何将 Azure 磁盘加密应用于虚拟机规模集,请参阅适用于虚拟机规模集的 Azure 磁盘加密。
创建支持磁盘加密的 Azure Key Vault
Azure 密钥保管库可以存储能够在应用程序和服务中安全实现的密钥、机密或密码。 使用软件保护将加密密钥存储在 Azure Key Vault 中,或者,可在已获得经过 FIPS 140 验证的标准认证的硬件安全模块 (HSM) 中导入或生成密钥。 这些加密密钥用于加密和解密附加到 VM 的虚拟磁盘。 可以控制这些加密密钥,以及审核对它们的使用。
使用 New-AzKeyVault 创建一个密钥保管库。 若要将 Key Vault 用于磁盘加密,请设置 EnabledForDiskEncryption 参数。 以下示例还会定义资源组名称、Key Vault 名称和位置的变量。 请提供自己的唯一 Key Vault 名称:
$rgName="myResourceGroup"
$vaultName="myuniquekeyvault"
$location = "chinanorth2"
New-AzResourceGroup -Name $rgName -Location $location
New-AzKeyVault -VaultName $vaultName -ResourceGroupName $rgName -Location $location -EnabledForDiskEncryption
使用现有的密钥保管库
仅当你要将现有的 Key Vault 用于磁盘加密时,才需要执行此步骤。 如果在上一部分中创建了 Key Vault,请跳过此步骤。
可以使用 Set-AzKeyVaultAccessPolicy,在规模集所在的同一订阅和区域中启用现有的 Key Vault 进行磁盘加密。 按如下所示,在 $vaultName 变量中定义现有 Key Vault 的名称:
$vaultName="myexistingkeyvault"
Set-AzKeyVaultAccessPolicy -VaultName $vaultName -EnabledForDiskEncryption
创建规模集
重要
从 2023 年 11 月开始,使用 PowerShell 和 Azure CLI 创建的 VM 规模集将默认为灵活业务流程模式(如果未指定业务流程模式)。 若要详细了解此更改以及你应采取哪些操作,请访问针对 VMSS PowerShell/CLI 客户的中断性变更 - Microsoft 社区中心
首先,使用 Get-Credential 设置 VM 实例的管理员用户名和密码:
$cred = Get-Credential
现在,使用 New-AzVmss 创建虚拟机规模集。 若要将流量分配到单独的 VM 实例,则还要创建负载均衡器。 负载均衡器包含的规则可在 TCP 端口 80 上分配流量,并允许 TCP 端口 3389 上的远程桌面流量,以及 TCP 端口 5985 上的 PowerShell 远程流量:
$vmssName="myScaleSet"
New-AzVmss `
-ResourceGroupName $rgName `
-VMScaleSetName $vmssName `
-OrchestrationMode "flexible" `
-Location $location `
-VirtualNetworkName "myVnet" `
-SubnetName "mySubnet" `
-PublicIpAddressName "myPublicIPAddress" `
-LoadBalancerName "myLoadBalancer" `
-Credential $cred
启用加密功能
若要在规模集中加密 VM 实例,请先使用 Get-AzKeyVault 获取有关 Key Vault URI 和资源 ID 的某些信息。 然后,可以使用 Set-AzVmssDiskEncryptionExtension 结合这些变量来启动加密过程:
$diskEncryptionKeyVaultUrl=(Get-AzKeyVault -ResourceGroupName $rgName -Name $vaultName).VaultUri
$keyVaultResourceId=(Get-AzKeyVault -ResourceGroupName $rgName -Name $vaultName).ResourceId
Set-AzVmssDiskEncryptionExtension -ResourceGroupName $rgName -VMScaleSetName $vmssName `
-DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $keyVaultResourceId -VolumeType "All"
出现提示时,请键入 y,以便继续对规模集 VM 实例执行磁盘加密过程。
使用 KEK 启用加密以包装密钥
加密虚拟机规模集时,还可以使用密钥加密密钥来增强安全性。
$diskEncryptionKeyVaultUrl=(Get-AzKeyVault -ResourceGroupName $rgName -Name $vaultName).VaultUri
$keyVaultResourceId=(Get-AzKeyVault -ResourceGroupName $rgName -Name $vaultName).ResourceId
$keyEncryptionKeyUrl = (Get-AzKeyVaultKey -VaultName $vaultName -Name $keyEncryptionKeyName).Key.kid;
Set-AzVmssDiskEncryptionExtension -ResourceGroupName $rgName -VMScaleSetName $vmssName `
-DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $keyVaultResourceId `
-KeyEncryptionKeyUrl $keyEncryptionKeyUrl -KeyEncryptionKeyVaultId $keyVaultResourceId -VolumeType "All"
注意
disk-encryption-keyvault 参数值的语法是完整的标识符字符串:
/subscriptions/[subscription-id-guid]/resourceGroups/[resource-group-name]/providers/Microsoft.KeyVault/vaults/[keyvault-name]
key-encryption-key 参数值的语法是 KEK 的完整 URI,如:
https://[keyvault-name].vault.azure.cn/keys/[kekname]/[kek-unique-id]
查看加密进度
若要检查磁盘加密状态,请使用 Get-AzVmssDiskEncryption:
Get-AzVmssDiskEncryption -ResourceGroupName $rgName -VMScaleSetName $vmssName
加密 VM 实例后,EncryptionSummary 代码会报告 ProvisioningState/succeeded,如以下示例输出所示:
ResourceGroupName : myResourceGroup
VmScaleSetName : myScaleSet
EncryptionSettings :
KeyVaultURL : https://myuniquekeyvault.vault.azure.cn/
KeyEncryptionKeyURL :
KeyVaultResourceId : /subscriptions/guid/resourceGroups/myResourceGroup/providers/Microsoft.KeyVault/vaults/myuniquekeyvault
KekVaultResourceId :
KeyEncryptionAlgorithm :
VolumeType : All
EncryptionOperation : EnableEncryption
EncryptionSummary[0] :
Code : ProvisioningState/succeeded
Count : 2
EncryptionEnabled : True
EncryptionExtensionInstalled : True
禁用加密功能
如果不再希望使用加密的 VM 实例磁盘,可以使用 Disable-AzVmssDiskEncryption 禁用加密,如下所示:
Disable-AzVmssDiskEncryption -ResourceGroupName $rgName -VMScaleSetName $vmssName
后续步骤
- 在本文中,我们已使用 Azure PowerShell 加密了虚拟机规模集。 也可以使用 Azure CLI 或 Azure 资源管理器模板。
- 如果希望在预配另一个扩展后应用 Azure 磁盘加密,可以使用扩展排序。