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

创建和管理加密范围

通过加密范围,可在单个 blob 或容器级别管理加密。 可以使用加密范围在驻留在同一存储帐户中但属于不同客户的数据之间创建安全边界。 有关加密范围的详细信息,请参阅 Blob 存储的加密范围

本文介绍如何创建加密范围。 本文还介绍如何在创建 blob 或容器时指定加密范围。

创建加密范围

可以创建受 Microsoft 管理的密钥或客户管理的密钥保护的加密范围,这些密钥存储在 Azure 密钥保管库或 Azure 密钥保管库托管硬件安全模型 (HSM) 中。 若要使用客户管理的密钥创建加密范围,必须先创建密钥保管库或托管 HSM,并添加要用于此范围的密钥。 密钥保管库或托管 HSM 必须启用清除保护。

存储帐户和密钥保管库可以位于同一租户中,也可以位于不同的租户中。 在这两种情况下,存储帐户和密钥保管库可以位于不同的区域中。

创建加密范围时会自动启用它。 创建加密范围后,可以在创建 blob 时指定它。 还可以在创建容器时指定默认的加密范围,它将自动应用于容器中的所有 blob。

配置加密范围时,需要支付至少一个月(30 天)的费用。 第一个月之后,加密范围每小时按比例计费。 有关详细信息,请参阅加密范围的计费

要使用 PowerShell 创建加密范围,请安装 Az.Storage PowerShell 模块 3.4.0 或更高版本。

创建受 Microsoft 托管密钥保护的加密范围

若要创建受 Microsoft 托管密钥保护的加密范围,请使用 -StorageEncryption 参数调用 New-AzStorageEncryptionScope 命令

如果为存储帐户启用了基础结构加密,则会自动为新的加密范围启用基础结构加密。 除此之外,你可以选择是否为加密范围启用基础结构加密。 要在启用基础结构加密的情况下创建新的范围,请包含 -RequireInfrastructureEncryption 参数。

请务必将示例中的占位符值替换为你自己的值:

$rgName = "<resource-group>"
$accountName = "<storage-account>"
$scopeName = "<encryption-scope>"

New-AzStorageEncryptionScope -ResourceGroupName $rgName `
    -StorageAccountName $accountName `
    -EncryptionScopeName $scopeName1 `
    -StorageEncryption

在同一租户中创建由客户管理的密钥保护的加密范围

若要创建受密钥保管库或托管 HSM(位于存储帐户所在的租户中)中存储的客户管理的密钥保护的加密范围,请首先为存储帐户配置客户管理的密钥。 必须将托管标识分配给具有密钥保管库访问权限的存储帐户。 托管标识可以是用户分配的托管标识,也可以是系统分配的托管标识。 若要详细了解如何配置客户管理的密钥,请参阅为现有存储帐户在同一租户中配置客户管理的密钥

若要授予托管标识权限以访问密钥保管库,请为“密钥保管库加密服务加密用户”角色分配给托管标识

若要配置与加密范围一起使用的客户管理的密钥,必须在密钥保管库或托管 HSM 上启用清除保护。

下面的示例演示如何使用系统分配的托管标识配置加密范围。 请务必将示例中的占位符值替换为你自己的值:

$rgName = "<resource-group>"
$accountName = "<storage-account>"
$keyVaultName = "<key-vault>"
$scopeName = "<encryption-scope>"

# Assign a system-assigned managed identity to the storage account.
$storageAccount = Set-AzStorageAccount -ResourceGroupName $rgName `
    -Name $accountName `
    -AssignIdentity

# Assign the necessary permissions to the managed identity 
# so that it can access the key vault.
$principalId = $storageAccount.Identity.PrincipalId
$keyVault = Get-AzKeyVault $keyVaultName

New-AzRoleAssignment -ObjectId $storageAccount.Identity.PrincipalId `
    -RoleDefinitionName "Key Vault Crypto Service Encryption User" `
    -Scope $keyVault.ResourceId

接下来,使用 -KeyvaultEncryption 参数调用 New-AzStorageEncryptionScope 命令,并指定密钥 URI。 在密钥 URI 上包括密钥版本是可选的。 如果省略密钥版本,则加密范围将自动使用最新的密钥版本。 如果包括密钥版本,则必须手动更新密钥版本才能使用其他版本。

密钥 URI 的格式类似于以下示例,可以从密钥保管库的 VaultUri 属性和密钥名称构造:

# Without the key version
https://<key-vault>.vault.azure.net/keys/<key>

# With the key version
https://<key-vault>.vault.azure.net/keys/<key>/<version>

如果为存储帐户启用了基础结构加密,则会自动为新的加密范围启用基础结构加密。 除此之外,你可以选择是否为加密范围启用基础结构加密。 要在启用基础结构加密的情况下创建新的范围,请包含 -RequireInfrastructureEncryption 参数。

请务必将示例中的占位符值替换为你自己的值:

$keyUri = $keyVault.VaultUri + "keys/" + $keyName

New-AzStorageEncryptionScope -ResourceGroupName $rgName `
    -StorageAccountName $accountName `
    -EncryptionScopeName $scopeName `
    -KeyUri $keyUri `
    -KeyvaultEncryption

在不同租户中创建由客户管理的密钥保护的加密范围

若要创建受密钥保管库或托管 HSM(在存储帐户以外的租户中)中存储的客户管理的密钥保护的加密范围,请首先为存储帐户配置客户管理的密钥。 必须为有权访问其他租户中的密钥保管库的存储帐户配置用户分配的托管标识。 若要详细了解如何配置客户管理的跨租户密钥,请参阅为现有存储帐户配置客户管理的跨租户密钥

若要配置与加密范围一起使用的客户管理的密钥,必须在密钥保管库或托管 HSM 上启用清除保护。

为存储帐户配置客户管理的跨租户密钥后,可以在一个租户中的存储帐户上创建一个加密范围,该租户的范围限定为另一租户中密钥保管库中的密钥。 需要密钥 URI 来创建跨租户加密范围。

请务必将示例中的占位符值替换为你自己的值:

$rgName = "<resource-group>"
$accountName = "<storage-account>"
$scopeName = "<encryption-scope>"

# Construct the key URI from the key vault URI and key name.
$keyUri = $kvUri + "keys/" + $keyName

New-AzStorageEncryptionScope -ResourceGroupName $rgName `
    -StorageAccountName $accountName `
    -EncryptionScopeName $scopeName `
    -KeyUri $keyUri `
    -KeyvaultEncryption

列出存储帐户的加密范围

若要使用 PowerShell 列出存储帐户可用的加密范围,请调用 Get-AzStorageEncryptionScope 命令。 请务必将示例中的占位符值替换为你自己的值:

Get-AzStorageEncryptionScope -ResourceGroupName $rgName `
    -StorageAccountName $accountName

