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

重要

Key Vault 受管存储帐户密钥(旧版)将按现状支持,并且不计划进行更多更新。 只有帐户 SAS 支持的 SAS 定义,且储存服务版本不得晚于 2018-03-28。

重要

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

重要

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

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

可以使用密钥保管库管理的存储帐户密钥功能来列出(同步)与Azure存储帐户的密钥,并定期重新生成(轮换)这些密钥。 您可以管理存储帐户和经典存储帐户的密钥。

使用托管存储帐户密钥功能时,请考虑以下几点:

  • 响应调用方时永远不会返回密钥值。
  • 只有 Key Vault 应负责管理您的存储帐户密钥。 不要自行管理密钥,避免干扰Key Vault进程。
  • 只有一个 Key Vault 对象应该管理存储帐户密钥。 不要允许从多个对象进行密钥管理。
  • 仅使用Key Vault重新生成密钥。 请勿手动重新生成存储帐户密钥。

重要

直接在存储帐户中重新生成密钥会破坏托管存储帐户的设置,可能导致正在使用的 SAS 令牌失效并引起服务中断。

服务主体应用程序 ID

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

Key Vault 是一个已在所有 Microsoft Entra 租户中预注册的 Microsoft 应用程序。 Key Vault在各个 "Azure" 云中以相同的应用程序 ID 注册。

租户 应用程序 ID
Microsoft Entra ID Azure公共 cfa8b339-82a2-471a-a3c9-0fc0be7a4093
其他 任意 cfa8b339-82a2-471a-a3c9-0fc0be7a4093

先决条件

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

管理存储账户密钥

连接到 Azure 帐户

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

az login

为您的存储帐户授予 Key Vault 访问权限

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

  • --role:授予“存储帐户密钥操作员服务角色”Azure角色。 此角色会将访问范围限制为存储帐户。 对于经典存储帐户,请改为传递“经典存储帐户密钥操作服务角色”。
  • --assignee:传递值“https://vault.azure.cn"”,这是世纪互联运营的 Azure 中的 Key Vault URL。
  • --scope:传递你的存储帐户资源 ID,格式为 /subscriptions/<subscriptionID>/resourceGroups/<StorageAccountResourceGroupName>/providers/Microsoft.Storage/storageAccounts/<YourStorageAccountName>。 使用 Azure CLI az 帐户列表命令查找订阅 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 role assignment create 命令将 Key Vault Secrets Officer 角色分配给您的用户帐户,授予存储帐户权限。

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

az role assignment create --role "Key Vault Secrets Officer" --assignee user@domain.com --scope /subscriptions/{subscriptionID}/resourceGroups/{resource-group}/providers/Microsoft.KeyVault/vaults/<YourKeyVaultName>

Azure portal 中存储帐户的“访问策略”页面上不可用存储帐户的权限。

创建Key Vault托管存储帐户

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

  • --vault-name:输入密钥保管库的名称。 若要查找key vault的名称,请使用 Azure CLI az keyvault list 命令。
  • -n:传递存储帐户的名称。 若要查找存储账户的名称,请使用 Azure CLI az storage account list 命令。
  • --resource-id:传递您的存储帐户资源 ID,其格式为 /subscriptions/<subscriptionID>/resourceGroups/<StorageAccountResourceGroupName>/providers/Microsoft.Storage/storageAccounts/<YourStorageAccountName>。 使用 Azure CLI az 帐户列表命令查找订阅 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>设置帐户共享访问签名定义。 在您的密钥保管库<YourKeyVaultName>中的 Key Vault 托管存储帐户<YourStorageAccountName>上设置了定义。
  • 在保管库中设置 Key Vault 管理的存储共享访问签名定义。 该定义具有已创建的共享访问签名令牌的模板 URI。 该定义具有共享的access签名类型account,有效期为 N 天。
  • 验证共享访问签名是否已作为机密保存到密钥库中。

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

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):访问交互对象级 API,用于 Blob、队列消息、表实体和文件(例如,上传 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>

后续步骤