你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn 。
本文内容
Azure 存储对静态存储帐户中的所有数据进行加密。 默认情况下,数据使用 Microsoft 管理的密钥进行加密。 为了更进一步控制加密密钥,你可以管理自己的密钥。 客户管理的密钥必须存储在 Azure Key Vault 或 Azure Key Vault 托管硬件安全模型 (HSM) 中。
本文介绍如何在创建新存储帐户时使用客户管理的密钥来配置加密。 在跨租户场景中,存储帐户驻留在 ISV 管理的租户中,而用于加密该存储帐户的密钥驻留在客户管理的租户中的密钥保管库中。
若要了解如何为现有存储帐户配置客户管理的密钥,请参阅为现有存储帐户配置跨租户客户管理的密钥 。
注意
Azure Key Vault 和 Azure Key Vault 托管 HSM 支持使用相同的 API 和管理接口来配置客户管理的密钥。 Azure Key Vault 支持的任何操作也受 Azure Key Vault 托管 HSM 支持。
关于跨租户客户管理的密钥
许多在 Azure 上生成软件即服务 (SaaS) 产品/服务的服务提供商都希望为客户提供管理他们自己的加密密钥的方案。 客户管理的密钥允许服务提供商使用加密密钥加密客户的数据,该密钥由服务提供商的客户管理,并且服务提供商无法访问该加密密钥。 在 Azure 中,服务提供商的客户可以使用 Azure Key Vault 管理自己的 Microsoft Entra 租户和订阅中的加密密钥。
由服务提供商所有且驻留在服务提供商租户中的 Azure 平台服务和资源需要访问客户租户中的密钥来执行加密/解密操作。
下图显示了跨服务提供商及其客户的跨租户 CMK 工作流中具有联合标识的静态数据加密。
上面的示例中存在两个 Microsoft Entra 租户:一个独立服务提供商的租户(租户 1 )和一个客户的租户(租户 2 )。 租户 1 托管 Azure 平台服务,租户 2 托管客户的密钥保管库。
多租户应用程序注册由服务提供商在租户 1 中创建 。 联合标识凭据 使用用户分配的托管标识在此应用程序上进行创建。 然后,与客户共享应用的名称和应用程序 ID。
具有适当权限的用户可在客户租户即租户 2 中安装服务提供商的应用程序。 然后,用户向已安装应用程序相关的服务主体授予对客户密钥保管库的访问权限。 客户还会将加密密钥或客户管理的密钥存储在密钥保管库中。 客户与服务提供商共享密钥位置(密钥的 URL)。
服务提供商现在拥有:
客户租户中安装的多租户应用程序的应用程序 ID,该应用程序已获得对客户管理的密钥的访问权限。
配置为多租户应用程序凭据的托管标识。
密钥在客户的密钥保管库中的位置。
通过这三个参数,服务提供商可在租户 1 中预配可使用租户 2 中客户管理的密钥进行加密的 Azure 资源。
让我们将上述端到端解决方案划分为三个阶段:
服务提供商配置标识。
客户允许服务提供商的多租户应用访问 Azure Key Vault 中的加密密钥。
服务提供商使用 CMK 对 Azure 资源中的数据进行加密。
对于大多数服务提供商应用程序来说,阶段 1 中的操作将是一次性设置。 阶段 2 和 3 中的操作将对每个客户重复。
服务提供商的注意事项
不建议使用 Azure 资源管理器 (ARM) 模板创建 Microsoft Entra 应用程序。
同一多租户应用程序可用于访问任意数量租户中的密钥,例如租户 2 、租户 3 、租户 4 等。 在每个租户中,将创建应用程序的独立实例,该实例具有相同的应用程序 ID,但对象 ID 不同。 因此,此应用程序的每个实例都独立获得授权。 请考虑如何使用用于此功能的应用程序对象将所有客户的应用程序分区。
应用程序最多可以有 20 个联合标识凭据,这要求服务提供商在其客户之间共享联合标识。 有关联合标识设计注意事项和限制的详细信息,请参阅配置应用以信任外部标识提供者
在极少数情况下,服务提供商可能会针对各个客户使用单个应用程序对象,但这需要大量维护成本来大规模地管理所有客户的应用程序。
在服务提供商租户中,无法自动执行发布服务器验证 。
阶段 2 - 客户授权访问密钥保管库
服务提供商客户的注意事项
在客户租户即租户 2 中,管理员可以设置策略来阻止非管理员用户安装应用程序。 这些策略可以防止非管理员用户创建服务主体。 如果配置了此类策略,则需要涉及有权创建服务主体的用户。
可以使用 Azure RBAC 或访问策略来授权访问 Azure 密钥保管库。 授予对密钥保管库的访问权限时,请确保使用针对密钥保管库的活动机制。
Microsoft Entra 应用程序注册具有应用程序 ID(客户端 ID)。 在租户中安装应用程序时,将创建服务主体。 服务主体与应用注册共享相同的应用程序 ID,但会生成自己的对象 ID。 授权应用程序访问资源时,可能需要使用服务主体 Name
或 ObjectID
属性。
阶段 3 - 服务提供商使用客户管理的密钥对 Azure 资源中的数据进行加密
在阶段 1 和阶段 2 完成之后,服务提供商可以使用客户租户中的密钥和密钥保管库以及 ISV 租户中的 Azure 资源在 Azure 资源上配置加密。 服务提供商可以使用该 Azure 资源支持的客户端工具、ARM 模板或 REST API 配置跨租户客户管理的密钥。
本部分介绍如何配置跨租户客户管理的密钥 (CMK) 并对客户数据进行加密。 了解如何使用 Tenant2 的密钥保管库中存储的 CMK 加密 Tenant1 的资源中的客户数据。 可以使用 Azure 门户、Azure PowerShell 或 Azure CLI。
登录到 Azure 门户 并执行以下步骤。
以下步骤由服务提供商的租户 Tenant1 中的服务提供商执行。
服务提供商创建新的多租户应用注册
可以创建新的多租户 Microsoft Entra 应用程序注册,也可以从现有多租户应用程序注册开始。 如果从现有应用程序注册开始,请记下应用程序的应用程序 ID(客户端 ID)。
创建新的注册:
在搜索框中搜索“Microsoft Entra ID ”。 找到并选择“Microsoft Entra ID ”扩展。
从左窗格中选择“管理”>“应用注册”。
选择“+ 新建注册”。
提供应用程序注册的名称,并选择“任何组织目录中的帐户(任何 Microsoft Entra 目录 - 多租户) ”。
选择“注册”。
记下应用程序的 ApplicationId/ClientId。
服务提供商创建用户分配的托管标识
创建用户分配的托管标识,以用作联合标识凭据。
在搜索框中搜索“托管标识”。 找到并选择“托管标识”扩展。
选择“+ 新建”。
提供托管标识的资源组、区域和名称。
选择“查看 + 创建”。
成功部署时,请记下“属性”下的用户分配的托管标识的 Azure ResourceId。 例如:
/subscriptions/tttttttt-0000-tttt-0000-tttt0000tttt/resourcegroups/XTCMKDemo/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ConsotoCMKDemoUA
将用户分配的托管标识配置为应用程序上的联合标识凭据,以便它可以模拟应用程序的标识。
导航到“Microsoft Entra ID>”“应用注册>”“应用程序 ”。
选择“证书和机密”。
选择“联合凭据”。
选择“+ 添加凭据”。
在“联合凭据方案”下,选择“客户托管密钥”。
单击“选择托管标识”。 在窗格中,选择订阅。 在“托管标识”下,选择“用户分配的托管标识”。 在“选择”框中,搜索之前创建的托管标识,然后单击窗格底部的“选择”。
在“凭据详细信息”下,提供凭据的名称和可选说明,然后选择“添加”。
若要使用 Azure PowerShell 配置 ISV 的租户,请安装最新的 Az 模块。 有关如何安装 PowerShell 的详细信息,请参阅使用 PowerShellGet 在 Windows 上安装 Azure PowerShell 。
如果选择在本地使用 Azure PowerShell:
如果选择使用 Azure Cloud Shell:
以下步骤由服务提供商的租户 Tenant1 中的服务提供商 (ISV) 执行。
服务提供商登录到 Azure
在 Azure PowerShell 中,登录到 ISV 的租户,并将活动订阅设置为 ISV 的订阅。
$isvTenantId="<isv-tenant-id>"
$isvSubscriptionId="<isv-subscription-id>"
# Sign in to Azure in the ISV's tenant.
Connect-AzAccount -Tenant $isvTenantId
# Set the context to the ISV's subscription.
Set-AzContext -Subscription $isvSubscriptionId
服务提供商创建新的多租户应用注册
在 Tenant1 中选择多租户已注册应用程序的名称,并在 Azure 门户中创建多租户应用程序。
客户使用为多租户应用程序提供的名称来标识 Tenant2 中的应用程序。 请注意应用的对象 ID 和应用程序 ID。 后续步骤中需要使用这些值。
$multiTenantAppName="<multi-tenant-app>"
$multiTenantApp = New-AzADApplication -DisplayName $multiTenantAppName `
-SignInAudience AzureADMultipleOrgs
# Object ID for the new multi-tenant app
$objectId = $multiTenantApp.Id
# Application (client) ID for the multi-tenant app
$multiTenantAppObjectId = $multiTenantApp.AppId
服务提供商创建用户分配的托管标识
登录 ISV 的租户,然后创建用户分配的托管标识以充当联合标识凭据。 若要创建新的用户分配的托管标识,必须分配一个包含 Microsoft.ManagedIdentity/userAssignedIdentities/write 操作的角色。
$isvRgName="<isv-resource-group>"
$isvLocation="<location>"
$userIdentityName="<user-assigned-managed-identity>"
# Create a new resource group in the ISV's subscription.
New-AzResourceGroup -Location $isvLocation -ResourceGroupName $isvRgName
# Create the new user-assigned managed identity.
$userIdentity = New-AzUserAssignedIdentity -Name $userIdentityName `
-ResourceGroupName $isvRgName `
-Location $isvLocation `
-SubscriptionId $isvSubscriptionId
将用户分配的托管标识配置为应用程序上的联合标识凭据,以便它可以模拟应用程序的标识。
若要从 PowerShell 配置联合标识凭据,请先安装 Az.Resources 模块的 6.3.0 版本或更高版本。
New-AzADAppFederatedCredential -ApplicationObjectId $multiTenantApp.Id `
-Name "MyFederatedIdentityCredential" `
-Audience "api://AzureADTokenExchange" `
-Issuer "https://login.microsoftonline.com/<tenant-id>/v2.0" `
-Subject $userIdentity.PrincipalId `
-Description "Federated Identity Credential for CMK"
以下步骤由服务提供商的租户 Tenant1 中的服务提供商执行。
服务提供商登录到 Azure
登录到 Azure 以使用 Azure CLI。
az login
服务提供商创建新的多租户应用注册
在 Tenant1 中选择多租户应用程序的名称,并在 Azure 门户中创建多租户应用程序。
客户使用为多租户应用程序提供的名称来标识 Tenant2 中的应用程序。 请复制应用的应用程序 ID(或客户端 ID)、应用的对象 ID,以及应用的租户 ID。 你将在以下步骤中需要使用这些值。
multiTenantAppName="<multi-tenant-app>"
multiTenantAppObjectId=$(az ad app create --display-name $multiTenantAppName \
--sign-in-audience AzureADMultipleOrgs \
--query id \
--output tsv)
multiTenantAppId=$(az ad app show --id $multiTenantAppObjectId --query appId --output tsv)
服务提供商创建用户分配的托管标识
登录 ISV 的租户,然后创建用户分配的托管标识以充当联合标识凭据。 若要创建新的用户分配的托管标识,必须分配一个包含 Microsoft.ManagedIdentity/userAssignedIdentities/write 操作的角色。
isvSubscriptionId="<isv-subscription-id>"
isvRgName="<isv-resource-group>"
isvLocation="<location>"
userIdentityName="<user-assigned-managed-identity>"
az group create --location $isvLocation \
--resource-group $isvRgName \
--subscription $isvSubscriptionId
principalId=$(az identity create --name $userIdentityName \
--resource-group $isvRgName \
--location $isvLocation \
--subscription $isvSubscriptionId \
--query principalId \
--out tsv)
运行 az ad app federated-credential create 方法,在应用上配置联合标识凭据,并与外部标识提供者建立信任关系。
使用 api://AzureADTokenExchange
作为联合标识凭据中的 audience
值。 有关更多详细信息,请参阅 API 参考 。
# Create a file named "credential.json" with the following content.
# Replace placeholders in angle brackets with your own values.
{
"name": "MyFederatedIdentityCredential",
"issuer": "https://login.microsoftonline.com/<tenantID>/v2.0",
"subject": "<user-assigned-identity-principal-id>",
"description": "Federated Identity Credential for CMK",
"audiences": [
"api://AzureADTokenExchange"
]
}
az ad app federated-credential create --id $multiTenantAppObjectId --parameters credential.json
服务提供商与客户共享应用程序 ID
查找多租户应用程序的的应用程序 ID(客户端 ID),并将其与客户共享。
客户向服务提供商的应用授予对密钥保管库中的密钥的访问权限
以下步骤由客户在客户的租户 Tenant2 中执行。 客户可以使用 Azure 门户、Azure PowerShell 或 Azure CLI。
执行这些步骤的用户必须是具有特权角色(例如应用程序管理员 、云应用程序管理员 或全局管理员 )的管理员。
登录到 Azure 门户 并执行以下步骤。
客户在客户租户中安装服务提供商应用程序
若要在客户的租户中安装服务提供商的已注册应用程序,请从已注册的应用创建具有应用程序 ID 的服务主体。 可以通过以下任一方式创建服务主体:
客户创建密钥保管库
若要创建密钥保管库,必须为用户帐户分配“密钥保管库参与者”角色或其他允许创建密钥保管库的角色。
在 Azure 门户菜单或主页中,选择“+ 创建资源”。 在“搜索”框中输入“密钥保管库”。 从结果列表中选择“密钥保管库”。 在“密钥保管库”页上,选择“创建”。
在“基本信息”选项卡中选择一个订阅。 在“资源组”下选择“新建”,然后输入资源组名称。
为“密钥保管库”输入唯一的名称。
选择区域和定价层。
为新的密钥保管库启用清除保护。
在“访问策略”选项卡上,为“权限模型”选择“Azure 基于角色的访问控制”。
选择“查看 + 创建”,然后选择“创建” 。
记下密钥保管库名称和 URI。访问密钥保管库的应用程序必须使用此 URI。
有关详细信息,请参阅快速入门 - 使用 Azure 门户创建 Azure 密钥保管库 。
客户将“密钥保管库加密管理人员”角色分配给用户帐户
此步骤确保你可以创建加密密钥。
导航到密钥保管库,然后从左窗格中选择“访问控制(IAM)”。
在“授予对此资源的访问权限”下选择“添加角色分配”。
搜索并选择“密钥保管库加密管理人员”。
在“成员”下,选择“用户、组或服务主体”。
选择“成员”并搜索用户帐户。
选择“查看 + 分配”。
客户创建加密密钥
若要创建加密密钥,必须为用户帐户分配“密钥保管库加密管理人员”角色或其他允许创建密钥的角色。
在密钥保管库属性页中,选择“密钥”。
选择“生成/导入”。
在“创建密钥”屏幕上,指定密钥的名称。 让其他值保留默认设置。
选择“创建”。
复制密钥 URI。
客户向服务提供商应用程序授予对密钥保管库的访问权限
将 Azure RBAC 角色“密钥保管库加密服务加密用户”分配给服务提供商的已注册应用程序,以便它可以访问密钥保管库。
导航到密钥保管库,然后从左窗格中选择“访问控制(IAM)”。
在“授予对此资源的访问权限”下选择“添加角色分配”。
搜索并选择“密钥保管库加密服务加密用户”。
在“成员”下,选择“用户、组或服务主体”。
选择“成员”,然后从服务提供商处搜索已安装的应用程序的应用程序名称。
选择“查看 + 分配”。
现在可以使用密钥保管库 URI 和密钥配置客户管理的密钥。
若要使用 Azure PowerShell 配置客户端的租户,请安装最新的 Az 模块。 有关如何安装 PowerShell 的详细信息,请参阅使用 PowerShellGet 在 Windows 上安装 Azure PowerShell 。
如果选择在本地使用 Azure PowerShell:
如果选择使用 Azure Cloud Shell:
客户登录到 Azure
在 Azure PowerShell 中,登录到客户的租户,并将活动订阅设置为客户的订阅。
$customerTenantId="<customer-tenant-id>"
$customerSubscriptionId="<customer-subscription-id>"
# Sign in to Azure in the customer's tenant.
Connect-AzAccount -Tenant $customerTenantId
# Set the context to the customer's subscription.
Set-AzContext -Subscription $customerSubscriptionId
客户在客户租户中安装服务提供商应用程序
收到服务提供商的多租户应用程序的应用程序 ID 后,请通过创建服务主体将该应用程序安装到租户 Tenant2 中。
在计划创建密钥保管库的租户中执行以下命令。
$customerRgName="<customer-resource-group>"
$customerLocation="<location>"
$multiTenantAppId="<multi-tenant-app-id>" # appId value from Tenant1
# Create a resource group in the customer's subscription.
New-AzResourceGroup -Location $customerLocation -ResourceGroupName $customerRgName
# Create the service principal with the registered app's application ID (client ID).
$servicePrincipal = New-AzADServicePrincipal -ApplicationId $multiTenantAppId
客户创建密钥保管库
若要创建密钥保管库,必须为客户的帐户分配“密钥保管库参与者”角色或其他允许创建密钥保管库的角色。
$kvName="<key-vault>"
$kv = New-AzKeyVault -Location $customerLocation `
-Name $kvName `
-ResourceGroupName $customerRgName `
-SubscriptionId $customerSubscriptionId `
-EnablePurgeProtection `
-EnableRbacAuthorization
客户将“密钥保管库加密管理人员”角色分配给用户帐户
将“密钥保管库加密管理人员”角色分配给用户帐户。 此步骤确保用户可以创建密钥保管库和加密密钥。 以下示例将角色分配给当前登录用户。
$currentUserObjectId = (Get-AzADUser -SignedIn).Id
New-AzRoleAssignment -RoleDefinitionName "Key Vault Crypto Officer" `
-Scope $kv.ResourceId `
-ObjectId $currentUserObjectId
客户创建加密密钥
若要创建加密密钥,必须为用户帐户分配“密钥保管库加密管理人员”角色或其他允许创建密钥的角色。
$keyName="<key-name>"
Add-AzKeyVaultKey -Name $keyName `
-VaultName $kvName `
-Destination software
客户向服务提供商应用程序授予对密钥保管库的访问权限
通过之前创建的服务主体将 Azure RBAC 角色“密钥保管库加密服务加密用户”分配给服务提供商的已注册应用程序,以便它可以访问密钥保管库。
New-AzRoleAssignment -RoleDefinitionName "Key Vault Crypto Service Encryption User" `
-Scope $kv.ResourceId `
-ObjectId $servicePrincipal.Id
现在可以使用密钥保管库 URI 和密钥配置客户管理的密钥。
客户登录到 Azure
登录到 Azure 以使用 Azure CLI。
az login
客户在客户租户中安装服务提供商应用程序
收到服务提供商的多租户应用程序的应用程序 ID 后,请使用以下命令将该应用程序安装到租户 Tenant2 中。 安装应用程序会在租户中创建服务主体。
在计划创建密钥保管库的租户中执行以下命令。
# Create the service principal with the registered app's application ID (client ID)
multiTenantAppId="<multi-tenant-app-id>"
az ad sp create --id $multiTenantAppId --query id --out tsv
客户创建密钥保管库
若要创建密钥保管库,必须为客户的帐户分配“密钥保管库参与者”角色或其他允许创建密钥保管库的角色。
customerSubscriptionId="<customer-subscription-id>"
customerRgName="<customer-resource-group>"
customerLocation="<location>"
kvName="<key-vault>"
az group create --location $customerLocation \
--name $customerRgName
az keyvault create --name $kvName \
--location $customerLocation \
--resource-group $customerRgName \
--subscription $customerSubscriptionId \
--enable-purge-protection true \
--enable-rbac-authorization true
客户将“密钥保管库加密管理人员”角色分配给用户帐户
此步骤确保你可以创建密钥保管库和加密密钥。
currentUserObjectId=$(az ad signed-in-user show --query id --output tsv)
kvResourceId=$(az keyvault show --resource-group $customerRgName \
--name $kvName \
--query id \
--output tsv)
az role assignment create --role "Key Vault Crypto Officer" \
--scope $kvResourceId \
--assignee-object-id $currentUserObjectId
客户创建加密密钥
若要创建加密密钥,必须为用户帐户分配“密钥保管库加密管理人员”角色或其他允许创建密钥的角色。
keyName="<key-name>"
az keyvault key create --name $keyName --vault-name $kvName
客户向服务提供商应用程序授予对密钥保管库的访问权限
通过之前创建的服务主体将 Azure RBAC 角色“密钥保管库加密服务加密用户”分配给服务提供商的已注册应用程序,以便已注册应用程序可以访问密钥保管库。
servicePrincipalId=$(az ad sp show --id $multiTenantAppId --query id --output tsv)
az role assignment create --role "Key Vault Crypto Service Encryption User" \
--scope $kvResourceId \
--assignee-object-id $servicePrincipalId
现在可以使用密钥保管库 URI 和密钥配置客户管理的密钥。
创建使用不同租户中的密钥加密的新存储帐户
到目前为止,你已在 ISV 的租户上配置了多租户应用程序,在客户的租户上安装了应用程序,并在客户的租户上配置了密钥保管库和密钥。 接下来,可以在 ISV 的租户上创建一个新的存储帐户,并使用客户租户中的密钥配置客户管理的密钥。
如果在创建存储帐户时配置客户管理的密钥,必须使用现有用户分配的托管标识来授权访问密钥保管库。 用户分配的托管标识必须具有访问密钥保管库的相应权限。 有关详细信息,请参阅向 Azure Key Vault 进行身份验证 。
使用客户管理的密钥为现有存储帐户配置加密时,只要关联的密钥保管库中有新版本可用,就可以选择自动更新用于 Azure 存储加密的密钥版本。 为此,请省略密钥 URI 中的密钥版本。 也可显式指定在手动更新密钥版本之前用于加密的密钥版本。 在密钥 URI 上包含密钥版本将配置客户管理的密钥,以便手动更新密钥版本。
重要
若要轮换密钥,请在 Azure Key Vault 中创建密钥的新版本。 Azure 存储不处理密钥轮换,因此需要管理密钥保管库中的密钥轮换。 可以在 Azure Key Vault 中配置密钥自动轮换 ,也可以手动轮换密钥。
Azure 存储每天只会在密钥保管库中检查一次是否存在密钥的新版本。 在 Azure Key Vault 中轮换密钥时,请务必等待 24 小时,然后再禁用旧版本。
若要在 Azure 门户中为新存储帐户配置跨租户客户管理的密钥,请执行以下步骤:
在 Azure 门户中,导航到 ISV 租户的“存储帐户”页,然后选择“创建”按钮以创建新帐户。
按照创建存储帐户 中概述的步骤填写“基本信息”、“高级”、“网络”和“数据保护”选项卡上的字段。
在“加密”选项卡上的“启用对客户管理的密钥的支持”字段中,指示要为哪些服务启用对客户管理的密钥的支持。
在“加密类型”字段中,选择“客户管理的密钥(CMK)”。
在“加密密钥”字段中,选择“从密钥保管库输入密钥”,然后指定密钥 URI。 如果希望 Azure 存储自动检查是否存在新的密钥版本并更新,请省略 URI 中的密钥版本。
对于“用户分配的标识”字段,搜索之前在 ISV 租户中创建的用户分配的托管标识。
展开“高级”部分,然后选择之前在 ISV 租户中创建的多租户注册的应用程序。
选择“查看”按钮以验证并创建帐户。
若要在 PowerShell 中为新存储帐户配置跨租户客户管理的密钥,请先安装 5.1.0 版本或更高版本的 Az.Storage PowerShell 模块 。 此模块随 AZ PowerShell 模块 版本 9.1.0 或更高版本一起安装。
接下来,调用 New-AzStorageAccount ,为以前在 ISV 的订阅中配置的用户分配的托管标识提供资源 ID,为之前在 ISV 订阅中配置的多租户应用程序提供应用程序(客户端)ID。 提供客户密钥保管库中的密钥保管库 URI 和密钥名称。
请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量。
$accountName = "<account-name>"
$kvUri = "<key-vault-uri>"
$keyName = "<keyName>"
$location = "<location>"
$multiTenantAppId = "<application-id>" # appId value from multi-tenant app
$userIdentity = Get-AzUserAssignedIdentity -Name <user-assigned-identity> -ResourceGroupName $rgName
New-AzStorageAccount -ResourceGroupName $rgName `
-Name $accountName `
-Kind StorageV2 `
-SkuName Standard_LRS `
-Location $location `
-AllowBlobPublicAccess $false `
-UserAssignedIdentityId $userIdentity.Id `
-IdentityType SystemAssignedUserAssigned `
-KeyName $keyName `
-KeyVaultUri $kvUri `
-KeyVaultUserAssignedIdentityId $userIdentity.Id `
-KeyVaultFederatedClientId $multiTenantAppId
若要使用 Azure CLI 为新存储帐户配置跨租户客户管理的密钥,请先安装 Azure CLI 版本 2.42.0 或更高版本。 有关安装 Azure CLI 的详细信息,请参阅如何安装 Azure CLI 。
接下来,调用 az 存储帐户创建 ,为以前在 ISV 的订阅中配置的用户分配的托管标识提供资源 ID,为之前在 ISV 订阅中配置的多租户应用程序提供应用程序(客户端)ID。 提供客户密钥保管库中的密钥保管库 URI 和密钥名称。
请记得将括号中的占位符值替换为自己的值,并使用前面示例中定义的变量。
accountName="<storage-account>"
kvUri="<key-vault-uri>"
keyName="<key-name>"
multiTenantAppId="<multi-tenant-app-id>" # appId value from multi-tenant app
# Get the resource ID for the user-assigned managed identity.
identityResourceId=$(az identity show --name $managedIdentity \
--resource-group $isvRgName \
--query id \
--output tsv)
az storage account create \
--name $accountName \
--resource-group $isvRgName \
--location $isvLocation \
--sku Standard_LRS \
--kind StorageV2 \
--allow-blob-public-access false \
--identity-type SystemAssigned,UserAssigned \
--user-identity-id $identityResourceId \
--encryption-key-vault $kvUri \
--encryption-key-name $keyName \
--encryption-key-source Microsoft.Keyvault \
--key-vault-user-identity-id $identityResourceId \
--key-vault-federated-client-id $multiTenantAppId
在创建新的存储帐户时,还可以通过手动更新密钥版本配置客户管理的密钥。 为此,请在指定密钥 URI 时包含密钥版本。
更改密钥
你可以在任何时候更改用于 Azure 存储加密的密钥。
注意
更改密钥或密钥版本时,根加密密钥的保护会更改,但是 Azure 存储帐户中的数据将始终保持加密状态。 无需执行其他操作即可确保数据受到保护。 更改密钥或轮换密钥版本不会影响性能。 更改密钥或轮换密钥版本不会造成关联性故障时间。
若要使用 Azure 门户更改密钥,请执行以下步骤:
导航到你的存储帐户,并显示“加密”设置。
选择密钥保管库并选择一个新密钥。
保存更改。
撤销对使用客户管理的密钥的存储帐户的访问权限
若要暂时撤销对使用客户管理的密钥的存储帐户的访问权限,请禁用密钥保管库中当前使用的密钥。 禁用和重新启用密钥不会对性能造成影响或导致停机。
在禁用密钥之后,客户端将无法调用在 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
切换回 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
另请参阅