你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 存储对静态存储帐户中的所有数据进行加密。 默认情况下,数据使用 Microsoft 管理的密钥进行加密。 为了更进一步控制加密密钥,你可以管理自己的密钥。 客户管理的密钥必须存储在 Azure Key Vault 或 Key Vault 托管硬件安全模型 (HSM) 中。
本文介绍了如何使用 Azure 门户、PowerShell 或 Azure CLI,通过存储在密钥保管库中的客户管理的密钥配置加密。 若要了解如何配置使用托管 HSM 中存储的客户管理的密钥进行加密,请参阅配置使用 Azure Key Vault 托管 HSM 中存储的客户管理的密钥进行加密。
注意
Azure 密钥保管库和 Azure 密钥保管库托管 HSM 支持使用相同的 API 和管理界面进行配置。
你可以使用新的或现有的密钥保管库来存储客户管理的密钥。 存储帐户和密钥保管库可能在同一租户的不同区域或订阅中。 若要了解有关 Azure Key Vault 的详细信息,请参阅 Azure Key Vault 概述和什么是 Azure Key Vault?。
使用带有 Azure 存储加密的客户管理的密钥需要为密钥保管库启用软删除和清除保护。 创建新密钥保管库时,默认会启用软删除,并且无法禁用。 你可以在创建密钥保管库时或创建后启用清除保护。
若要了解如何使用 Azure 门户创建密钥保管库,请参阅快速入门:使用 Azure 门户创建密钥保管库。 创建密钥保管库时,选择“启用清除保护”,如下图所示。
若要在现有密钥保管库上启用清除保护,请执行以下步骤:
- 在 Azure 门户中导航到密钥保管库。
- 在“设置”下面,选择“属性”。
- 在“清除保护”部分,选择“启用清除保护” 。
若要使用 PowerShell 创建新密钥保管库,请安装 Az. KeyVault PowerShell 模块的版本 2.0.0 或更高版本。 然后调用 New-AzKeyVault 来创建新密钥保管库。 在 Az.KeyVault 模块的版本 2.0.0 和更高版本中,当创建新密钥保管库时,默认会启用软删除。
以下示例将创建一个启用了软删除和清除保护的新密钥保管库。 请记得将括号中的占位符值替换为你自己的值。
$keyVault = New-AzKeyVault -Name <key-vault> `
-ResourceGroupName <resource_group> `
-Location <location> `
-EnablePurgeProtection
若要了解如何使用 PowerShell 对现有密钥保管库启用清除保护,请参阅 Azure Key Vault 恢复概述。
若要使用 Azure CLI 创建新的 Key Vault,请调用 az keyvault create。 请记得将括号中的占位符值替换为你自己的值:
az keyvault create \
--name <key-vault> \
--resource-group <resource_group> \
--location <region> \
--enable-purge-protection
若要了解如何使用 Azure CLI 对现有密钥保管库启用清除保护,请参阅 Azure Key Vault 恢复概述。
添加密钥
接下来,在密钥保管库中添加密钥。
Azure 存储加密支持大小为 2048、3072 和 4096 的 RSA 和 RSA-HSM 密钥。 有关支持的密钥类型详细信息,请参阅关于密钥。
若要使用 PowerShell 添加密钥,请调用 Add-AzKeyVaultKey。 请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量。
$key = Add-AzKeyVaultKey -VaultName $keyVault.VaultName `
-Name <key> `
-Destination 'Software'
若要使用 Azure CLI 添加密钥,请调用 az keyvault key create。 请记得将括号中的占位符值替换为你自己的值。
az keyvault key create \
--name <key> \
--vault-name <key-vault>
选择托管标识授予对密钥保管库的访问权限
为存储帐户启用客户管理的密钥时,必须指定一个托管标识,用于授权访问密钥所在的密钥保管库。 托管标识必须有权访问密钥保管库中的密钥。
授权访问密钥保管库的托管标识可能是用户分配的或系统分配的托管标识,具体取决于用户方案:
- 如果在创建存储帐户时配置客户管理的密钥,则必须指定用户分配的托管标识。
- 在现有的存储帐户上配置客户管理的密钥时,可以指定用户分配的托管标识或系统分配的托管标识。
若要详细了解系统分配的托管标识和用户分配的托管标识,请参阅托管标识类型。
使用用户分配的托管标识授予访问权限
用户分配的标识是独立的 Azure 资源。 若要了解如何创建和管理用户分配的托管标识,请参阅管理用户分配的托管标识。
新的和现有的存储帐户都可以使用用户分配的标识来授权访问密钥保管库。 在配置客户管理的密钥之前,必须创建用户分配的标识。
使用 Azure 门户配置客户管理的密钥时,可以通过门户用户界面选择现有的用户分配的标识。 有关详细信息,请参阅以下部分之一:
若要使用用户分配的托管标识授权访问密钥保管库,需要使用用户分配的托管标识的资源 ID 和主体 ID。 调用 Get-AzUserAssignedIdentity 以获取用户分配的托管标识,然后将资源 ID 和主体 ID 保存到变量中。 在后续步骤中需要使用这些值:
$userIdentityId = Get-AzUserAssignedIdentity -Name <user-assigned-identity> -ResourceGroupName <resource-group>
$principalId = $userIdentity.PrincipalId
若要使用用户分配的托管标识授权访问密钥保管库,需要使用用户分配的托管标识的资源 ID 和主体 ID。 调用 az identity show 命令以获取用户分配的托管标识,然后将资源 ID 和主体 ID 保存到变量中。 在后续步骤中需要使用这些值:
userIdentityId=$(az identity show --name sample-user-assigned-identity --resource-group storagesamples-rg --query id)
principalId=$(az identity show --name sample-user-assigned-identity --resource-group storagesamples-rg --query principalId)
使用系统分配的托管标识授予访问权限
系统分配的托管标识与 Azure 服务的实例(在本例中为 Azure 存储帐户)相关联。 必须先将系统分配的托管标识显式分配给存储帐户,才能使用系统分配的托管标识来授权访问客户管理的密钥所在的密钥保管库。
只有现有存储帐户可以使用系统分配的标识来授权访问密钥保管库。 如果在创建帐户时配置客户管理的密钥,则新存储帐户必须使用用户分配的标识。
使用系统分配的托管标识在 Azure 门户中配置客户管理的密钥时,系统会在后台将系统分配的托管标识分配给存储帐户。 有关详细信息,请参阅为现有帐户配置客户管理的密钥。
若要将系统分配的托管标识分配给存储帐户,请调用 Set-AzStorageAccount:
$storageAccount = Set-AzStorageAccount -ResourceGroupName <resource_group> `
-Name <storage-account> `
-AssignIdentity
接下来,获取系统分配的托管标识的主体 ID,并将其保存到变量中。 在下一步中需要使用此值来创建密钥保管库访问策略:
$principalId = $storageAccount.Identity.PrincipalId
若要使用系统分配的托管标识来验证对密钥保管库的访问,请通过调用 az storage account update 将系统分配的托管标识分配给存储帐户:
az storage account update \
--name <storage-account> \
--resource-group <resource_group> \
--assign-identity
接下来,获取系统分配的托管标识的主体 ID,并将其保存到变量中。 在下一步中需要使用此值来创建密钥保管库访问策略:
principalId = $(az storage account show --name <storage-account> --resource-group <resource_group> --query identity.principalId)
下一步是配置密钥保管库访问策略。 密钥保管库访问策略可向托管标识授予权限,用于授权访问密钥保管库。 若要详细了解密钥保管库访问策略,请参阅 Azure Key Vault 概述和 Azure Key Vault 安全概述。
若要使用 PowerShell 配置密钥保管库访问策略,请调用 Set-AzKeyVaultAccessPolicy,提供之前为托管标识检索的主体 ID 的变量。
Set-AzKeyVaultAccessPolicy `
-VaultName $keyVault.VaultName `
-ObjectId $principalId `
-PermissionsToKeys wrapkey,unwrapkey,get
若要详细了解如何通过 PowerShell 分配密钥保管库访问策略,请参阅分配 Azure Key Vault 访问策略。
若要使用 PowerShell 配置密钥保管库访问策略,请调用 az keyvault set-policy,提供之前为托管标识检索的主体 ID 的变量。
az keyvault set-policy \
--name <key-vault> \
--resource-group <resource_group>
--object-id $principalId \
--key-permissions get unwrapKey wrapKey
若要详细了解如何通过 Azure CLI 分配密钥保管库访问策略,请参阅分配 Azure Key Vault 访问策略。
使用客户管理的密钥为新存储帐户配置加密时,只要关联的密钥保管库中有新版本可用,就可以选择自动更新用于 Azure 存储加密的密钥版本。 也可显式指定在手动更新密钥版本之前用于加密的密钥版本。
如果在创建存储帐户时配置客户管理的密钥,必须使用现有用户分配的托管标识来授权访问密钥保管库。 用户分配的托管标识必须具有访问密钥保管库的相应权限。
若要通过自动更新密钥版本为新存储帐户配置客户管理的密钥,请执行以下步骤:
在 Azure 门户中,导航到“存储帐户”页,然后选择“创建”按钮以创建新帐户。
按照创建存储帐户中概述的步骤填写“基本信息”、“高级”、“网络”和“数据保护”选项卡上的字段。
在“加密”选项卡上的“启用对客户管理的密钥的支持”字段中,指示要为哪些服务启用对客户管理的密钥的支持。
在“加密类型”字段中,选择“客户管理的密钥(CMK)”。
在“加密密钥”字段中,选择“选择密钥保管库和密钥”,并指定密钥保管库和密钥。
对于“用户分配的标识”字段,选择现有用户分配的托管标识。
选择“查看 + 创建”以验证并创建新帐户。
在创建新的存储帐户时,还可以通过手动更新密钥版本配置客户管理的密钥。 请按照配置加密以手动更新密钥版本中的所述步骤进行操作。
若要通过自动更新密钥版本来配置新存储帐户的客户管理的密钥,请调用 New-AzStorageAccount,如以下示例所示。 使用之前为用户分配的托管标识的资源 ID 创建的变量。 还需要使用密钥保管库 URI 和密钥名称:
New-AzStorageAccount -ResourceGroupName <resource-group> `
-Name <storage-account> `
-Kind StorageV2 `
-SkuName Standard_LRS `
-Location $location `
-IdentityType SystemAssignedUserAssigned `
-UserIdentityId $userIdentityId `
-KeyVaultUri $keyVault.VaultUri `
-KeyName $key.Name `
-KeyVaultUserAssignedIdentityId $userIdentityId
若要通过自动更新密钥版本来配置新存储帐户的客户管理的密钥,请调用 az storage account create,如以下示例所示。 使用之前为用户分配的托管标识的资源 ID 创建的变量。 还需要使用密钥保管库 URI 和密钥名称:
az storage account create \
--name <storage-account> \
--resource-group <resource-group> \
--location <location> \
--sku Standard_LRS \
--kind StorageV2 \
--identity-type SystemAssigned,UserAssigned \
--user-identity-id <user-assigned-managed-identity> \
--encryption-key-vault <key-vault-uri> \
--encryption-key-name <key-name> \
--encryption-key-source Microsoft.Keyvault \
--key-vault-user-identity-id <user-assigned-managed-identity>
使用客户管理的密钥为现有存储帐户配置加密时,只要关联的密钥保管库中有新版本可用,就可以选择自动更新用于 Azure 存储加密的密钥版本。 也可显式指定在手动更新密钥版本之前用于加密的密钥版本。
为现有存储帐户配置客户管理的密钥时,可以使用系统分配的或用户分配的托管标识来授权访问密钥保管库。
Azure 存储可以自动更新客户管理的密钥(用于加密),以使用密钥库中的最新密钥版本。 Azure 存储每天都会在密钥保管库中检查是否有密钥的新版本。 新版本可用时,Azure 存储会自动开始使用最新版本的密钥进行加密。
重要
Azure 存储每天只会在密钥保管库中检查一次是否存在密钥的新版本。 轮换密钥时,请务必等待 24 小时,然后再禁用旧版本。
若要在 Azure 门户中通过自动更新密钥版本为现有帐户配置客户管理的密钥,请执行以下步骤:
导航到存储帐户。
在存储帐户的“设置”边栏选项卡上,单击“加密”。 默认情况下,密钥管理设置为“Microsoft 管理的密钥”,如下图所示。
选择“客户管理的密钥”选项。
选择“从 Key Vault 中选择”选项。
选择“选择密钥保管库和密钥”。
选择包含要使用的密钥的密钥保管库。 你还可以创建新的密钥保管库。
从密钥保管库中选择密钥。 还可以创建新密钥。
选择用于验证对密钥保管库的访问的标识的类型。 选项包括系统分配(默认)或用户分配 。 若要详细了解每种类型的托管标识,请参阅托管标识类型。
- 如果选择“系统分配”并且尚不存在这样的托管标识,则会在后台创建存储帐户的系统分配托管标识。
- 如果选择“用户分配”,则必须选择有权访问密钥保管库的现有用户分配标识。 若要了解如何创建用户分配的标识,请参阅管理用户分配的托管标识。
保存所做更改。
指定密钥后,Azure 门户会指示启用密钥版本的自动更新,并显示当前用于加密的密钥版本。 门户还显示用于授权访问密钥保管库的托管标识的类型和托管标识的主体 ID。
若要使用 PowerShell 通过自动更新密钥版本为现有帐户配置客户管理的密钥,请安装 Az.Storage 模块 2.0.0 或更高版本。
接下来,调用 Set-AzStorageAccount 以更新存储帐户的加密设置,忽略密钥版本。 包括 -KeyvaultEncryption 选项,以便为存储帐户启用客户管理的密钥。
Set-AzStorageAccount -ResourceGroupName $storageAccount.ResourceGroupName `
-AccountName $storageAccount.StorageAccountName `
-KeyvaultEncryption `
-KeyName $key.Name `
-KeyVaultUri $keyVault.VaultUri
若要使用 Azure CLI 通过自动更新密钥版本为现有帐户配置客户管理的密钥,请安装 Azure CLI 2.4.0 或更高版本。 有关详细信息,请参阅安装 Azure CLI。
接下来,调用 az storage account update 以更新存储帐户的加密设置,忽略密钥版本。 包括 --encryption-key-source 参数并将其设置为 Microsoft.Keyvault 即可为帐户启用客户管理的密钥。
key_vault_uri=$(az keyvault show \
--name <key-vault> \
--resource-group <resource_group> \
--query properties.vaultUri \
--output tsv)
az storage account update
--name <storage-account> \
--resource-group <resource_group> \
--encryption-key-name <key> \
--encryption-key-source Microsoft.Keyvault \
--encryption-key-vault $key_vault_uri
如果希望手动更新密钥版本,请在使用客户管理的密钥配置加密时显式指定该版本。 在这种情况下,在密钥保管库中创建新版本时,Azure 存储不会自动更新密钥版本。 若要使用新的密钥版本,必须手动更新用于 Azure 存储加密的版本。
若要在 Azure 门户中配置客户管理的密钥并手动更新密钥版本,请指定密钥 URI,包括版本。 若要将某个密钥指定为 URI,请执行下列步骤:
若要在 Azure 门户中查找密钥 URI,请导航到 Key Vault,然后选择“密钥”设置。 选择所需的密钥,然后单击该密钥以查看其版本。 选择一个密钥版本,查看该版本的设置。
复制“密钥标识符”字段的值(提供 URI)。
在存储帐户的“加密密钥”设置中,选择“输入密钥 URI”选项。
将复制的 URI 粘贴到“密钥 URI”字段中。 从 URI 中省略密钥版本,以启用自动更新密钥版本。
指定包含密钥保管库的订阅。
指定系统分配或用户分配的托管标识。
保存所做更改。
若要配置客户管理的密钥并手动更新密钥版本,请在为存储帐户配置加密时显式提供密钥版本。 调用 AzStorageAccount 以更新存储帐户的加密设置(如以下示例所示),并包含 -KeyvaultEncryption 选项,以便为存储帐户启用客户管理的密钥。
请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量。
Set-AzStorageAccount -ResourceGroupName $storageAccount.ResourceGroupName `
-AccountName $storageAccount.StorageAccountName `
-KeyvaultEncryption `
-KeyName $key.Name `
-KeyVersion $key.Version `
-KeyVaultUri $keyVault.VaultUri
手动更新密钥版本时,需要更新存储帐户的加密设置以使用新版本。 首先调用 Get-AzKeyVaultKey 以获取最新密钥版本。 然后调用 Set-AzStorageAccount 来更新存储帐户的加密设置,以使用该密钥的新版本,如前面示例所示。
若要配置客户管理的密钥并手动更新密钥版本,请在为存储帐户配置加密时显式提供密钥版本。 请调用 az storage account update,以便更新存储帐户的加密设置,如以下示例所示。 包括 --encryption-key-source 参数并将其设置为 Microsoft.Keyvault 即可为帐户启用客户管理的密钥。
请记得将括号中的占位符值替换为你自己的值。
key_vault_uri=$(az keyvault show \
--name <key-vault> \
--resource-group <resource_group> \
--query properties.vaultUri \
--output tsv)
key_version=$(az keyvault key list-versions \
--name <key> \
--vault-name <key-vault> \
--query [-1].kid \
--output tsv | cut -d '/' -f 6)
az storage account update
--name <storage-account> \
--resource-group <resource_group> \
--encryption-key-name <key> \
--encryption-key-version $key_version \
--encryption-key-source Microsoft.Keyvault \
--encryption-key-vault $key_vault_uri
手动更新密钥版本时,需要更新存储帐户的加密设置以使用新版本。 首先,通过调用 az keyvault show 查询 Key Vault URI,并通过调用 az keyvault key list-versions 查询密钥版本。 然后调用 az storage account update 来更新存储帐户的加密设置,以使用新的密钥版本,如上一示例所示。
更改密钥
你可以在任何时候更改用于 Azure 存储加密的密钥。
若要使用 Azure 门户更改密钥,请执行以下步骤:
- 导航到你的存储帐户,并显示“加密”设置。
- 选择密钥保管库并选择一个新密钥。
- 保存更改。
撤销客户托管密钥
撤消客户管理的密钥会删除存储帐户和密钥保管库之间的关联。
可以通过删除密钥保管库访问策略来撤销客户管理的密钥。 若要使用 PowerShell 撤销客户托管密钥,请调用 Remove-AzKeyVaultAccessPolicy 命令,如下例所示。 请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量。
Remove-AzKeyVaultAccessPolicy -VaultName $keyVault.VaultName `
-ObjectId $storageAccount.Identity.PrincipalId `
可以通过删除密钥保管库访问策略来撤销客户管理的密钥。 若要使用 Azure CLI 撤销客户托管密钥,请调用 az keyvault delete-policy 命令,如下例所示。 请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量。
az keyvault delete-policy \
--name <key-vault> \
--object-id $storage_account_principal
禁用客户托管密钥
禁用客户托管密钥时,将再次使用 Microsoft 托管密钥对存储帐户进行加密。
若要在 Azure 门户中禁用客户管理的密钥,请执行以下步骤:
- 导航到你的存储帐户,并显示“加密”设置。
- 取消选中“使用自己的密钥”设置旁边的复选框。
若要使用 PowerShell 禁用客户管理的密钥,请使用 -StorageEncryption 选项调用 Set-AzStorageAccount,如下例所示。 请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量。
Set-AzStorageAccount -ResourceGroupName $storageAccount.ResourceGroupName `
-AccountName $storageAccount.StorageAccountName `
-StorageEncryption
若要使用 Azure CLI 禁用客户托管密钥,请调用 az storage account update 并将 --encryption-key-source parameter 设置为 Microsoft.Storage,如下例所示。 请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量。
az storage account update
--name <storage-account> \
--resource-group <resource_group> \
--encryption-key-source Microsoft.Storage
后续步骤