为了增强虚拟机 (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 的过程如下:

  1. 在 Azure 密钥保管库中创建加密密钥。
  2. 配置可用于加密磁盘的加密密钥。
  3. 若要从 Azure Key Vault 中读取加密密钥,可创建具有相应权限的 Azure Active Directory 服务主体。
  4. 发出加密虚拟磁盘的命令,指定要使用的 Azure Active Directory 服务主体和相应的加密密钥。
  5. Azure Active Directory 服务主体将从 Azure Key Vault 请求所需的加密密钥。
  6. 使用提供的加密密钥加密虚拟磁盘。

加密过程

磁盘加密依赖于以下附加组件:

  • 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。 在整个命令示例中,请将所有示例参数替换为自己的名称、位置和密钥值。 以下示例使用 myResourceGroupmyKeyVaultmyVM 等的约定。

第一步是创建用于存储加密密钥的 Azure 密钥保管库。 Azure 密钥保管库可以存储能够在应用程序和服务中安全实现的密钥、机密或密码。 对于虚拟磁盘加密,可以创建 Key Vault 来存储用于加密或解密虚拟磁盘的加密密钥。

在 Azure 订阅中使用 Register-AzureRmResourceProvider 启用 Azure Key Vault 提供程序,并使用 New-AzureRmResourceGroup 创建一个资源组。 以下示例在“中国东部”位置创建名为 myResourceGroup 的资源组。

PowerShell复制
$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 名称,如下所示:

PowerShell复制
$keyVaultName = "myUniqueKeyVaultName"
New-AzureRmKeyVault -Location $location `
-ResourceGroupName $rgName `
-VaultName $keyVaultName `
-EnabledForDiskEncryption

可以使用软件或硬件安全模型 (HSM) 保护来存储加密密钥。 使用 HSM 时需要高级密钥保管库。 与用于存储受软件保护的密钥的标准密钥保管库不同,创建高级密钥保管库会产生额外的费用。 若要创建高级 Key Vault,请在上一步中添加 -Sku "Premium" 参数。 由于我们创建的是标准密钥保管库,以下示例使用了受软件保护的密钥。

对于这两种保护模型,在启动 VM 解密虚拟磁盘时,都需要向 Azure 平台授予请求加密密钥的访问权限。 使用 Add-AzureKeyVaultKey 在 Key Vault 中创建加密密钥。 以下示例创建名为 myKey 的密钥:

PowerShell复制
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 中的密码策略和限制

PowerShell复制
$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 的权限:

PowerShell复制
Set-AzureRmKeyVaultAccessPolicy -VaultName $keyvaultName `
-ServicePrincipalName $app.ApplicationId `
-PermissionsToKeys "WrapKey" `
-PermissionsToSecrets "Set"

创建虚拟机

若要测试加密过程,请创建 VM。 以下示例使用 Windows Server 2016 Datacenter 映像创建名为 myVM 的 VM:

PowerShell复制
$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

加密虚拟机

要加密虚拟磁盘,可将前面的所有组件合并在一起:

  1. 指定 Azure Active Directory 服务主体和密码。
  2. 指定用于存储加密磁盘元数据的密钥保管库。
  3. 指定用于实际加密和解密的加密密钥。
  4. 指定是要加密 OS 磁盘、数据磁盘还是所有磁盘。

使用 Azure Key Vault 密钥和 Azure Active Directory 服务主体凭据通过 Set-AzureRmVMDiskEncryptionExtension 加密 VM。 以下示例检索所有密钥信息,并对名为 myVM 的 VM 进行加密:

PowerShell复制
$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 查看加密状态:

PowerShell复制
Get-AzureRmVmDiskEncryptionStatus  -ResourceGroupName $rgName -VMName $vmName

输出类似于以下示例:

PowerShell复制
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 上的虚拟磁盘的更多相关文章

  1. 使用 D: 盘作为 Windows VM 上的数据驱动器

    如果应用程序需要使用 D 盘存储数据,请按照以下说明使用其他驱动器号作为临时磁盘. 切勿使用临时磁盘来存储需要保存的数据. 如果调整虚拟机大小或停止(解除分配)虚拟机,这可能会触发将虚拟机放置于新虚拟 ...

  2. 如何在 Azure 门户中将托管数据磁盘附加到 Windows VM

    本文介绍了如何通过 Azure 门户将新的托管数据磁盘附加到 Windows 虚拟机. 在开始之前,请查看以下提示: 虚拟机的大小决定了可以附加多少个磁盘. 有关详细信息,请参阅虚拟机大小. 对于新磁 ...

  3. 关于 Azure Windows VM 的磁盘和 VHD

    就像其他任何计算机一样,Azure 中的虚拟机将磁盘用作存储操作系统.应用程序和数据的位置. 所有 Azure 虚拟机都至少有两个磁盘,即 Windows 操作系统磁盘和临时磁盘. 操作系统磁盘基于映 ...

  4. 在Windows Azure上配置VM主备切换(1)——Linux篇

    对任何一个上线系统来说,高可用设计是不可或缺的一个环节,这样才可以确保应用可以持续.稳定的运行,而不是频繁的掉线.停机.高可用设计的核心思路很简单,就是消除一切单点故障,将单点链路或者节点升级为多点. ...

  5. Windows Azure 上 Linux VM 中的交换空间 – 第 2 部分

    本文章由 Azure CAT 团队的 Piyush Ranjan (MSFT) 撰写. 在前一篇文章 Windows Azure 上Linux VM 中的交换空间第 1 部分中,我介绍了在默认情况下, ...

  6. 在 Windows Azure 上部署预配置 Oracle VM

    Microsoft 和 Oracle 近期宣布建立战略合作伙伴关系,基于此,我们将通过 Windows Azure 镜像库推出多种常用的 Oracle 软件配置.即日起,客户可以在 Windows S ...

  7. 在本地windows机器上安装SecureCRT客户端

    一.SecureCRT客户端介绍. SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. SecureCRT支持 ...

  8. 怎么把Windows主机上的目录共享到Ubuntu上

    使用Oracle VM VirtualBox在Windows主机上创建了一台Ubuntu虚拟机,怎么把宿主机上的目录共享到Ubuntu上,可使用以下方法: eg.把Windows主机上D盘里的test ...

  9. 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据

    http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...

随机推荐

  1. php数组方法

    查找.筛选与搜索数组元素是数组操作的一些常见功能.下面来介绍一下几个相关的函数. in_array()函数 in_array()函数在一个数组汇总搜索一个特定值,如果找到这个值返回true,否则返回f ...

  2. 微信小程序网络封装-简单高效

    废话引言 小程序虽然出世很久了,但一直没怎么接触到小程序开发.吉他兴趣班老师想弄一个小程序发布课程信息和打卡功能,作为IT一员就自愿加入了这个小程序开发小组中.虽然小程序面向的是前端工程师,但作为移动 ...

  3. 如何在Notepad++里正确设置java环境(图文环境)

    不多说,直接上干货! 这款软件非常好用!!! Notepad++软件的下载与安装步骤(图文详解) 欢迎大家,加入我的微信公众号:大数据躺过的坑        人工智能躺过的坑       同时,大家可 ...

  4. 解决Redisson出现Failed to instantiate [org.redisson.api.RedissonClient]: Factory method 'create' threw exception; nested exception is java.lang.ArrayIndexOutOfBoundsException: 0的问题

    一.背景 最近项目中使用了redisson的哨兵模式来作为redis操作的客户端,然后一个意外出现了,启动报:Failed to instantiate [org.redisson.api.Redis ...

  5. java入门,学习笔记

    编译 通过javac编译java程序,会编译出一个后缀为class的文件,我们再通过java虚拟机(jvm)执行编译后的java程序. 在java中始终有一个main函数,它作为程序的入口,程序从这个 ...

  6. 选择排序:直接选择排序&堆排序

    上一篇中, 介绍了交换排序中的冒泡排序和快速排序, 那么这一篇就来介绍一下 选择排序和堆排序, 以及他们与快速排序的比较. 一.直接选择排序 1. 思想 在描述直接选择排序思想之前, 先来一个假设吧. ...

  7. 一次Linux服务器被入侵和删除木马程序的经历

    转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wzlinux.blog.51cto.com/8021085/1740113 一.背景 晚上看到有台服 ...

  8. 复刻smartbits的国产网络测试工具minismb-如何添加数据流

    复刻smartbits的国产网络性能测试工具minismb,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连接数 ...

  9. CRM项目图形交互界面设计

    由于我们组在刚开始的时候 ,进度比较快的!老师本来是打算最后给我们用统一的学校已经封装好的界面给我们的!看着我们的现实都写完了!老师就提前把界面都给我们了!但是觉得界面一般,不怎么好看!我们就全部都是 ...

  10. 使用clamav模块对数据流进行病毒检测

    准备工作:linux下安装clamav成功,启动clamav并打开本地socket监听"/tmp/clamav.socket" clamav开源工程目录:/usr/local/ 修 ...