使用 PowerShell 为容器或 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 PowerShell 通过 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 存储资源的有限访问权限

安装 PowerShell 模块

若要使用 PowerShell 创建用户委托 SAS,请安装 Az.Storage 模块的 1.10.0 版本或更高版本。 若要安装此模块的最新版本,请按照以下步骤操作:

  1. 卸载以前安装的所有 Azure PowerShell:

    • 使用“设置”下的“应用和功能”设置从 Windows 中删除以前安装的所有 Azure PowerShell。
    • %Program Files%\WindowsPowerShell\Modules 中删除所有 Azure 模块。
  2. 确保已安装 PowerShellGet 最新版本。 打开 Windows PowerShell 窗口,然后运行以下命令以安装最新版本:

    Install-Module PowerShellGet -Repository PSGallery -Force
    
  3. 安装 PowerShellGet 后关闭并重新打开 PowerShell 窗口。

  4. 安装最新版本的 Azure PowerShell:

    Install-Module Az -Repository PSGallery -AllowClobber
    
  5. 确保已安装 Azure PowerShell 版本 3.2.0 或更高版本。 运行以下命令来安装 Azure 存储 PowerShell 模块的最新版本:

    Install-Module -Name Az.Storage -Repository PSGallery -Force
    
  6. 关闭并重新打开 PowerShell 窗口。

若要检查安装了哪一 Az.Storage 版本,请运行以下命令:

Get-Module -ListAvailable -Name Az.Storage -Refresh

有关如何安装 Azure PowerShell 的详细信息,请参阅使用 PowerShellGet 安装 Azure PowerShell

使用 Microsoft Entra ID 登录到 Azure PowerShell

调用 Connect-AzAccount 命令以使用 Microsoft Entra 帐户登录:

Connect-AzAccount -Environment AzureChinaCloud

若要详细了解如何使用 PowerShell 登录,请参阅使用 Azure PowerShell 登录

通过 Azure RBAC 分配权限

若要通过 Azure PowerShell 创建用户委派 SAS,必须为用来登录到 PowerShell 的 Microsoft Entra 帐户分配一个包含 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作的角色。 此权限使该 Microsoft Entra 帐户可以请求用户委派密钥。 用户委托密钥用来对用户委托 SAS 进行签名。 提供 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作的角色必须在存储帐户、资源组或订阅级别进行分配。 有关用于创建用户委托 SAS 的 Azure RBAC 权限的详细信息,请参阅创建用户委托 SAS 中的使用 Azure RBAC 分配权限部分。

如果你没有足够的权限将 Azure 角色分配给 Microsoft Entra 安全主体,则可能需要请求帐户所有者或管理员来分配必要的权限。

下面的示例将分配存储 Blob 数据参与者角色,该角色包含 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作。 该角色的作用域为存储帐户级别。

请务必将尖括号中的占位符值替换为你自己的值:

New-AzRoleAssignment -SignInName <email> `
    -RoleDefinitionName "Storage Blob Data Contributor" `
    -Scope  "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>"

有关包含 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作的内置角色的详细信息,请参阅 Azure 内置角色

使用 Microsoft Entra 凭据保护 SAS

通过 Azure PowerShell 创建用户委托 SAS 时,将为你隐式创建用于对 SAS 进行签名的用户委托密钥。 为 SAS 指定的开始时间和到期时间也用作用户委托密钥的开始时间和到期时间。

由于用户委托密钥的最大时间间隔是从开始日期算起的 7 天内有效,因此,你应为 SAS 指定一个从开始时间算起 7 天内的到期时间。 此 SAS 在用户委托密钥过期后将无效,因此,到期时间超过 7 天的 SAS 的有效期仍然仅为 7 天。

若要使用 Azure PowerShell 为容器或 blob 创建用户委托 SAS,请先通过指定 -UseConnectedAccount 参数创建一个新的 Azure 存储上下文对象。 -UseConnectedAccount 参数指定该命令在你登录时所用的 Microsoft Entra 帐户下创建上下文对象。

请务必将尖括号中的占位符值替换为你自己的值:

$ctx = New-AzStorageContext -StorageAccountName <storage-account> -UseConnectedAccount

为容器创建用户委托 SAS

若要返回容器的用户委托 SAS 令牌,请调用 New-AzStorageContainerSASToken 命令,传入以前创建的 Azure 存储上下文对象。

以下示例返回容器的用户委托 SAS 令牌。 请记得将括号中的占位符值替换为你自己的值:

New-AzStorageContainerSASToken -Context $ctx `
    -Name <container> `
    -Permission racwdl `
    -ExpiryTime <date-time>

返回的用户委托 SAS 令牌将类似于:

?sv=2018-11-09&sr=c&sig=<sig>&skoid=<skoid>&sktid=<sktid>&skt=2019-08-05T22%3A24%3A36Z&ske=2019-08-07T07%3A
00%3A00Z&sks=b&skv=2018-11-09&se=2019-08-07T07%3A00%3A00Z&sp=rwdl

为 blob 创建用户委托 SAS

若要返回 blob 的用户委托 SAS 令牌,请调用 New-AzStorageBlobSASToken 命令,传入以前创建的 Azure 存储上下文对象。

以下语法返回 blob 的用户委托 SAS。 此示例指定了 -FullUri 参数,该参数返回追加有 SAS 令牌的 blob URI。 请记得将括号中的占位符值替换为你自己的值:

New-AzStorageBlobSASToken -Context $ctx `
    -Container <container> `
    -Blob <blob> `
    -Permission racwd `
    -ExpiryTime <date-time>
    -FullUri

返回的用户委托 SAS URI 将类似于:

https://storagesamples.blob.core.chinacloudapi.cn/sample-container/blob1.txt?sv=2018-11-09&sr=b&sig=<sig>&skoid=<skoid>&sktid=<sktid>&skt=2019-08-06T21%3A16%3A54Z&ske=2019-08-07T07%3A00%3A00Z&sks=b&skv=2018-11-09&se=2019-08-07T07%3A00%3A00Z&sp=racwd

注意

用户委托 SAS 不支持使用存储访问策略来定义权限。

撤销用户委托 SAS

若要通过 Azure PowerShell 撤消用户委托 SAS,请调用 Revoke-AzStorageAccountUserDelegationKeys 命令。 此命令撤销与指定的存储帐户关联的所有用户委托密钥。 与这些密钥关联的所有共享访问签名都会失效。

请务必将尖括号中的占位符值替换为你自己的值:

Revoke-AzStorageAccountUserDelegationKeys -ResourceGroupName <resource-group> `
    -StorageAccountName <storage-account>

重要

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

后续步骤