使用 Key Vault 和 Azure CLI(旧版)管理存储帐户密钥

重要

Key Vault 托管存储帐户密钥(旧版)按原样受支持,未再计划更新。 只有不高于 2018-03-28 的 SAS 定义已签名的存储服务版本才支持帐户 SAS。

重要

Azure CLI 中对托管存储帐户密钥的支持已在版本 2.54 中删除,必须对本教程中的命令使用 Azure CLI 2.53.1 或更低版本。

重要

我们建议使用 Azure 存储与 Microsoft Entra ID 的集成,这是 Azure 推出的基于云的标识和访问管理服务。 Microsoft Entra 集成适用于 Azure Blob、队列和表,提供对 Azure 存储的基于 OAuth2 令牌的访问(类似于 Azure Key Vault)。 Microsoft Entra ID 允许使用应用程序标识或用户标识(而不是存储帐户凭据)对客户端应用程序进行身份验证。 在 Azure 上运行时,可以使用 Microsoft Entra 托管标识。 托管标识消除了客户端身份验证的需要,并可以在应用程序中存储凭据,或者将凭据与应用程序一同存储。 仅在无法实现 Microsoft Entra 身份验证的情况下使用以下解决方法。

Azure 存储帐户使用由帐户名和密钥构成的凭据。 密钥是自动生成的,充当密码而不是加密密钥。 Key Vault 通过在存储帐户中定期重新生成存储帐户密钥来管理存储帐户密钥,并提供共享访问签名令牌,以便对存储帐户中的资源进行委托访问。

可以使用 Key Vault 托管的存储帐户密钥功能列出(同步) Azure 存储帐户中的密钥,并定期重新生成(轮换)密钥。 可以管理存储帐户和经典存储帐户的密钥。

使用托管的存储帐户密钥功能时,请注意以下要点:

  • 响应调用方时永远不会返回密钥值。
  • 只有 Key Vault 能够管理存储帐户密钥。 不要自行管理密钥,并避免干扰 Key Vault 进程。
  • 只有单个 Key Vault 对象能够管理存储帐户密钥。 不要允许从多个对象进行密钥管理。
  • 只使用 Key Vault 重新生成密钥。 不要手动重新生成存储帐户密钥。

重要

直接在存储帐户中重新生成密钥会中断托管存储帐户设置,并且会使正在使用的 SAS 令牌失效并造成中断。

服务主体应用程序 ID

Microsoft Entra 租户为每个已注册的应用程序提供服务主体。 此服务主体充当应用程序 ID,该 ID 在授权设置过程中用于通过 Azure 基于角色的访问控制 (Azure RBAC) 访问其他 Azure 资源。

Key Vault 是已在所有 Microsoft Entra 租户中预先注册了的 Azure 应用程序。 Key Vault 注册到每个 Azure 云中的同一个应用程序 ID 下。

租户 应用程序 ID
Microsoft Entra ID 由世纪互联运营的 Microsoft Azure 7e7c393b-45d0-48b1-a35e-2905ddf8183c
Microsoft Entra ID Azure 公共 cfa8b339-82a2-471a-a3c9-0fc0be7a4093
其他 任意 cfa8b339-82a2-471a-a3c9-0fc0be7a4093

先决条件

若要完成本指南,必须先执行以下步骤:

管理存储帐户密钥

连接到 Azure 帐户

使用 az login 命令对 Azure CLI 会话进行身份验证。

az cloud set -n AzureChinaCloud
az login
# az cloud set -n AzureCloud   //means return to Public Azure.

向 Key Vault 授予对你的存储帐户的访问权限

使用 Azure CLI az role assignment create 命令授予 Key Vault 访问你的存储帐户的权限。 为该命令提供以下参数值:

  • --role:传递“存储帐户密钥操作员服务角色”Azure 角色。 此角色将访问范围限制为你的存储帐户。 对于经典存储帐户,请改为传递“经典存储帐户密钥操作员服务角色”。
  • --assignee:传递值“https://vault.azure.cn"”,它是 Azure 公有云中 Key Vault 的 url。 (对于由世纪互联运营的 Azure 云,请改用“--assignee-object-id”,具体请参阅服务主体应用程序 ID。)
  • --scope:传递格式为 /subscriptions/<subscriptionID>/resourceGroups/<StorageAccountResourceGroupName>/providers/Microsoft.Storage/storageAccounts/<YourStorageAccountName> 的存储帐户资源 ID。 使用 Azure CLI 的 az account list 命令查找订阅 ID。 使用 Azure CLI 的 az storage account list 命令查找存储帐户名称和存储帐户资源组。
