你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn 。
本文内容
Azure 存储对静态存储帐户中的所有数据进行加密。 默认情况下,数据使用 Microsoft 管理的密钥进行加密。 为了更进一步控制加密密钥,你可以管理自己的密钥。 客户管理的密钥必须存储在 Azure Key Vault 或 Azure Key Vault 托管硬件安全模型 (HSM) 中。
本文介绍如何在创建新存储帐户时使用客户管理的密钥来配置加密。 客户管理的密钥存储在密钥保管库中。
若要了解如何为现有存储帐户配置客户管理的密钥,请参阅在 Azure 密钥保管库中为现有存储帐户配置客户管理的密钥 。
备注
Azure Key Vault 和 Azure Key Vault 托管 HSM 支持使用相同的 API 和管理接口来配置客户管理的密钥。 Azure Key Vault 支持的任何操作也受 Azure Key Vault 托管 HSM 支持。
你可以使用新的或现有的密钥保管库来存储客户管理的密钥。 存储帐户和密钥保管库可能在同一租户的不同区域或订阅中。 若要了解有关 Azure Key Vault 的详细信息,请参阅 Azure Key Vault 概述 和什么是 Azure Key Vault? 。
使用带有 Azure 存储加密的客户管理的密钥需要为密钥保管库启用软删除和清除保护。 创建新密钥保管库时,默认会启用软删除,并且无法禁用。 你可以在创建密钥保管库时或创建后启用清除保护。
Azure Key Vault 支持通过 Azure RBAC 权限模型使用 Azure RBAC 进行授权。 Microsoft 建议使用 Azure RBAC 权限模型,而不是密钥保管库访问策略。 有关详细信息,请参阅使用 Azure RBAC 授予应用程序访问 Azure Key Vault 的权限 。
若要了解如何使用 Azure 门户创建密钥保管库,请参阅快速入门:使用 Azure 门户创建密钥保管库 。 创建密钥保管库时,选择“启用清除保护”,如下图所示。
若要在现有密钥保管库上启用清除保护,请执行以下步骤:
在 Azure 门户中导航到密钥保管库。
在“设置”下面,选择“属性”。
在“清除保护”部分,选择“启用清除保护” 。
若要使用 PowerShell 创建新密钥保管库,请安装 Az.KeyVault PowerShell 模块的版本 2.0.0 或更高版本。 然后调用 New-AzKeyVault 来创建新密钥保管库。 在 Az.KeyVault 模块的版本 2.0.0 和更高版本中,当创建新密钥保管库时,默认会启用软删除。
以下示例创建一个启用了软删除和清除保护的新密钥保管库。 密钥保管库的权限模型设置为使用 Azure RBAC。 请记得将括号中的占位符值替换为你自己的值。
$rgName = "<resource_group>"
$location = "<location>"
$kvName = "<key-vault>"
$keyVault = New-AzKeyVault -Name $kvName `
-ResourceGroupName $rgName `
-Location $location `
-EnablePurgeProtection `
-EnableRbacAuthorization
若要了解如何使用 PowerShell 对现有密钥保管库启用清除保护,请参阅 Azure Key Vault 恢复概述 。
创建密钥保管库后,你需要将“密钥保管库加密管理人员”角色分配给自己。 使用此角色可以在密钥保管库中创建密钥。 以下示例将此角色分配给用户,范围限定为密钥保管库:
New-AzRoleAssignment -SignInName "<user-email>" `
-RoleDefinitionName "Key Vault Crypto Officer" `
-Scope $keyVault.ResourceId
若要详细了解如何使用 PowerShell 来分配 RBAC 角色,请参阅使用 Azure PowerShell 分配 Azure 角色 。
若要使用 Azure CLI 创建新的 Key Vault,请调用 az keyvault create 。 以下示例创建一个启用了软删除和清除保护的新密钥保管库。 密钥保管库的权限模型设置为使用 Azure RBAC。 请记得将括号中的占位符值替换为你自己的值。
rgName="<resource_group>"
location="<location>"
kvName="<key-vault>"
az keyvault create \
--name $kvName \
--resource-group $rgName \
--location $location \
--enable-purge-protection \
--enable-rbac-authorization
若要了解如何使用 Azure CLI 对现有密钥保管库启用清除保护,请参阅 Azure Key Vault 恢复概述 。
创建密钥保管库后,你需要将“密钥保管库加密管理人员”角色分配给自己。 使用此角色可以在密钥保管库中创建密钥。 以下示例将此角色分配给用户,范围限定为密钥保管库:
kvResourceId=$(az keyvault show --resource-group $rgName \
--name $kvName \
--query id \
--output tsv)
az role assignment create --assignee "<user-email>" \
--role "Key Vault Crypto Officer" \
--scope $kvResourceId
若要详细了解如何使用 Azure CLI 分配 RBAC 角色,请参阅使用 Azure CLI 分配 Azure 角色 。
添加密钥
接下来,在密钥保管库中添加密钥。 在添加密钥之前,请确保你已为自己分配了“密钥保管库加密管理人员”角色。
Azure 存储加密支持大小为 2048、3072 和 4096 的 RSA 和 RSA-HSM 密钥。 有关支持的密钥类型详细信息,请参阅关于密钥 。
若要使用 PowerShell 添加密钥,请调用 Add-AzKeyVaultKey 。 请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量。
$keyName = "<key-name>"
$key = Add-AzKeyVaultKey -VaultName $keyVault.VaultName `
-Name $keyName `
-Destination 'Software'
若要使用 Azure CLI 添加密钥,请调用 az keyvault key create 。 请记得将括号中的占位符值替换为你自己的值。
keyName="<key-name>"
az keyvault key create \
--name $keyName \
--vault-name $kvName
使用用户分配的托管标识授予对密钥保管库的访问权限
为新存储帐户启用客户管理的密钥时,必须指定用户分配的托管标识。 现有存储帐户支持使用用户分配的托管标识或系统分配的托管标识来配置客户管理的密钥。
使用用户分配的托管标识配置客户管理的密钥时,用户分配的托管标识用来授予对包含密钥的密钥保管库的访问权限。 在配置客户管理的密钥之前,必须创建用户分配的标识。
用户分配的托管标识是独立的 Azure 资源。 若要详细了解用户分配的托管标识,请参阅托管标识类型 。 若要了解如何创建和管理用户分配的托管标识,请参阅管理用户分配的托管标识 。
用户分配的托管标识必须具有访问密钥保管库中的此密钥的权限。 将“密钥保管库加密服务加密用户”角色分配给用户分配的托管标识(范围是密钥保管库),以授予这些权限。
必须先将“密钥保管库加密服务加密用户”角色分配给用户分配的托管标识(范围是密钥保管库),然后才能使用用户分配的托管标识配置客户管理的密钥。 此角色授予用户分配的托管标识访问密钥保管库中的密钥的权限。 若要详细了解如何使用 Azure 门户分配 Azure RBAC 角色,请参阅使用 Azure 门户分配 Azure 角色 。
使用 Azure 门户配置客户管理的密钥时,可以通过门户用户界面选择现有的用户分配的标识。
以下示例显示了如何检索用户分配的托管标识并向其分配所需的 RBAC 角色(范围是密钥保管库)。 请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量:
$userIdentity = Get-AzUserAssignedIdentity -Name <user-assigned-identity> `
-ResourceGroupName $rgName
$principalId = $userIdentity.PrincipalId
New-AzRoleAssignment -ObjectId $principalId `
-RoleDefinitionName "Key Vault Crypto Service Encryption User" `
-Scope $keyVault.ResourceId
以下示例显示了如何检索用户分配的托管标识并向其分配所需的 RBAC 角色(范围是密钥保管库)。 请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量:
identityResourceId=$(az identity show --name <user-assigned-identity> \
--resource-group $rgName \
--query id \
--output tsv)
principalId=$(az identity show --name <user-assigned-identity> \
--resource-group $rgName \
--query principalId \
--output tsv)
az role assignment create --assignee-object-id $principalId \
--role "Key Vault Crypto Service Encryption User" \
--scope $kvResourceId \
--assignee-principal-type ServicePrincipal
使用客户管理的密钥为新存储帐户配置加密时,只要关联的密钥保管库中有新版本可用,就可以选择自动更新用于 Azure 存储加密的密钥版本。 也可显式指定在手动更新密钥版本之前用于加密的密钥版本。
如果在创建存储帐户时配置客户管理的密钥,必须使用现有用户分配的托管标识来授权访问密钥保管库。 用户分配的托管标识必须具有访问密钥保管库的相应权限。 有关详细信息,请参阅向 Azure Key Vault 进行身份验证 。
Azure 存储可以自动更新客户管理的密钥(用于加密),以使用密钥库中的最新密钥版本。 Azure 存储每天都会在密钥保管库中检查是否有密钥的新版本。 新版本可用时,Azure 存储会自动开始使用最新版本的密钥进行加密。
重要
Azure 存储每天只会在密钥保管库中检查一次是否存在密钥的新版本。 轮换密钥时,请务必等待 24 小时,然后再禁用旧版本。
若要通过自动更新密钥版本为新存储帐户配置客户管理的密钥,请执行以下步骤:
在 Azure 门户中,导航到“存储帐户”页,然后选择“创建”按钮以创建新帐户。
按照创建存储帐户 中概述的步骤填写“基本信息”、“高级”、“网络”和“数据保护”选项卡上的字段。
在“加密”选项卡上的“启用对客户管理的密钥的支持”字段中,指示要为哪些服务启用对客户管理的密钥的支持。
在“加密类型”字段中,选择“客户管理的密钥(CMK)”。
在“加密密钥”字段中,选择“选择密钥保管库和密钥”,并指定密钥保管库和密钥。
对于“用户分配的标识”字段,选择现有用户分配的托管标识。
选择“查看”按钮以验证并创建帐户。
在创建新的存储帐户时,还可以通过手动更新密钥版本配置客户管理的密钥。 请按照配置加密以手动更新密钥版本 中的所述步骤进行操作。
若要通过自动更新密钥版本来配置新存储帐户的客户管理的密钥,请调用 New-AzStorageAccount ,如以下示例所示。 使用之前为用户分配的托管标识的资源 ID 创建的变量。 还需要使用密钥保管库 URI 和密钥名:
$accountName = "<storage-account>"
New-AzStorageAccount -ResourceGroupName $rgName `
-Name $accountName `
-Kind StorageV2 `
-SkuName Standard_LRS `
-Location $location `
-AllowBlobPublicAccess $false `
-IdentityType SystemAssignedUserAssigned `
-UserAssignedIdentityId $userIdentity.Id `
-KeyVaultUri $keyVault.VaultUri `
-KeyName $key.Name `
-KeyVaultUserAssignedIdentityId $userIdentity.Id
若要通过自动更新密钥版本来配置新存储帐户的客户管理的密钥,请调用 az storage account create ,如以下示例所示。 使用之前为用户分配的托管标识的资源 ID 创建的变量。 还需要使用密钥保管库 URI 和密钥名:
accountName="<storage-account>"
az storage account create \
--name $accountName \
--resource-group $rgName \
--location $location \
--sku Standard_LRS \
--kind StorageV2 \
--identity-type SystemAssigned,UserAssigned \
--user-identity-id $identityResourceId \
--encryption-key-vault <key-vault-uri> \
--encryption-key-name $keyName \
--encryption-key-source Microsoft.Keyvault \
--key-vault-user-identity-id $identityResourceId
如果首选手动更新密钥版本,请在创建存储帐户的过程中在使用客户管理的密钥配置加密时显式指定该版本。 在这种情况下,在密钥保管库中创建新版本时,Azure 存储不会自动更新密钥版本。 若要使用新的密钥版本,必须手动更新用于 Azure 存储加密的版本。
如果在创建存储帐户时配置客户管理的密钥,必须使用现有用户分配的托管标识来授权访问密钥保管库。 用户分配的托管标识必须具有访问密钥保管库的相应权限。 有关详细信息,请参阅向 Azure Key Vault 进行身份验证 。
若要在 Azure 门户中配置客户管理的密钥并手动更新密钥版本,请在创建存储帐户时指定密钥 URI(包括版本)。 若要将某个密钥指定为 URI,请执行下列步骤:
在 Azure 门户中,导航到“存储帐户”页,然后选择“创建”按钮以创建新帐户。
按照创建存储帐户 中概述的步骤填写“基本信息”、“高级”、“网络”和“数据保护”选项卡上的字段。
在“加密”选项卡上的“启用对客户管理的密钥的支持”字段中,指示要为哪些服务启用对客户管理的密钥的支持。
在“加密类型”字段中,选择“客户管理的密钥(CMK)”。
若要在 Azure 门户中查找密钥 URI,请导航到 Key Vault,然后选择“密钥”设置。 选择所需的密钥,然后选择该密钥以查看其版本。 选择一个密钥版本,查看该版本的设置。
复制“密钥标识符”字段的值(提供 URI)。
在存储帐户的“加密密钥”设置中,选择“输入密钥 URI”选项。
将复制的 URI 粘贴到“密钥 URI”字段中。 在 URI 上包括密钥版本,以配置密钥版本的手动更新。
通过选择“选择标识”链接来指定用户分配的托管标识。
选择“查看”按钮以验证并创建帐户。
若要配置客户管理的密钥并手动更新密钥版本,请在创建存储帐户的过程中在配置加密时显式提供密钥版本。 调用 AzStorageAccount 以更新存储帐户的加密设置(如以下示例所示),并包含 -KeyvaultEncryption 选项,以便为存储帐户启用客户管理的密钥。
请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量。
$accountName = "<storage-account>"
New-AzStorageAccount -ResourceGroupName $rgName `
-Name $accountName `
-Kind StorageV2 `
-SkuName Standard_LRS `
-Location $location `
-AllowBlobPublicAccess $false `
-IdentityType SystemAssignedUserAssigned `
-UserAssignedIdentityId $userIdentity.Id `
-KeyVaultUri $keyVault.VaultUri `
-KeyName $key.Name `
-KeyVersion $key.Version `
-KeyVaultUserAssignedIdentityId $userIdentity.Id
手动更新密钥版本时,需要更新存储帐户的加密设置以使用新版本。 首先调用 Get-AzKeyVaultKey 以获取最新密钥版本。 然后调用 Set-AzStorageAccount 来更新存储帐户的加密设置,以使用该密钥的新版本,如前面示例所示。
若要配置客户管理的密钥并手动更新密钥版本,请在创建存储帐户的过程中在配置加密时显式提供密钥版本。 请调用 az storage account update ,以便更新存储帐户的加密设置,如以下示例所示。 包括 --encryption-key-source
参数并将其设置为 Microsoft.Keyvault
即可为帐户启用客户管理的密钥。
请记得将括号中的占位符值替换为你自己的值。
accountName="<storage-account>"
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 create \
--name $accountName \
--resource-group $rgName \
--location $location \
--sku Standard_LRS \
--kind StorageV2 \
--allow-blob-public-access false \
--identity-type SystemAssigned,UserAssigned \
--user-identity-id $identityResourceId \
--encryption-key-vault $keyVaultUri \
--encryption-key-name $keyName \
--encryption-key-source Microsoft.Keyvault \
--encryption-key-version $keyVersion \
--key-vault-user-identity-id $identityResourceId
手动更新密钥版本时,需要更新存储帐户的加密设置以使用新版本。 首先,通过调用 az keyvault show 查询 Key Vault URI,并通过调用 az keyvault key list-versions 查询密钥版本。 然后调用 az storage account update 来更新存储帐户的加密设置,以使用新的密钥版本,如上一示例所示。
更改密钥
你可以在任何时候更改用于 Azure 存储加密的密钥。
注意
更改密钥或密钥版本时,根加密密钥的保护会更改,但是 Azure 存储帐户中的数据将始终保持加密状态。 无需执行其他操作即可确保数据受到保护。 更改密钥或轮换密钥版本不会影响性能。 更改密钥或轮换密钥版本不会造成关联性故障时间。
若要使用 Azure 门户更改密钥,请执行以下步骤:
导航到你的存储帐户,并显示“加密”设置。
选择密钥保管库并选择一个新密钥。
保存更改。
如果新密钥位于其他密钥保管库中,则必须向托管标识授予对新保管库中密钥的访问权限 。 如果选择手动更新密钥版本,则还需要更新密钥保管库 URI 。
撤销对使用客户管理的密钥的存储帐户的访问权限
若要暂时撤销对使用客户管理的密钥的存储帐户的访问权限,请禁用密钥保管库中当前使用的密钥。 禁用和重新启用密钥不会对性能造成影响或导致停机。
在禁用密钥之后,客户端将无法调用在 Blob 或其元数据中进行读取或写入的操作。 有关哪些操作将会失败的信息,请参阅撤销对使用客户管理的密钥的存储帐户的访问权限 。
注意
禁用密钥保管库中的密钥时,Azure 存储帐户中的数据将保持加密状态,但在重新启用密钥之前,这些数据将无法访问。
若要使用 Azure 门户禁用客户管理的密钥,请执行以下步骤:
导航到包含该密钥的密钥保管库。
选择“对象 ”下的“密钥 ”。
右键单击密钥并选择“禁用 ”。
若要使用 PowerShell 撤销客户管理的密钥,请调用 Update-AzKeyVaultKey 命令,如以下示例所示。 请记得将括号中的占位符值替换为自己的值以定义变量,或使用前面示例中定义的变量。
$kvName = "<key-vault-name>"
$keyName = "<key-name>"
$enabled = $false
# $false to disable the key / $true to enable it
# Check the current state of the key (before and after enabling/disabling it)
Get-AzKeyVaultKey -Name $keyName -VaultName $kvName
# Disable (or enable) the key
Update-AzKeyVaultKey -VaultName $kvName -Name $keyName -Enable $enabled
若要使用 Azure CLI 撤销客户管理的密钥,请调用 az keyvault key set-attributes 命令,如以下示例所示。 请记得将括号中的占位符值替换为自己的值以定义变量,或使用前面示例中定义的变量。
kvName="<key-vault-name>"
keyName="<key-name>"
enabled="false"
# "false" to disable the key / "true" to enable it:
# Check the current state of the key (before and after enabling/disabling it)
az keyvault key show \
--vault-name $kvName \
--name $keyName
# Disable (or enable) the key
az keyvault key set-attributes \
--vault-name $kvName \
--name $keyName \
--enabled $enabled
禁用密钥会导致访问存储帐户中数据的尝试失败,错误代码为 403(禁止)。 有关将受禁用密钥影响的存储帐户操作的列表,请参阅撤销对使用客户管理的密钥的存储帐户的访问权限 。
切换回 Microsoft 托管密钥
可以使用 Azure 门户、PowerShell 或 Azure CLI 随时从客户管理的密钥切换回 Microsoft 管理的密钥。
若要在 Azure 门户中从客户管理的密钥切换回 Microsoft 管理的密钥,请执行以下步骤:
导航到存储帐户。
在“安全 + 网络 ”下,选择“加密 ”。
将“加密类型 ”更改为“Microsoft 管理的密钥 ”。
若要使用 PowerShell 从客户管理的密钥切换回 Microsoft 管理的密钥,请使用 -StorageEncryption
选项调用 Set-AzStorageAccount ,如以下示例所示。 请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量。
Set-AzStorageAccount -ResourceGroupName $storageAccount.ResourceGroupName `
-AccountName $storageAccount.StorageAccountName `
-StorageEncryption
若要使用 Azure CLI 从客户管理的密钥切换回 Microsoft 管理的密钥,请调用 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
后续步骤