如何加密 Windows VM 上的虚拟磁盘
为了增强虚拟机 (VM) 的安全性以及符合性,可以加密 Azure 中的虚拟磁盘。 磁盘是使用 Azure 密钥保管库中受保护的加密密钥加密的。 可以控制这些加密密钥,以及审核对它们的使用。 本文详细阐述如何使用 Azure PowerShell 加密 Windows VM 上的虚拟磁盘。 还可使用 Azure CLI 2.0 加密 Linux VM。
磁盘加密概述
Windows VM 上的虚拟磁盘使用 Bitlocker 进行静态加密。 加密 Azure 中的虚拟磁盘不会产生费用。 使用软件保护将加密密钥存储在 Azure 密钥保管库中,或者,可在已通过 FIPS 140-2 级别 2 标准认证的硬件安全模块 (HSM) 中导入或生成密钥。 这些加密密钥用于加密和解密附加到 VM 的虚拟磁盘。 可以控制这些加密密钥,以及审核对它们的使用。 打开和关闭 VM 时,Azure Active Directory 服务主体提供一个安全机制用于颁发这些加密密钥。
加密 VM 的过程如下:
- 在 Azure 密钥保管库中创建加密密钥。
- 配置可用于加密磁盘的加密密钥。
- 若要从 Azure Key Vault 中读取加密密钥,可创建具有相应权限的 Azure Active Directory 服务主体。
- 发出加密虚拟磁盘的命令,指定要使用的 Azure Active Directory 服务主体和相应的加密密钥。
- Azure Active Directory 服务主体将从 Azure Key Vault 请求所需的加密密钥。
- 使用提供的加密密钥加密虚拟磁盘。
加密过程
磁盘加密依赖于以下附加组件:
- Azure 密钥保管库 - 用于保护磁盘加密/解密过程中使用的加密密钥和机密。
- 可以使用现有的 Azure 密钥保管库(如果有)。 不需要专门使用某个密钥保管库来加密磁盘。
- 要将管理边界和密钥可见性隔离开来,可以创建专用的密钥保管库。
- Azure Active Directory - 处理所需加密密钥的安全交换,以及对请求的操作执行的身份验证。
- 通常,可以使用现有的 Azure Active Directory 实例来容装应用程序。
- 服务主体提供了安全机制,可用于请求和获取相应的加密密钥。 实际并不需要开发与 Azure Active Directory 集成的应用程序。
要求和限制
磁盘加密支持的方案和要求
- 在来自 Azure 应用商店映像或自定义 VHD 映像的新 Windows VM 上启用加密。
- 在现有的 Azure Windows VM 上启用加密。
- 在使用存储空间配置的 Windows VM 上启用加密。
- 在 Windows VM 的 OS 和数据驱动器上禁用加密。
- 所有资源(例如密钥保管库、存储帐户和 VM)必须在同一个 Azure 区域和订阅中。
- 标准层 VM,例如 A、D 和 DS 系列 VM。
以下方案目前不支持磁盘加密:
- 基本层 VM。
- 使用经典部署模型创建的 VM。
- 在已加密的 VM 上更新加密密钥。
- 与本地密钥管理服务集成。
创建 Azure Key Vault 和密钥
在开始之前,请确保已安装了 Azure PowerShell 模块的最新版本。 有关详细信息,请参阅如何安装和配置 Azure PowerShell。 在整个命令示例中,请将所有示例参数替换为自己的名称、位置和密钥值。 以下示例使用 myResourceGroup、myKeyVault、myVM 等的约定。
第一步是创建用于存储加密密钥的 Azure 密钥保管库。 Azure 密钥保管库可以存储能够在应用程序和服务中安全实现的密钥、机密或密码。 对于虚拟磁盘加密,可以创建 Key Vault 来存储用于加密或解密虚拟磁盘的加密密钥。
在 Azure 订阅中使用 Register-AzureRmResourceProvider 启用 Azure Key Vault 提供程序,并使用 New-AzureRmResourceGroup 创建一个资源组。 以下示例在“中国东部”位置创建名为 myResourceGroup 的资源组。
$rgName = "myResourceGroup"
$location = "China East"
Register-AzureRmResourceProvider -ProviderNamespace "Microsoft.KeyVault"
New-AzureRmResourceGroup -Location $location -Name $rgName
包含加密密钥和关联的计算资源(例如存储和 VM 本身)的 Azure 密钥保管库必须位于同一区域。 使用 New-AzureRmKeyVault 创建 Azure Key Vault,并启用该 Key Vault 进行磁盘加密。 指定 keyVaultName 的唯一 Key Vault 名称,如下所示:
$keyVaultName = "myUniqueKeyVaultName"
New-AzureRmKeyVault -Location $location `
-ResourceGroupName $rgName `
-VaultName $keyVaultName `
-EnabledForDiskEncryption
可以使用软件或硬件安全模型 (HSM) 保护来存储加密密钥。 使用 HSM 时需要高级密钥保管库。 与用于存储受软件保护的密钥的标准密钥保管库不同,创建高级密钥保管库会产生额外的费用。 若要创建高级 Key Vault,请在上一步中添加 -Sku "Premium" 参数。 由于我们创建的是标准密钥保管库,以下示例使用了受软件保护的密钥。
对于这两种保护模型,在启动 VM 解密虚拟磁盘时,都需要向 Azure 平台授予请求加密密钥的访问权限。 使用 Add-AzureKeyVaultKey 在 Key Vault 中创建加密密钥。 以下示例创建名为 myKey 的密钥:
Add-AzureKeyVaultKey -VaultName $keyVaultName `
-Name "myKey" `
-Destination "Software"
创建 Azure Active Directory 服务主体
加密或解密虚拟磁盘时,将指定一个帐户来处理身份验证,以及从 Key Vault 交换加密密钥。 此帐户(Azure Active Directory 服务主体)允许 Azure 平台代表 VM 请求相应的加密密钥。 订阅中提供了一个默认的 Azure Active Directory 实例,不过,许多组织使用专用的 Azure Active Directory 目录。
使用 New-AzureRmADServicePrincipal 在 Azure Active Directory 中创建服务主体。 若要指定安全密码,请遵循 Azure Active Directory 中的密码策略和限制:
$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
要成功加密或解密虚拟磁盘,必须将 Key Vault 中存储的加密密钥的权限设置为允许 Azure Active Directory 服务主体读取密钥。 使用 Set-AzureRmKeyVaultAccessPolicy 设置 Key Vault 的权限:
Set-AzureRmKeyVaultAccessPolicy -VaultName $keyvaultName `
-ServicePrincipalName $app.ApplicationId `
-PermissionsToKeys "WrapKey" `
-PermissionsToSecrets "Set"
创建虚拟机
若要测试加密过程,请创建 VM。 以下示例使用 Windows Server 2016 Datacenter 映像创建名为 myVM 的 VM:
$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
$pip = New-AzureRmPublicIpAddress -ResourceGroupName $rgName `
-Location $location `
-AllocationMethod Static `
-IdleTimeoutInMinutes 4 `
-Name "mypublicdns$(Get-Random)"
$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
$nic = New-AzureRmNetworkInterface -Name myNic `
-ResourceGroupName $rgName `
-Location $location `
-SubnetId $vnet.Subnets[0].Id `
-PublicIpAddressId $pip.Id `
-NetworkSecurityGroupId $nsg.Id
$cred = Get-Credential
$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
加密虚拟机
要加密虚拟磁盘,可将前面的所有组件合并在一起:
- 指定 Azure Active Directory 服务主体和密码。
- 指定用于存储加密磁盘元数据的密钥保管库。
- 指定用于实际加密和解密的加密密钥。
- 指定是要加密 OS 磁盘、数据磁盘还是所有磁盘。
使用 Azure Key Vault 密钥和 Azure Active Directory 服务主体凭据通过 Set-AzureRmVMDiskEncryptionExtension 加密 VM。 以下示例检索所有密钥信息,并对名为 myVM 的 VM 进行加密:
$keyVault = Get-AzureRmKeyVault -VaultName $keyVaultName -ResourceGroupName $rgName;
$diskEncryptionKeyVaultUrl = $keyVault.VaultUri;
$keyVaultResourceId = $keyVault.ResourceId;
$keyEncryptionKeyUrl = (Get-AzureKeyVaultKey -VaultName $keyVaultName -Name myKey).Key.kid;
Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $rgName `
-VMName $vmName `
-AadClientID $app.ApplicationId `
-AadClientSecret $securePassword `
-DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl `
-DiskEncryptionKeyVaultId $keyVaultResourceId `
-KeyEncryptionKeyUrl $keyEncryptionKeyUrl `
-KeyEncryptionKeyVaultId $keyVaultResourceId
接受提示以继续进行 VM 加密。 此过程中将重启 VM。 加密过程完成并重启 VM 后,使用 Get-AzureRmVmDiskEncryptionStatus 查看加密状态:
Get-AzureRmVmDiskEncryptionStatus -ResourceGroupName $rgName -VMName $vmName
输出类似于以下示例:
OsVolumeEncrypted : Encrypted
DataVolumesEncrypted : Encrypted
OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings
ProgressMessage : OsVolume: Encrypted, DataVolumes: Encrypted
后续步骤
- 有关 Azure Key Vault 管理的详细信息,请参阅为虚拟机设置 Key Vault。
- 有关磁盘加密的详细信息,例如准备要上传到 Azure 的已加密自定义 VM,请参阅 Azure Disk Encryption(Azure 磁盘加密)。立即访问http://market.azure.cn
如何加密 Windows VM 上的虚拟磁盘的更多相关文章
- 使用 D: 盘作为 Windows VM 上的数据驱动器
如果应用程序需要使用 D 盘存储数据,请按照以下说明使用其他驱动器号作为临时磁盘. 切勿使用临时磁盘来存储需要保存的数据. 如果调整虚拟机大小或停止(解除分配)虚拟机,这可能会触发将虚拟机放置于新虚拟 ...
- 如何在 Azure 门户中将托管数据磁盘附加到 Windows VM
本文介绍了如何通过 Azure 门户将新的托管数据磁盘附加到 Windows 虚拟机. 在开始之前,请查看以下提示: 虚拟机的大小决定了可以附加多少个磁盘. 有关详细信息,请参阅虚拟机大小. 对于新磁 ...
- 关于 Azure Windows VM 的磁盘和 VHD
就像其他任何计算机一样,Azure 中的虚拟机将磁盘用作存储操作系统.应用程序和数据的位置. 所有 Azure 虚拟机都至少有两个磁盘,即 Windows 操作系统磁盘和临时磁盘. 操作系统磁盘基于映 ...
- 在Windows Azure上配置VM主备切换(1)——Linux篇
对任何一个上线系统来说,高可用设计是不可或缺的一个环节,这样才可以确保应用可以持续.稳定的运行,而不是频繁的掉线.停机.高可用设计的核心思路很简单,就是消除一切单点故障,将单点链路或者节点升级为多点. ...
- Windows Azure 上 Linux VM 中的交换空间 – 第 2 部分
本文章由 Azure CAT 团队的 Piyush Ranjan (MSFT) 撰写. 在前一篇文章 Windows Azure 上Linux VM 中的交换空间第 1 部分中,我介绍了在默认情况下, ...
- 在 Windows Azure 上部署预配置 Oracle VM
Microsoft 和 Oracle 近期宣布建立战略合作伙伴关系,基于此,我们将通过 Windows Azure 镜像库推出多种常用的 Oracle 软件配置.即日起,客户可以在 Windows S ...
- 在本地windows机器上安装SecureCRT客户端
一.SecureCRT客户端介绍. SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. SecureCRT支持 ...
- 怎么把Windows主机上的目录共享到Ubuntu上
使用Oracle VM VirtualBox在Windows主机上创建了一台Ubuntu虚拟机,怎么把宿主机上的目录共享到Ubuntu上,可使用以下方法: eg.把Windows主机上D盘里的test ...
- 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据
http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...
随机推荐
- wordpress谷歌字体
wordpress插件:disable google fonts wordpress插件:Remove Open Sans font from WP core 在主题的functions.php添加 ...
- 《垃圾回收的算法与实现》——Python垃圾回收
Python垃圾回收 python采用引用计数法进行垃圾回收 Python内存分配 python在分配内存空间时,在malloc之上堆放了3个独立的分层. python内存分配时主要由arena.po ...
- koa2 get请求后台正常接收参数 前端报404错误
刚学习一门技术时,总会踩一些坑. 前端代码 function del(mId){ $.ajax({ type:"get", url:"/delUser", da ...
- Django model转字典的几种方法
平常的开发过程中不免遇到需要把model转成字典的需求,尤其是现在流行前后端分离架构,Json格式几乎成了前后端之间数据交换的标准,这种model转dict的需求就更多了,本文介绍几种日常使用的方法以 ...
- linux less命令详情
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more .tail更加的有弹性.在 more 的时候,我们并没有办 ...
- Visual Studio自带的的Developer Command Prompt对话框
简单了解Visual Studio的Developer Command Prompt VS2008的命令为:Visual Studio 2008 Command Prompt 目录是: 其详细信息如下 ...
- C#读取注册表中二进制类型的值(REG_BINARY)
如需要读取注册表中某个键的值, 例如读取DriverDesc对应的值,一般情况下为String类型,读取代码如下: RegistryKey driverKey = Registry.LocalMach ...
- notepad++ jstool 插件安装
notepad++ 格式化显示 网上下载 jstool 插件 放入Notepad++\安装目录的plugins位置下,重启即可使用 插件-->JSTool
- Spring Aop 注解方式参数传递
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Solr 访问 403 错误
把 Solr 基础环境搭建好后访问发现会出现 403 错误: 解决方法: 找到自己 Tomcat 目录下的 solr ,找到 ...\solr\WEB-INF\web.xml,然后把 169 - 1 ...