你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
重要
密钥保管库托管存储帐户密钥(旧版)受支持 as-is,且未计划更多更新。 只有不高于 2018-03-28 的 SAS 定义已签名的存储服务版本才支持帐户 SAS。
重要
在版本 2.54 中删除了对 Azure CLI 中的托管存储帐户密钥的支持,必须在本教程中使用 Azure CLI 版本 2.53.1 或以前的命令。
重要
建议将 Azure 存储与 Microsoft Entra ID(Microsoft的基于云的标识和访问管理服务)集成。 Microsoft Entra 集成适用于 Azure Blob、队列和表,并提供基于 OAuth2 令牌的 Azure 存储访问权限(就像 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 令牌失效,并导致中断。
服务主体应用程序标识符
Microsoft Entra 租户向每个已注册的应用程序提供 服务主体。 服务主体充当应用程序 ID,在授权设置期间用于通过 Azure 角色基访问控制(Azure RBAC)访问其他 Azure 资源。
Key Vault 是一款在所有 Microsoft Entra 租户中预先注册的 Microsoft 应用程序。 Key Vault 在每个 Azure 云中的相同应用程序 ID 下注册。
| 租户 | 云 | 应用程序 ID |
|---|---|---|
| Microsoft Entra ID | Azure 政府 | 7e7c393b-45d0-48b1-a35e-2905ddf8183c |
| Microsoft Entra ID | Azure 公共云 | cfa8b339-82a2-471a-a3c9-0fc0be7a4093 |
| Other | 任意 | cfa8b339-82a2-471a-a3c9-0fc0be7a4093 |
先决条件
若要完成本指南,必须先执行以下步骤:
- 安装 Azure CLI。
- 创建密钥保管库
- 创建 Azure 存储帐户。 存储帐户名称只能使用小写字母和数字。 名称的长度必须介于 3 到 24 个字符之间。
管理存储帐户密钥
连接到 Azure 帐户
使用 az login 命令对 Azure CLI 会话进行身份验证。
az login
授予 Key Vault 对存储帐户的访问权限
使用 Azure CLI az role assignment create 命令授予 Key Vault 访问存储帐户的权限。 为命令提供以下参数值:
-
--role:授予“存储帐户密钥操作员服务角色”Azure 角色。 此角色将您的存储帐户的访问权限范围限制为特定。 对于经典存储帐户,请改为传递“经典存储帐户密钥操作员服务角色”。 -
--assignee:传递值“https://vault.azure.net",这是 Azure 公有云中 Key Vault 的 URL。 (对于 Azure 政府云,请改用“--assignee-object-id”,请参阅 服务主体应用程序 ID。) -
--scope:传递存储帐户资源 ID,格式为/subscriptions/<subscriptionID>/resourceGroups/<StorageAccountResourceGroupName>/providers/Microsoft.Storage/storageAccounts/<YourStorageAccountName>。 使用 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.net" --scope "/subscriptions/<subscriptionID>/resourceGroups/<StorageAccountResourceGroupName>/providers/Microsoft.Storage/storageAccounts/<YourStorageAccountName>"
授予用户帐户对托管存储帐户的权限
使用 Azure CLI az role assignment create 命令将 Key Vault 机密官员 角色分配给用户帐户,并授予存储帐户权限。
# 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 门户中存储帐户的“访问策略”页不会显示存储帐户的权限。
创建 Key Vault 托管存储帐户
使用 Azure CLI az keyvault storage 命令创建 Key Vault 托管存储帐户。 设置 30 天的重新生成期。 轮换时,KeyVault 将重新生成未处于活动状态的密钥,然后将新创建的密钥设置为活动密钥。 每次只有一个密钥用于颁发 SAS 令牌,这是活动密钥。 为命令提供以下参数值:
-
--vault-name:传递密钥保管库的名称。 若要查找密钥保管库的名称,请使用 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 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<YourStorageAccountName>托管存储帐户<YourKeyVaultName>上设置的。 - 在保管库中设置 Key Vault 托管存储共享访问签名定义。 该定义具有已创建的共享访问签名令牌的模板 URI。 该定义具有共享访问签名类型
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 查询参数 | Description |
|---|---|
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 only 不是被允许的值。 |
有关帐户 SAS 的详细信息,请参阅: 创建帐户 SAS
注释
密钥保管库会忽略“已签名到期时间”、“已签名开始时间”等生存期参数以及在 2018-03-28 版本之后引入的参数
在 Key Vault 中设置共享访问签名定义
使用 Azure CLI az keyvault storage sas-definition create 命令,将上一步 --template-uri 中的 SAS 定义模板传递到参数,以创建共享访问签名定义。 可以为 -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.net/storage/<YourStorageAccountName>/sas/<YourSASDefinitionName>
后续步骤
- 详细了解 密钥、机密和证书。
- 查看 Azure Key Vault 团队博客上的文章。
- 请参阅 az keyvault 参考文档。