使用 Azure PowerShell 加密 Windows 虚拟机

此脚本创建安全的 Azure Key Vault、加密密钥、Azure Active Directory 服务主体和 Windows 虚拟机 (VM)。 然后使用 Key Vault 和服务主体凭据中的加密密钥对 VM 进行加密。

本示例需要 Azure PowerShell 模块 4.0 或更高版本。 运行 Get-Module -ListAvailable AzureRM 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure PowerShell 模块

运行 Login-AzureRmAccount -EnvironmentName AzureChinaCloud,创建与 Azure 的连接。

Note

如果没有 Azure 订阅,可在开始前创建一个试用帐户

示例脚本

# Edit these global variables with you unique Key Vault name, resource group name and location
$keyVaultName = "myKeyVault"
$rgName = "myResourceGroup"
$location = "China East"

# Register the Key Vault provider and create a resource group
Register-AzureRmResourceProvider -ProviderNamespace "Microsoft.KeyVault"
New-AzureRmResourceGroup -Location $location -Name $rgName

# Create a Key Vault and enable it for disk encryption
New-AzureRmKeyVault `
    -Location $location `
    -ResourceGroupName $rgName `
    -VaultName $keyVaultName `
    -EnabledForDiskEncryption

# Create a key in your Key Vault
Add-AzureKeyVaultKey `
    -VaultName $keyVaultName `
    -Name "myKey" `
    -Destination "Software"

# Create Azure Active Directory app and service principal
$appName = "My App"
$securePassword = "P@ssword!"
$app = New-AzureRmADApplication -DisplayName $appName `
    -HomePage "https://myapp.contoso.com" `
    -IdentifierUris "https://contoso.com/myapp" `
    -Password $securePassword
New-AzureRmADServicePrincipal -ApplicationId $app.ApplicationId

# Set permissions to allow your AAD service principal to read keys from Key Vault
Set-AzureRmKeyVaultAccessPolicy -VaultName $keyvaultName `
    -ServicePrincipalName $app.ApplicationId  `
    -PermissionsToKeys "all" `
    -PermissionsToSecrets "all"

# Define virtual networking for a new virtual machine
$subnetConfig = New-AzureRmVirtualNetworkSubnetConfig `
    -Name mySubnet `
    -AddressPrefix "192.168.1.0/24"
$vnet = New-AzureRmVirtualNetwork `
    -ResourceGroupName $rgName `
    -Location $location `
    -Name myVnet `
    -AddressPrefix "192.168.0.0/16" `
    -Subnet $subnetConfig

# Create a public IP address for the virtual machine
$pip = New-AzureRmPublicIpAddress `
    -ResourceGroupName $rgName `
    -Location $location `
    -AllocationMethod "Static" `
    -IdleTimeoutInMinutes "4" `
    -Name "mypublicdns$(Get-Random)"

# Create a Network Security Group and RDP rule
$nsgRuleRDP = New-AzureRmNetworkSecurityRuleConfig `
    -Name "myNetworkSecurityGroupRuleRDP" `
    -Protocol "Tcp" `
    -Direction "Inbound" `
    -Priority "1000" `
    -SourceAddressPrefix * `
    -SourcePortRange * `
    -DestinationAddressPrefix * `
    -DestinationPortRange "3389" `
    -Access "Allow"
$nsg = New-AzureRmNetworkSecurityGroup `
    -ResourceGroupName $rgName `
    -Location $location `
    -Name "myNetworkSecurityGroup" `
    -SecurityRules $nsgRuleRDP

# Create a virtual network interface card
$nic = New-AzureRmNetworkInterface `
    -Name "myNic" `
    -ResourceGroupName $rgName `
    -Location $location `
    -SubnetId $vnet.Subnets[0].Id `
    -PublicIpAddressId $pip.Id `
    -NetworkSecurityGroupId $nsg.Id

# Prompt for admin credentials to add to new virtual machine
$cred = Get-Credential

