使用 Azure CLI 为容器或 blob 创建用户委托 SAS

使用共享访问签名 (SAS),可以授予对存储帐户中容器和 blob 的有限访问权限。 创建 SAS 时,需要指定其约束条件,包括允许客户端访问哪些 Azure 存储资源、它们对这些资源具有哪些权限,以及 SAS 的有效期。

每个 SAS 均使用密钥进行签名。 可通过以下两种方式之一对 SAS 进行签名:

  • 使用通过 Microsoft Entra 凭据创建的密钥。 使用 Microsoft Entra 凭据签名的 SAS 是用户委托 SAS。 必须为创建用户委托 SAS 的客户端分配一个 Azure RBAC 角色,该角色包括 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作。 若要了解详细信息,请参阅创建用户委托 SAS
  • 使用存储帐户密钥。 服务 SAS 和帐户 SAS 均使用存储帐户密钥进行签名。 创建服务 SAS 的客户端必须具有对帐户密钥的直接访问权限,或分配有 Microsoft.Storage/storageAccounts/listkeys/action 权限。 若要了解详细信息,请参阅创建服务 SAS创建帐户 SAS

注意

用户委托 SAS 为使用存储帐户密钥签名的 SAS 提供更高的安全性。 Microsoft 建议尽可能使用用户委托 SAS。 有关详细信息,请参阅向具有共享访问签名的数据授予有限的访问权限 (SAS)

本文介绍如何使用 Azure CLI 通过 Microsoft Entra 凭据为容器或 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) 授予对 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 天内的到期时间。 此 SA 在用户委托密钥过期后无效,因此,到期时间超过 7 天的 SAS 的有效期仍然只有 7 天。

创建用户委托 SAS 时,--auth-mode login--as-user parameters 是必需的。 为 --auth-mode 参数指定 login,以便使用你的 Microsoft Entra 凭据为向 Azure 存储发出的请求授权。 指定 --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 查询字符串的分隔符字符 ('?')。 如果要将 SAS 令牌追加到资源 URL,请记住还要追加分隔符。

为 blob 创建用户委托 SAS

若要通过 Azure CLI 为 blob 创建用户委托 SAS,请调用 az storage blob generate-sas 命令。

Blob 上的用户委托 SAS 支持的权限包括添加、创建、删除、读取和写入。 权限可以单独指定,也可以通过组合方式指定。 有关这些权限的详细信息,请参阅创建用户委托 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>

重要

用户委托密钥和 Azure 角色分配都是由 Azure 存储缓存的,因此,在启动撤销过程后,可能需要过一段时间现有用户委托 SAS 才会变得无效。

后续步骤