使用 PowerShell 脚本为 Windows 虚拟机开启 Azure 磁盘加密功能
本脚本提供了使用 PowerShell 脚本新建 Azure Key Vault 和 Azure AD 应用,并为现有 Windows 虚拟机开启 Azure 磁盘加密功能。
提示
只有使用密钥加密密钥 ( KEK ) 配置加密的 VM 才支持已加密 VM 的备份和还原。 未使用 KEK 加密的 VM 不支持。
备注
目前暂时不支持更新已加密的高级存储 VM 的加密设置。
创建 Azure 密钥保管库 :
$RGName = "< yourResourcegroup >"
$Location = "<China East or China North>"
$VaultName= "<yourKeyVaultname>"
$KeyVault = New-AzureRmKeyVault -VaultName $VaultName -ResourceGroupName $RGName -Location $Location
设置 Azure AD 应用程序 :
为在 Azure 中正在运行的 VM 上启用加密时,Azure 磁盘加密将生成加密密钥并将其写入 Key Vault。 在 Key Vault 中管理加密密钥需要 Azure AD 身份验证,可以使用基于客户端机密的身份验证或基于客户端证书的 Azure AD 身份验证。请根据实际需要选择下列四种方式之一配置 Azure AD 应用程序。
创建基于客户端机密的 Azure AD 应用程序 :
$aadClientSecret = "<yourAadClientSecret>" $azureAdApplication = New-AzureRmADApplication -DisplayName "<Your Application Display Name>" -HomePage "<https://YourApplicationHomePage>" -IdentifierUris "<https://YouApplicationUri>" -Password $aadClientSecret $servicePrincipal = New-AzureRmADServicePrincipal –ApplicationId $azureAdApplication.ApplicationId
为现有的 Azure AD 应用程序配置客户端机密
若要执行以下命令,请获取并使用 Azure AD PowerShell 模块。
$aadclientSecret = "<yourAadClientSecret>" $aadClientID = "<Client ID of your Azure AD application>" Connect-MsolService -AzureEnvironment azurechinacloud New-MsolServicePrincipalCredential -AppPrincipalId $aadClientID -Type password -Value $aadclientSecret
创建基于证书的 Azure AD 应用程序 :
提示
请将
<yourpassword>
字符串替换为 pfx 证书的安全密码。$Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate("C:\certificates\examplecert.pfx", "<yourpassword>") $CertValue = [System.Convert]::ToBase64String($Cert.GetRawCertData()) $azureAdApplication = New-AzureRmADApplication -DisplayName "<Your Application Display Name>" -HomePage "<https://YourApplicationHomePage>" -IdentifierUris "<https://YouApplicationUri>" -CertValue $CertValue -StartDate $Cert.StartDate -EndDate $Cert.EndDate $AADClientID = $AzureAdApplication.ApplicationId $aadClientCertThumbprint= $cert.Thumbprint $servicePrincipal = New-AzureRmADServicePrincipal –ApplicationId $AADClientID
为现有的 Azure AD 应用程序配置证书 :
若要执行以下命令,请获取并使用 Azure AD PowerShell 模块。
提示
请将
<yourpassword>
字符串替换为 pfx 证书的安全密码。$Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate("C:\certificates\examplecert.pfx", "<yourpassword>") $CertValue = [System.Convert]::ToBase64String($Cert.GetRawCertData()) $aadClientID = "<Client ID of your Azure AD application>" $aadClientCertThumbprint= $cert.Thumbprint Connect-MsolService -AzureEnvironment azurechinacloud New-MsolServicePrincipalCredential -AppPrincipalId $aadClientID -Type asymmetric -Value $credValue -Usage verify
将 PFX 证书文件上传到 Key Vault, 机密名变量 $keyVaultSecretName
的值可以任意设置。
备注
使用基于客户端机密的身份验证可跳过这一步。
提示
请将 <yourpassword>
字符串替换为 pfx 证书的安全密码。
$certLocalPath = "C:\certificates\examplecert.pfx"
$certPassword = "<yourpassword>"
$resourceGroupName = "<yourResourcegroup>"
$keyVaultName = "<yourKeyVaultName>"
$keyVaultSecretName = "<yourAadCertSecretName>"
$fileContentBytes = get-content $certLocalPath -Encoding Byte
$fileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes)
$jsonObject = @"
{
"data": "$filecontentencoded",
"dataType": "pfx",
"password": "$certPassword"
}
"@
$jsonObjectBytes = [System.Text.Encoding]::UTF8.GetBytes($jsonObject)
$jsonEncoded = [System.Convert]::ToBase64String($jsonObjectBytes)
$secret = ConvertTo-SecureString -String $jsonEncoded -AsPlainText -Force
Set-AzureKeyVaultSecret -VaultName $keyVaultName -Name $keyVaultSecretName -SecretValue $secret
Set-AzureRmKeyVaultAccessPolicy -VaultName $keyVaultName -ResourceGroupName $resourceGroupName –EnabledForDeployment
将 Key Vault 中的证书部署到现有 VM。
备注
使用基于客户端机密的身份验证可跳过这一步。
$resourceGroupName = "<yourResourcegroup>"
$keyVaultName = "<yourKeyVaultName>"
$keyVaultSecretName = "<yourAadCertSecretName>"
$vmName = "<yourVMName>"
$certUrl = (Get-AzureKeyVaultSecret -VaultName $keyVaultName -Name $keyVaultSecretName).Id
$sourceVaultId = (Get-AzureRmKeyVault -VaultName $keyVaultName -ResourceGroupName $resourceGroupName).ResourceId
$vm = Get-AzureRmVM -ResourceGroupName $resourceGroupName -Name $vmName
$vm = Add-AzureRmVMSecret -VM $vm -SourceVaultId $sourceVaultId -CertificateStore "My" -CertificateUrl $certUrl
Update-AzureRmVM -VM $vm -ResourceGroupName $resourceGroupName
为 Azure AD 应用程序设置 Key Vault 访问策略 :
$keyVaultName = "<yourKeyVaultName>"
$AADClientID = $AzureAdApplication.ApplicationId
$RGName = "<yourResourceGroup>"
Set-AzureRmKeyVaultAccessPolicy -VaultName $keyVaultName -ServicePrincipalName $AADClientID -PermissionsToKeys "WrapKey" -PermissionsToSecrets "Set" -ResourceGroupName $RGName
设置密钥加密密钥(可选):
$KEKName = "<yourKEKName>"
$KEK = Add-AzureKeyVaultKey -VaultName $VaultName -Name $KEKName -Destination "Software"
$KeyEncryptionKeyUrl = $KEK.Key.kid
设置 Key Vault 权限 :
$keyVaultName = "<yourKeyVaultName>"
$RGName = "<yourResourceGroup>"
Set-AzureRmKeyVaultAccessPolicy -VaultName $keyVaultName -ResourceGroupName $RGName -EnabledForDiskEncryption
为 Azure VM 开启磁盘加密功能
请根据之前配置的 Azure AD 应用程序和密钥加密密钥的情况选择以下四种方式之一配置 Azure VM 磁盘加密功能。
使用基于客户端机密的身份验证
Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $rgname -VMName $vmName -AadClientID $aadClientID -AadClientSecret $aadClientSecret -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $KeyVaultResourceId
使用基于客户端机密的身份验证,并使用密钥加密密钥
Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $RGName -VMName $vmName -AadClientID $AADClientID -AadClientSecret $AADClientSecret -DiskEncryptionKeyVaultUrl $DiskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $KeyVaultResourceId -KeyEncryptionKeyUrl $KeyEncryptionKeyUrl -KeyEncryptionKeyVaultId $KeyVaultResourceId
使用基于证书的身份验证
Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $RGName -VMName $VMName -AadClientID $AADClientID -AadClientCertThumbprint $AADClientCertThumbprint -DiskEncryptionKeyVaultUrl $DiskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $KeyVaultResourceId
使用基于证书的身份验证,并使用密钥加密密钥
Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $RGName -VMName $VMName -AadClientID $AADClientID -AadClientCertThumbprint $AADClientCertThumbprint -DiskEncryptionKeyVaultUrl $DiskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $KeyVaultResourceId -KeyEncryptionKeyUrl $KeyEncryptionKeyUrl -KeyEncryptionKeyVaultId $KeyVaultResourceId
查看当前订阅内的VM 磁盘加密状态
$osVolEncrypted = {(Get-AzureRmVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name).OsVolumeEncrypted}
$dataVolEncrypted= {(Get-AzureRmVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name).DataVolumesEncrypted}
Get-AzureRmVm | Format-Table @{Label="MachineName"; Expression={$_.Name}}, @{Label="OsVolumeEncrypted"; Expression=$osVolEncrypted}, @{Label="DataVolumesEncrypted"; Expression=$dataVolEncrypted}