你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

为 Azure 弹性 SAN 配置客户管理的密钥

写入弹性 SAN 卷的所有数据都会由数据加密密钥 (DEK) 自动进行静态加密。 Azure 使用信封加密通过密钥加密密钥 (KEK) 加密 DEK。 默认情况下,KEK 由平台管理(由 Microsoft 管理),但你可以创建和管理自己的 KEK。

本文介绍如何使用 Azure 密钥保管库中存储的客户管理的密钥配置弹性 SAN 卷组的加密。

限制

以下列表包含目前提供弹性 SAN 的区域,展示了哪些区域同时支持区域冗余存储 (ZRS) 和本地冗余存储 (LRS),或仅支持 LRS:

  • 南非北部 - LRS
  • 东亚 - LRS
  • 东南亚 - LRS
  • 巴西南部 - LRS
  • 加拿大中部 - LRS
  • 法国中部 - LRS 和 ZRS
  • 德国中西部 - LRS
  • 澳大利亚东部 - LRS
  • 北欧 - LRS 和 ZRS
  • 西欧 - LRS 和 ZRS
  • 英国南部 - LRS
  • 日本东部 - LRS
  • 韩国中部 - LRS
  • 美国中部
  • 美国东部 - LRS
  • 美国中南部 - LRS
  • 美国东部 2 - LRS
  • 美国西部 2 - LRS 和 ZRS
  • 美国西部 3 - LRS
  • 瑞典中部 - LRS
  • 瑞士北部 - LRS

先决条件

若要执行本文中所述的操作,必须准备 Azure 帐户和计划使用的管理工具。 准备工作包括安装必要的模块、登录到帐户以及为 PowerShell 和 Azure CLI 设置变量。 本文中使用了同一组变量,因此通过设置它们现可在所有示例中使用相同的变量。

若要使用 PowerShell 执行本文中所述的操作,请执行以下操作:

  1. 安装最新版本的 Azure PowerShell(如果尚未安装)。

  2. 安装 Azure PowerShell 后,使用 Install-Module -Name Az.ElasticSan -Repository PSGallery 安装弹性 SAN 扩展版本 0.1.2 或更高。

  3. 登录 Azure。

    Connect-AzAccount
    

创建要在本文中的 PowerShell 示例中使用的变量

复制示例代码,并将所有占位符文本替换为你自己的值。 在本文中的所有示例中使用相同的变量:

# Define some variables
# The name of the resource group where the resources will be deployed.
$RgName          = "ResourceGroupName"

# The name of the Elastic SAN that contains the volume group to be configured.
$EsanName        = "ElasticSanName"

# The name of the Elastic SAN volume group to be configured.
$EsanVgName      = "ElasticSanVolumeGroupName"

# The region where the new resources will be created.
$Location        = "Location"

# The name of the Azure Key Vault that will contain the KEK.
$KvName          = "KeyVaultName"

# The name of the Azure Key Vault key that is the KEK.
$KeyName         = "KeyName"

# The name of the user-assigned managed identity, if applicable.
$ManagedUserName = "ManagedUserName"

配置密钥保管库

你可以使用新的或现有的密钥保管库来存储客户管理的密钥。 加密的资源和密钥保管库可以位于同一 Microsoft Entra ID 租户的不同区域或订阅中。 若要了解有关 Azure Key Vault 的详细信息,请参阅 Azure Key Vault 概述什么是 Azure Key Vault?

使用带有加密的客户管理的密钥时,需要为密钥保管库启用软删除和清除保护。 创建新密钥保管库时,默认会启用软删除,并且无法禁用。 你可以在创建密钥保管库时或创建后启用清除保护。 Azure 弹性 SAN 加密支持 2048、3072 和 4096 大小的 RSA 密钥。

Azure Key Vault 支持通过 Azure RBAC 权限模型使用 Azure RBAC 进行授权。 Microsoft 建议使用 Azure RBAC 权限模型,而不是密钥保管库访问策略。 有关详细信息,请参阅使用 Azure RBAC 授予应用程序访问 Azure Key Vault 的权限

