解释共享访问签名
共享访问签名 (SAS) 是一个签名的 URI,它指向一个或多个存储资源,并包括一个包含一组特殊查询参数的令牌。 令牌指示客户端如何访问资源。 作为一个查询参数,签名是基于 SAS 参数构造的,已通过用来创建该 SAS 的密钥签名。 Azure 存储使用该签名授予对存储资源的访问权限。
共享访问签名的类型
Azure 存储支持三种类型的共享访问签名:
用户委托 SAS:用户委派 SAS 使用 Microsoft Entra 凭据以及为 SAS 指定的权限进行保护。 用户委托 SAS 仅适用于 Blob 存储。
服务 SAS:服务 SAS 使用存储帐户密钥进行保护。 一个服务 SAS 会委托对以下 Azure 存储服务中某一资源的访问权限:Blob 存储、队列存储、表存储和 Azure 文件存储。
帐户 SAS:帐户 SAS 使用存储帐户密钥进行保护。 帐户 SAS 可委派对一个或多个存储服务中的资源的访问权限。 通过服务或用户委托 SAS 提供的所有操作也可以通过帐户 SAS 提供。
注意
Microsoft 建议你尽可能使用 Microsoft Entra 凭据,而不要使用更容易受到安全威胁的帐户密钥,这是安全性方面的最佳做法。 当你的应用程序设计需要共享访问签名来访问 Blob 存储时,请在可能的情况下使用 Microsoft Entra 凭据创建用户委派 SAS 以获得更高的安全性
共享访问签名的工作方式
使用 SAS 访问 Azure 存储中存储的数据时,需要两个组件。 第一个是要访问的资源的 URI。 第二个是创建的 SAS 令牌,用于授予对该资源的访问权限。
在单个 URI(如 https://medicalrecords.blob.core.windows.net/patient-images/patient-116139-nq8z7f.jpg?sp=r&st=2020-01-20T11:42:32Z&se=2020-01-20T19:42:32Z&spr=https&sv=2019-02-02&sr=b&sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D
)中,可以将 URI 与 SAS 令牌分开,如下所示:
- URI:
https://medicalrecords.blob.core.windows.net/patient-images/patient-116139-nq8z7f.jpg?
- SAS 令牌:
sp=r&st=2020-01-20T11:42:32Z&se=2020-01-20T19:42:32Z&spr=https&sv=2019-02-02&sr=b&sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D
SAS 令牌本身由多个组件组成。
组件 | 说明 |
---|---|
sp=r |
控制访问权限。 值可以是 a (添加)、c (创建)、d (删除)、l (列出)、r (读取)或 w (写入)。 此示例为只读示例。 示例 sp=acdlrw 授予所有可用权限。 |
st=2020-01-20T11:42:32Z |
访问开始的日期和时间。 |
se=2020-01-20T19:42:32Z |
访问结束的日期和时间。 此示例授予 8 个小时的访问权限。 |
sv=2019-02-02 |
要使用的存储 API 的版本。 |
sr=b |
要访问的存储类型。 在此示例中,b 表示 blob。 |
sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D |
加密签名。 |
最佳做法
为了降低使用 SAS 的潜在风险,Microsoft 提供了一些指南:
- 若要安全地分发 SAS 并防止中间人攻击,请始终使用 HTTPS。
- 最安全的 SAS 是用户委托 SAS。 请尽可能使用此 SAS,因为通过它你便无需将存储帐户密钥存储在代码中。 必须使用 Microsoft Entra ID 来管理凭据。 你的解决方案可能无法使用此选项。
- 尝试将到期时间设置为最小的可用值。 如果 SAS 密钥泄露,它只能被利用很短的时间。
- 应用要求的最低特权规则。 仅授予必需的访问权限。 例如,在应用中,只读访问权限就足够了。
- 在某些情况下,SAS 不是正确的解决方案。 如果使用 SAS 存在无法接受的风险,可创建一个中间层服务来管理用户及其对存储的访问权限。