az role assignment create --role "Storage Account Key Operator Service Role" --assignee "https://vault.azure.cn" --scope "/subscriptions/<subscriptionID>/resourceGroups/<StorageAccountResourceGroupName>/providers/Microsoft.Storage/storageAccounts/<YourStorageAccountName>"

向托管存储帐户授予用户帐户权限

使用 Azure CLI az keyvault-set-policy cmdlet 更新 Key Vault 访问策略,并向用户帐户授予存储帐户权限。

# Give your user principal access to all storage account permissions, on your Key Vault instance

az keyvault set-policy --name <YourKeyVaultName> --upn user@domain.com --storage-permissions get list delete set update regeneratekey getsas listsas deletesas setsas recover backup restore purge

Azure 门户中存储帐户的“访问策略”页不会显示存储帐户的权限。

创建 Key Vault 托管存储帐户

使用 Azure CLI az keyvault storage 命令创建 Key Vault 托管的存储帐户。 将重新生成周期设置为 30 天。 当需要轮换时,密钥保管库将重新生成非活动状态的密钥,然后将新创建的密钥设置为活动密钥。 在任何时间都只有一个密钥,即活动密钥,用于颁发 SAS 令牌。 为该命令提供以下参数值:

  • --vault-name:传递 Key Vault 的名称。 若要查找 Key Vault 的名称,请使用 Azure CLI az keyvault list 命令。
  • -n:传递你的存储帐户的名称。 若要查找存储帐户的名称,请使用 Azure CLI az storage account list 命令。
  • --resource-id:传递格式为 /subscriptions/<subscriptionID>/resourceGroups/<StorageAccountResourceGroupName>/providers/Microsoft.Storage/storageAccounts/<YourStorageAccountName> 的存储帐户资源 ID。 使用 Azure CLI 的 az account list 命令查找订阅 ID。 使用 Azure CLI 的 az storage account list 命令查找存储帐户名称和存储帐户资源组。
az keyvault storage add --vault-name <YourKeyVaultName> -n <YourStorageAccountName> --active-key-name key1 --auto-regenerate-key --regeneration-period P30D --resource-id "/subscriptions/<subscriptionID>/resourceGroups/<StorageAccountResourceGroupName>/providers/Microsoft.Storage/storageAccounts/<YourStorageAccountName>"

共享访问签名令牌

也可以要求 Key Vault 生成共享访问签名令牌。 共享访问签名对存储帐户中的资源提供委托访问。 可以授予客户端访问存储帐户中的资源的权限,而无需共享帐户密钥。 使用共享访问签名可以安全共享存储资源,而不会透露帐户密钥。

本部分所述的命令将完成以下操作:

  • 设置帐户共享访问签名定义 <YourSASDefinitionName>。 该定义是在 Key Vault <YourKeyVaultName> 中的 Key Vault 托管存储帐户 <YourStorageAccountName> 上设置的。
  • 在保管库中设置 Key Vault 托管的存储共享访问签名定义。 该定义包含创建的共享访问签名令牌的模板 URI。 该定义使用共享访问签名类型 account,有效期为 N 天。
  • 验证共享访问签名是否已作为机密保存在 Key Vault 中。

定义共享访问签名定义模板

Key Vault 使用 SAS 定义模板为客户端应用程序生成令牌。

SAS 定义模板示例:

"sv=2018-03-28&ss=bfqt&srt=sco&sp=rw&spr=https"

SAS 定义模板将在下一步骤中传递给 --template-uri 参数。

Key Vault 的 SAS 定义模板中所需的帐户 SAS 参数