准备密钥保管库以将其用作卷组 KEK 的存储涉及两个步骤:

  • 创建启用了软删除和清除保护的新密钥保管库,或为现有密钥保管库启用清除保护。
  • 创建或分配具有备份创建删除获取导入获取列表更新还原权限的 Azure RBAC 角色。

下面的示例:

  • 创建一个启用了软删除和清除保护的新密钥保管库。
  • 获取用户帐户的 UPN。
  • 将新密钥保管库的密钥保管库加密管理人员角色分配给帐户。

使用本文前面定义的相同变量

# Setup the parameters to create the key vault.
$NewKvArguments = @{
    Name                    = $KvName
    ResourceGroupName       = $RgName
    Location                = $Location
    EnablePurgeProtection   = $true
    EnableRbacAuthorization = $true
}

# Create the key vault.
$KeyVault = New-AzKeyVault @NewKvArguments

# Get the UPN of the currently loggged in user.
$MyAccountUpn = (Get-AzADUser -SignedIn).UserPrincipalName

# Setup the parameters to create the role assignment.
$CrptoOfficerRoleArguments = @{
    SignInName         = $MyAccountUpn
    RoleDefinitionName = "Key Vault Crypto Officer"
    Scope              = $KeyVault.ResourceId
}

# Assign the Cypto Officer role to your account for the key vault.
New-AzRoleAssignment @CrptoOfficerRoleArguments

若要了解如何使用 PowerShell 对现有密钥保管库启用清除保护,请参阅 Azure Key Vault 恢复概述

若要详细了解如何使用 PowerShell 来分配 RBAC 角色,请参阅使用 Azure PowerShell 分配 Azure 角色

添加密钥

接下来,在密钥保管库中添加密钥。 在添加密钥之前,请确保已将“密钥保管库加密管理人员”角色分配给自己。

Azure 存储和弹性 SAN 加密支持 2048、3072 和 4096 大小的 RSA 密钥。 有关支持的密钥类型详细信息,请参阅关于密钥

使用这些示例命令通过 PowerShell 将密钥添加到密钥保管库。 使用本文前面定义的相同变量

# Get the key vault where the key is to be added.
$KeyVault = Get-AzKeyVault -ResourceGroupName $RgName -VaultName $KvName

# Setup the parameters to add the key to the vault.
$NewKeyArguments = @{
    Name        = $KeyName
    VaultName   = $KeyVault.VaultName
    Destination = "Software"
}

# Add the key to the vault.
$Key = Add-AzKeyVaultKey @NewKeyArguments

选择密钥轮换策略

遵循加密最佳做法意味着定期轮换保护你的弹性 SAN 卷组的密钥,通常至少每两年轮换一次。 Azure 弹性 SAN 永远不会修改密钥保管库中的密钥,但你可以配置密钥轮换策略来根据合规性要求轮换密钥。 有关详细信息,请参阅在 Azure 密钥保管库中配置加密密钥自动轮换

在密钥保管库中轮换密钥后,必须更新弹性 SAN 卷组的加密配置才能使用新的密钥版本。 客户管理的密钥支持自动更新和手动更新 KEK 版本。 确定在为新卷组或现有卷组配置客户管理的密钥之前要使用的方法。

有关密钥轮换的详细信息,请参阅更新密钥版本

重要

修改密钥或密钥版本时,根数据加密密钥的保护会更改,但是 Azure 弹性 SAN 卷组中的数据将始终保持加密状态。 您不需要执行其他操作来确保您的数据安全。 轮换密钥版本不会影响性能,也不会产生与之关联的停机时间。

自动轮换密钥版本

Azure 弹性 SAN 可以自动更新客户管理的密钥(用于加密),以使用密钥库中的最新密钥版本。 弹性 SAN 每天都会在密钥保管库中检查是否有密钥的新版本。 新版本可用时,它会自动开始使用最新版本的密钥进行加密。 轮换密钥时,请务必等待 24 小时,然后再禁用旧版本。

