使用共享访问签名 (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)。
本文介绍如何使用 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,该系统将SAS令牌绑定给目标终端用户,且不能被他人使用。
有关共享访问签名的详细信息,请参阅使用共享访问签名 (SAS) 授予对 Azure 存储资源的有限访问权限。
安装 PowerShell 模块
若要使用 PowerShell 创建用户委托 SAS,请安装 Az.Storage 模块的 1.10.0 版本或更高版本。 若要安装此模块的最新版本,请按照以下步骤操作:
卸载以前安装的所有 Azure PowerShell:
- 使用“设置”下的“应用和功能”设置从 Windows 中删除以前安装的所有 Azure PowerShell。
- 从 中删除所有 Azure 模块
%Program Files%\WindowsPowerShell\Modules。
确保已安装 PowerShellGet 最新版本。 打开 Windows PowerShell 窗口,然后运行以下命令以安装最新版本:
Install-Module PowerShellGet -Repository PSGallery -Force安装 PowerShellGet 后关闭并重新打开 PowerShell 窗口。
安装最新版本的 Azure PowerShell:
Install-Module Az -Repository PSGallery -AllowClobber确保已安装 Azure PowerShell 版本 3.2.0 或更高版本。 运行以下命令来安装 Azure 存储 PowerShell 模块的最新版本:
Install-Module -Name Az.Storage -Repository PSGallery -Force关闭并重新打开 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>
Important
用户委派密钥和 Azure 角色分配都由 Azure 存储 缓存,因此从你启动撤销流程到现有用户委派 SAS 失效之间可能会有延迟。