通过 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

后续步骤