重要

如果弹性 SAN 卷组以前配置为手动更新密钥版本,而你想要将其更改为自动更新,请将密钥版本更改为空字符串。 有关手动更改密钥版本的详细信息,请参阅自动更新密钥版本

手动轮换密钥版本

如果希望手动更新密钥版本,请在配置使用客户管理的密钥进行加密时显式指定特定版本的 URI。 当你指定 URI 时,在密钥保管库中创建新版本时,弹性 SAN 不会自动更新密钥版本。 要让弹性 SAN 使用新的密钥版本,必须手动更新它。

若要在 Azure 门户中查找特定密钥版本的 URI,请执行以下操作:

  1. 导航到你的密钥保管库。
  2. 选择“对象”下的“密钥”
  3. 选择所需的密钥,查看其版本。
  4. 选择一个密钥版本,查看该版本的设置。
  5. 复制“密钥标识符”字段的值(提供 URI)。
  6. 保存复制的文本,以便在为卷组配置加密时使用。

Screenshot showing key vault key URI in Azure portal.

选择托管标识授予对密钥保管库的访问权限

为弹性 SAN 卷组启用客户管理的加密密钥时,必须指定一个托管标识,用于授权访问密钥所在的密钥保管库。 托管标识必须具有以下权限:

  • get
  • wrapkey
  • unwrapkey

授权访问密钥保管库的托管标识可能是用户分配的托管标识或系统分配的托管标识。 若要详细了解系统分配的托管标识和用户分配的托管标识,请参阅托管标识类型

创建卷组时,会自动为其创建系统分配的标识。 如果要使用用户分配的标识,请在为卷组配置客户管理的加密密钥之前创建它。 若要了解如何创建和管理用户分配的托管标识,请参阅管理用户分配的托管标识

使用用户分配的托管标识授予访问权限

为新卷组启用客户管理的密钥时,必须指定用户分配的托管标识。 现有卷组支持使用用户分配的托管标识或系统分配的托管标识来配置客户管理的密钥。

使用用户分配的托管标识配置客户管理的密钥时,用户分配的托管标识用来授予对包含密钥的密钥保管库的访问权限。 在配置客户管理的密钥之前,必须创建用户分配的标识。

用户分配的托管标识是独立的 Azure 资源。 若要详细了解用户分配的托管标识,请参阅托管标识类型。 若要了解如何创建和管理用户分配的托管标识,请参阅管理用户分配的托管标识

用户分配的托管标识必须具有访问密钥保管库中的此密钥的权限。 可以手动向标识授予权限,或者分配具有密钥保管库范围的内置角色来授予这些权限。

以下示例介绍如何:

  • 创建新的、用户分配的托管标识。
  • 等待用户分配的标识完成创建。
  • 从新标识获取 PrincipalId
  • 将 RBAC 角色分配给范围限定为密钥保管库的新标识。

使用本文前面定义的相同变量

# Create a new user-assigned managed identity.
$UserIdentity = New-AzUserAssignedIdentity -ResourceGroupName $RgName -Name $ManagedUserName -Location $Location

提示

等待大约 1 分钟,待用户分配的标识完成创建,然后继续操作。

# Get the `PrincipalId` for the new identity.
$PrincipalId = $UserIdentity.PrincipalId

# Setup the parameters to assign the Crypto Service Encryption User role.
$CryptoUserRoleArguments = @{
    ObjectId           = $PrincipalId
    RoleDefinitionName = "Key Vault Crypto Service Encryption User"
    Scope              = $KeyVault.ResourceId
}

# Assign the Crypto Service Encryption User role to the managed identity so it can access the key in the vault.
New-AzRoleAssignment @CryptoUserRoleArguments

使用系统分配的托管标识授予访问权限

系统分配的托管标识与 Azure 服务的实例(例如 Azure 弹性 SAN 卷组)相关联。

系统分配的托管标识必须拥有访问密钥保管库中的密钥的权限。 本文使用具有密钥保管库范围的系统分配的托管标识的“密钥保管库加密服务加密用户”角色来授予这些权限