若要按存储帐户列出资源组中的所有加密范围,请使用管道语法:

Get-AzStorageAccount -ResourceGroupName $rgName | Get-AzStorageEncryptionScope

创建具有默认加密范围的容器

创建容器时,可以指定默认的加密范围。 默认情况下,该容器中的 blob 将使用该范围。

除非容器配置为要求所有 blob 使用其默认范围,否则可以使用其自己的加密范围创建单个 blob。 有关详细信息,请参阅容器和 blob 的加密范围

要使用 PowerShell 创建具有默认加密范围的容器,请调用 New-AzStorageContainer 命令,并指定 -DefaultEncryptionScope 参数的范围。 若要强制容器中的所有 blob 使用容器的默认范围,请将 -PreventEncryptionScopeOverride 参数设置为 true

$containerName1 = "container1"
$ctx = New-AzStorageContext -StorageAccountName $accountName -UseConnectedAccount

# Create a container with a default encryption scope that cannot be overridden.
New-AzStorageContainer -Name $containerName1 `
    -Context $ctx `
    -DefaultEncryptionScope $scopeName1 `
    -PreventEncryptionScopeOverride $true

如果客户端在将 blob 上传到具有默认加密范围的容器时尝试指定范围,并且容器配置为阻止 blob 重写默认范围,则操作将失败,并显示一条消息,指示容器加密策略禁止该请求。

上传具有加密范围的 blob

上传 blob 时,可以指定该 blob 的加密范围,或者使用容器的默认加密范围(如果已指定)。

备注

上传使用加密范围的新 Blob 时,无法更改该 Blob 的默认访问层。 也不能更改使用加密范围的现有 Blob 的访问层。 有关访问层的详细信息,请参阅 Blob 数据的热访问层、冷访问层和存档访问层

若要通过 PowerShell 上传具有加密范围的 blob,请调用 Set-AzStorageBlobContent 命令并提供该 blob 的加密范围。

$containerName2 = "container2"
$localSrcFile = "C:\temp\helloworld.txt"
$ctx = New-AzStorageContext -StorageAccountName $accountName -UseConnectedAccount

# Create a container with no default scope defined.
New-AzStorageContainer -Name $containerName2 -Context $ctx

# Upload a block upload with an encryption scope specified.
Set-AzStorageBlobContent -Context $ctx `
    -Container $containerName2 `
    -File $localSrcFile `
    -Blob "helloworld.txt" `
    -BlobType Block `
    -EncryptionScope $scopeName2

更改范围的加密密钥

若要将保护加密范围的密钥从 Microsoft 管理的密钥更改为客户管理的密钥,请首先确保已使用 Azure Key Vault 或 Key Vault HSM 为存储帐户启用了客户管理的密钥。 有关详细信息,请参阅使用 Azure Key Vault 中存储的客户管理的密钥配置加密使用 Azure Key Vault 中存储的客户管理的密钥配置加密

若要使用 PowerShell 将保护加密范围的密钥从客户管理的密钥更改为 Microsoft 托管密钥,请调用 Update-AzStorageEncryptionScope 命令并传入 -StorageEncryption 参数:

Update-AzStorageEncryptionScope -ResourceGroupName $rgName `
    -StorageAccountName $accountName `
    -EncryptionScopeName $scopeName2 `
    -StorageEncryption

接下来,调用 Update-AzStorageEncryptionScope 命令并传入 -KeyUri-KeyvaultEncryption 参数:

Update-AzStorageEncryptionScope -ResourceGroupName $rgName `
    -StorageAccountName $accountName `
    -EncryptionScopeName $scopeName1 `
    -KeyUri $keyUri `
    -KeyvaultEncryption

禁用加密范围

禁用不需要的任何加密范围以避免不必要的费用。 有关详细信息,请参阅加密范围的计费

若要使用 PowerShell 禁用加密范围,请调用 Update-AzStorageEncryptionScope 命令,并包括值为 disabled-State 参数,如以下示例中所示。 若要重新启用加密范围,请调用相同的命令,并将 -State 参数设置为 enabled。 请务必将示例中的占位符值替换为你自己的值:

Update-AzStorageEncryptionScope -ResourceGroupName $rgName `
    -StorageAccountName $accountName `
    -EncryptionScopeName $scopeName1 `
    -State disabled

后续步骤