# Create a virtual machine
$vmName = "myVM"
$vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize "Standard_D1" | `
    Set-AzureRmVMOperatingSystem -Windows -ComputerName "myVM" -Credential $cred | `
    Set-AzureRmVMSourceImage -PublisherName "MicrosoftWindowsServer" `
        -Offer "WindowsServer" -Skus "2016-Datacenter" -Version "latest" | `
    Add-AzureRmVMNetworkInterface -Id $nic.Id
New-AzureRmVM -ResourceGroupName $rgName -Location $location -VM $vmConfig

# Define required information for our Key Vault and keys
$keyVault = Get-AzureRmKeyVault -VaultName $keyVaultName -ResourceGroupName $rgName;
$diskEncryptionKeyVaultUrl = $keyVault.VaultUri;
$keyVaultResourceId = $keyVault.ResourceId;
$keyEncryptionKeyUrl = (Get-AzureKeyVaultKey -VaultName $keyVaultName -Name "myKey").Key.kid;

# Encrypt our virtual machine
Set-AzureRmVMDiskEncryptionExtension `
    -ResourceGroupName $rgName `
    -VMName $vmName `
    -AadClientID $app.ApplicationId `
    -AadClientSecret $securePassword `
    -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl `
    -DiskEncryptionKeyVaultId $keyVaultResourceId `
    -KeyEncryptionKeyUrl $keyEncryptionKeyUrl `
    -KeyEncryptionKeyVaultId $keyVaultResourceId

# View encryption status
Get-AzureRmVmDiskEncryptionStatus  -ResourceGroupName $rgName -VMName $vmName

清理部署

运行以下命令来删除资源组、VM 和所有相关资源。

Remove-AzureRmResourceGroup -Name myResourceGroup

脚本说明

此脚本使用以下命令创建部署。 表中的每一项均链接到特定于命令的文档。

命令 说明
New-AzureRmResourceGroup 创建用于存储所有资源的资源组。
New-AzureRmKeyVault 创建 Azure Key Vault,存储加密密钥等安全数据。
Add-AzureKeyVaultKey 在 Key Vault 中创建加密密钥。
New-AzureRmADServicePrincipal 创建 Azure Active Directory 服务主体,安全地进行身份验证并控制对加密密钥的访问。
Set-AzureRmKeyVaultAccessPolicy 设置对 Key Vault 的权限,授予服务主体访问加密密钥的权限。
New-AzureRmVirtualNetworkSubnetConfig 创建子网配置。 在虚拟网络创建过程中将使用此配置。
New-AzureRmVirtualNetwork 创建虚拟网络。
New-AzureRmPublicIpAddress 创建公共 IP 地址。
New-AzureRmNetworkSecurityRuleConfig 创建网络安全组规则配置。 创建 NSG 时将使用此配置创建 NSG 规则。
New-AzureRmNetworkSecurityGroup 创建网络安全组。
Get-AzureRmVirtualNetworkSubnetConfig 获取子网信息。 创建网络接口时将使用此信息。
New-AzureRmNetworkInterface 创建网络接口。
New-AzureRmVMConfig 创建 VM 配置。 此配置包括 VM 名称、操作系统和管理凭据等信息。 在创建 VM 期间将使用此配置。
New-AzureRmVM 创建虚拟机。
Get-AzureRmKeyVault 获取有关 Key Vault 的所需信息
Set-AzureRmVMDiskEncryptionExtension 使用服务主体凭据和加密密钥对 VM 进行加密。
Get-AzureRmVmDiskEncryptionStatus 显示 VM 加密过程的状态。
Remove-AzureRmResourceGroup 删除资源组及其中包含的所有资源。

后续步骤

有关 Azure PowerShell 模块的详细信息,请参阅 Azure PowerShell 文档

可以在 Azure Windows VM 文档中找到其他虚拟机 PowerShell 脚本示例。