创建卷组时,如果使用 New-AzElasticSanVolumeGroup 命令指定 -IdentityType "SystemAssigned" 参数,会自动为其创建系统分配的标识。 创建卷组后,系统分配的标识才可用。 你还必须将“密钥保管库加密服务加密用户”等合适的角色分配给标识,然后它才能访问密钥保管库中的加密密钥。 因此,无法在创建卷组期间将客户管理的密钥配置为使用系统分配的标识。 使用客户管理的密钥创建新卷组时,创建卷组时必须使用用户分配的标识,可以在创建完成后配置系统分配的标识。

使用此示例代码将所需的 RBAC 角色分配给系统分配的托管标识,范围限定为密钥保管库。 使用本文前面定义的相同变量

# Get the Elastic SAN volume group.
$ElasticSanVolumeGroup = Get-AzElasticSanVolumeGroup -Name $EsanVgName -ElasticSanName $EsanName -ResourceGroupName $RgName

# Generate a system-assigned identity if one does not already exist.
If ($ElasticSanVolumeGroup.IdentityPrincipalId -eq $null) {
Update-AzElasticSanVolumeGroup -ResourceGroupName $RgName -ElasticSanName $EsanName -Name $EsanVgName -IdentityType "SystemAssigned"}

# Get the `PrincipalId` (system-assigned identity) of the volume group.
$PrincipalId = $ElasticSanVolumeGroup.IdentityPrincipalId

# Setup the parameters to assign the Crypto Service Encryption User role.
$CryptoUserRoleArguments = @{
    ObjectId           = $PrincipalId
    RoleDefinitionName = "Key Vault Crypto Service Encryption User"
    Scope              = $KeyVault.ResourceId
}

# Assign the Crypto Service Encryption User role.
New-AzRoleAssignment @CryptoUserRoleArguments

为卷组配置客户管理的密钥

选择 Azure PowerShell 模块或 Azure CLI 选项卡,了解如何使用你偏好的管理工具配置客户管理的加密密钥。

你已选择 PowerShell,那么现在请根据你是要在新卷组创建期间配置设置还是更新现有卷组的设置,选择相对应的选项卡。

使用此示例将客户管理的密钥配置为在使用 PowerShell 创建新卷组期间自动更新密钥版本

# Setup the parameters to create the volume group.
$NewVgArguments        = @{
    Name                         = $EsanVgName
    ElasticSanName               = $EsanName
    ResourceGroupName            = $RgName
    ProtocolType                 = "Iscsi"
    Encryption                   = "EncryptionAtRestWithCustomerManagedKey"
    KeyName                      = $KeyName
    KeyVaultUri                  = $KeyVault.VaultUri
    IdentityType                 = "UserAssigned"
    IdentityUserAssignedIdentity = @{$UserIdentity.Id=$UserIdentity}
    EncryptionIdentityEncryptionUserAssignedIdentity = $UserIdentity.Id
}

# Create the volume group.
New-AzElasticSanVolumeGroup @NewVgArguments

若要将客户管理的密钥配置为在使用 PowerShell 创建新卷组期间手动更新密钥版本,请添加 KeyVersion 参数,如以下示例所示

# Setup the parameters to create the volume group.
$NewVgArguments        = @{
    Name                         = $EsanVgName
    ElasticSanName               = $EsanName
    ResourceGroupName            = $RgName
    ProtocolType                 = "Iscsi"
    Encryption                   = "EncryptionAtRestWithCustomerManagedKey"
    KeyName                      = $KeyName
    KeyVaultUri                  = $KeyVault.VaultUri
    KeyVersion                   = $Key.Version
    IdentityType                 = "UserAssigned"
    IdentityUserAssignedIdentity = @{$UserIdentity.Id=$UserIdentity}
    EncryptionIdentityEncryptionUserAssignedIdentity = $UserIdentity.Id
}

# Create the volume group.
New-AzElasticSanVolumeGroup @NewVgArguments

后续步骤