使用共享访问签名 (SAS),可以授予对存储帐户中容器和 blob 的有限访问权限。 创建 SAS 时,需要指定其约束条件,包括允许客户端访问哪些 Azure 存储资源、它们对这些资源具有哪些权限,以及 SAS 的有效期。
每个 SAS 均使用密钥进行签名。 可以通过以下两种方式中的一种对 SAS 进行签名:
- 使用通过 Microsoft Entra 凭据创建的密钥。 使用 Microsoft Entra 凭据签名的 SAS 是用户委托 SAS。 创建用户委托 SAS 的客户端必须被分配一个包含 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作的 Azure RBAC 角色。 若要了解详细信息,请参阅创建用户委托 SAS。
- 使用存储账户密钥。 服务 SAS 和帐户 SAS 均使用存储帐户密钥进行签名。 创建服务 SAS 的客户端必须要么具有对帐户密钥的直接访问权限,要么被授予 Microsoft.Storage/storageAccounts/listkeys/action 权限。 若要了解详细信息,请参阅创建服务 SAS 或创建帐户 SAS。
注释
与使用存储帐户密钥签名的 SAS 相比,用户委托 SAS 具有更高的安全性。 Microsoft 建议尽可能使用用户委托 SAS。 有关详细信息,请参阅向具有共享访问签名的数据授予有限的访问权限 (SAS)。
本文介绍如何使用 Microsoft Entra 凭证通过 Azure CLI 为容器或 blob 创建用户委派 SAS。
关于用户委托 SAS
可使用 Microsoft Entra 凭据或帐户密钥来保护用于访问容器或 Blob 的 SAS 令牌。 使用 Microsoft Entra 凭据保护的 SAS 称为用户委派 SAS,因为用于签署 SAS 的 OAuth 2.0 令牌是代表用户请求的。
Azure 建议你尽可能使用 Microsoft Entra 凭据,而不要使用更容易受到安全威胁的帐户密钥,这是安全性方面的最佳做法。 当应用程序设计需要共享访问签名时,请使用 Microsoft Entra 凭据创建可提供超高安全性的用户委派 SAS。 有关用户委托 SAS 的详细信息,请参阅创建用户委托 SAS。
警告
拥有有效 SAS 的任何客户端都可以按照该 SAS 授予的权限访问你的存储帐户中的数据。 保护 SAS 免遭恶意或非预期使用非常重要。 分发 SAS 时务必谨慎,并预先制定好在 SAS 泄露后将其撤销的方案。 为防止非预期使用,使用用户绑定的用户委托SAS,该系统将SAS令牌绑定给目标终端用户,且不能被他人使用。
有关共享访问签名的详细信息,请参阅使用共享访问签名 (SAS) 授予对 Azure 存储资源的有限访问权限。
安装最新版本的Azure CLI
要使用 Azure CLI 来保护带有 Microsoft Entra 凭证的 SAS,首先确保你安装的是最新版本的 Azure CLI。 有关安装Azure CLI的更多信息,请参见“安装Azure CLI”。
要使用 Azure CLI 创建用户委派 SAS,请确保你安装的是 2.0.78 或更高版本。 要检查你安装的版本,请使用命令。az --version
使用Microsoft Entra凭据登录
用你的 Microsoft Entra 凭证登录 Azure CLI。 有关详细信息,请参阅 使用 Azure CLI 登录。
使用 Azure RBAC 分配权限
要通过 Azure PowerShell 创建用户委派 SAS,用于登录 Azure CLI 的 Microsoft Entra 帐户必须被分配一个包含 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作的角色。 该权限使该 Microsoft Entra 账户能够请求用户委托密钥。 用户委托密钥用于对用户委托 SAS 进行签名。 包含 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作的角色必须在存储帐户、资源组或订阅级别进行分配。
如果您没有足够的权限将 Azure 角色分配给 Microsoft Entra 安全主体,您可能需要请求账户所有者或管理员分配必要的权限。
以下示例分配了存储 Blob 数据参与者角色,该角色包含Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey操作权限。 该角色的作用域限定在存储帐户级别。
请务必将尖括号中的占位符值替换为你自己的值:
az role assignment create \
--role "Storage Blob Data Contributor" \
--assignee <email> \
--scope "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>"
有关包含 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作的内置角色的详细信息,请参阅 Azure 内置角色。
使用 Microsoft Entra 凭证来保护 SAS
当你用 Azure CLI 创建用户委派 SAS 时,用于签署 SAS 的用户委派密钥会隐式地为你创建。 你为SAS指定的起始时间和到期时间也被用作用户委派密钥的起始时间和到期时间。
由于用户委派密钥有效的最大间隔是从开始日期起计7天,所以你应该为SAS指定一个在起始时间7天内的到期时间。 用户委托密钥过期后,SAS无效,因此超过7天的SAS仍然只能有效7天。
创建用户委派 SAS 时,--auth-mode login 和 --as-user parameters 是必需的。 请为 --auth-mode 参数指定 login,以便对 Azure 存储 发出的请求使用你的 Microsoft Entra 凭据进行授权。 指定 --as-user 参数,表示返回的SAS应是用户委派的SAS。
为容器创建一个用户委派 SAS
要为带有 Azure CLI 的容器创建用户委派 SAS,调用 az storage container generate-sas 命令。
支持的用户委派SAS在容器上的权限包括添加、创建、删除、列表、读取和写入。 权限可以单独指定,也可以合并指定。 有关这些权限的更多信息,请参见创建用户委托 SAS。
以下示例返回一个容器的用户委派SAS令牌。 请记得将括号中的占位符值替换为你自己的值:
az storage container generate-sas \
--account-name <storage-account> \
--name <container> \
--permissions acdlrw \
--expiry <date-time> \
--auth-mode login \
--as-user
返回的用户委派 SAS 令牌将类似于:
se=2019-07-27&sp=r&sv=2018-11-09&sr=c&skoid=<skoid>&sktid=<sktid>&skt=2019-07-26T18%3A01%3A22Z&ske=2019-07-27T00%3A00%3A00Z&sks=b&skv=2018-11-09&sig=<signature>
注释
Blob 存储返回的SAS令牌不包含URL查询字符串的分隔符字符('?')。 如果你在资源URL上附加SAS令牌,记得也要加上分隔符字符。
为 Blob 创建用户委托 SAS
要为带有 Azure CLI 的 blob 创建用户委派 SAS,调用 az storage blob generate-sas 命令。
支持的用户委派SAS在blob上的权限包括添加、创建、删除、读取和写入。 权限可以单独指定,也可以合并指定。 有关这些权限的更多信息,请参见创建用户委托 SAS。
以下语法返回 Blob 的用户委托 SAS。 示例指定了参数, --full-uri 返回带有SAS令牌的blob URI。 请记得将括号中的占位符值替换为你自己的值:
az storage blob generate-sas \
--account-name <storage-account> \
--container-name <container> \
--name <blob> \
--permissions acdrw \
--expiry <date-time> \
--auth-mode login \
--as-user \
--full-uri
返回的用户委派 SAS URI 将类似于:
https://storagesamples.blob.core.chinacloudapi.cn/sample-container/blob1.txt?se=2019-08-03&sp=rw&sv=2018-11-09&sr=b&skoid=<skoid>&sktid=<sktid>&skt=2019-08-02T2
2%3A32%3A01Z&ske=2019-08-03T00%3A00%3A00Z&sks=b&skv=2018-11-09&sig=<signature>
注释
Azure CLI 返回的 SAS 令牌不包含 URL 查询字符串的分隔字符('?')。 如果要将 SAS 令牌追加到资源 URL,请记住在追加 SAS 令牌之前将分隔符字符追加到资源 URL。
用户委派 SAS 不支持使用存储访问策略来定义权限。
撤销用户委托 SAS
若要通过 Azure CLI 撤销用户委托 SAS,请调用 az storage account revoke-delegation-keys 命令。 该命令会撤销与指定存储账户关联的所有用户委派密钥。 与这些密钥关联的任何共享访问签名都会被无效。
请务必将尖括号中的占位符值替换为你自己的值:
az storage account revoke-delegation-keys \
--name <storage-account> \
--resource-group <resource-group>
Important
用户委派密钥和 Azure 角色分配都由 Azure 存储 缓存,因此从你启动撤销流程到现有用户委派 SAS 失效之间可能会有延迟。