SAS 查询参数 说明
SignedVersion (sv) 必需。 指定用于为使用此帐户 SAS 发出的请求授权的已签名存储服务版本。 必须设置为版本 2015-04-05 或更高版本。 Key Vault 支持不高于 2018-03-28 的版本
SignedServices (ss) 必需。 指定可使用帐户 SAS 访问的已签名服务。 可能的值包括:

- Blob (b)
- 队列 (q)
- 表 (t)
- 文件 (f)

可以将值组合在一起,以提供对多个服务的访问权限。 例如,ss=bf 指定对 Blob 和文件终结点的访问权限。
SignedResourceTypes (srt) 必需。 指定可使用帐户 SAS 访问的已签名资源类型。

- 服务 (s):对服务级 API(例如,获取/设置服务属性、获取服务统计信息、列出容器/队列/表/共享)的访问权限
- 容器 (c):对容器级 API(例如,创建/删除容器、创建/删除队列、创建/删除表、创建/删除共享、列出 Blob/文件和目录)的访问权限
- 对象 (o):对 Blob、队列消息、表实体和文件的对象级 API(例如,放置 Blob、查询实体、获取消息、创建文件等)的访问权限

可以将值组合在一起,以提供对多个资源类型的访问权限。 例如,srt=sc 指定对服务和容器资源的访问权限。
SignedPermission (sp) 必需。 指定帐户 SAS 的已签名权限。 仅当权限与指定的已签名资源类型匹配时,权限才有效;否则会忽略它们。

- 读取 (r):对所有已签名的资源类型(服务、容器和对象)有效。 允许对指定的资源类型的读取权限。
- 写入 (w):对所有已签名的资源类型(服务、容器和对象)有效。 允许对指定的资源类型的写入权限。
- 删除 (d):对容器和对象资源类型有效,但队列消息除外。
- 永久删除 (y):仅对 Blob 的对象资源类型有效。
- 列出 (l):仅对服务和容器资源类型有效。
- 添加 (a):仅对以下对象资源类型有效:队列消息、表实体和追加 Blob。
- 创建 (c):仅对以下对象资源类型有效:Blob 和文件。 用户可以创建新的 Blob 或文件,但不能覆盖现有的 Blob 或文件。
- 更新 (u):仅对以下对象资源类型有效:队列消息和表实体。
- 处理 (p):仅对以下对象资源类型有效:队列消息。
- 标记 (t):仅对以下对象资源类型有效:Blob。 允许 Blob 标记操作。
- 筛选 (f):仅对以下对象资源类型有效:Blob。 允许按 Blob 标记进行筛选。
- 设置不可变性策略 (i):仅对以下对象资源类型有效:Blob。 允许对 Blob 设置/删除不可变性策略和法定保留。
SignedProtocol (spr) 可选。 指定允许用于使用帐户 SAS 发出的请求的协议。 可能的值为“HTTPS 和 HTTP”(https,http) 或“仅 HTTPS”(https)。 默认值是 https,http

“仅限 HTTP”是不允许的值。

有关帐户 SAS 的详细信息,请参阅:创建帐户 SAS

注意

Key Vault 会忽略“已签名到期时间”、“已签名开始时间”等生命周期参数以及在 2018-03-28 版本之后引入的参数

在 Key Vault 中设置共享访问签名定义

使用 Azure CLI 的 az keyvault storage sas-definition create 命令,将上一步骤的 SAS 定义模板传递给 --template-uri 参数,以创建共享访问签名定义。 可将所选的名称提供给 -n 参数。

az keyvault storage sas-definition create --vault-name <YourKeyVaultName> --account-name <YourStorageAccountName> -n <YourSASDefinitionName> --validity-period P2D --sas-type account --template-uri <sasDefinitionTemplate>

验证共享访问签名定义

可以使用 Azure CLI az keyvault storage sas-definition show 命令验证共享访问签名定义是否已存储在密钥保管库中。

现可使用 az keyvault storage sas-definition show 命令和 id 属性来查看该机密的内容。

az keyvault storage sas-definition show --id https://<YourKeyVaultName>.vault.azure.cn/storage/<YourStorageAccountName>/sas/<YourSASDefinitionName>

后续步骤