创建共享访问签名
共享访问签名(SAS)是一个统一的资源标识符(URI),它授予对 Azure 存储资源的受限访问权限。 SAS 可安全地共享存储资源,而不会危及帐户密钥。
可向不该有权访问你的存储帐户密钥的客户端提供 SAS。 通过向这些客户端分发 SAS URI,可授予它们在一段指定时间内访问资源的权限。 对于用户用来在你的存储帐户中读取和写入其数据的服务,通常要使用 SAS。
用户委派 SAS 使用 Microsoft Entra 凭据以及为 SAS 指定的权限进行保护。 Blob 存储和 Data Lake Storage 支持用户委派 SAS,
帐户级 SAS可以允许访问服务级别 SAS 所能允许的任意内容,还能访问其他资源和功能。 例如,可以使用帐户级别 SAS 来允许创建文件系统。
一个 服务级别 SAS ,允许访问存储帐户中的特定资源。 例如,可以使用此类型的 SAS 来允许应用检索文件系统中的文件列表或下载某个文件。
在服务器端使用服务级 SAS 时,存储访问策略可提供另一级别的控制。 可以使用存储访问策略对 SAS 进行分组并提供其他限制。
管理风险的建议
让我们来看看一些建议,这些建议可以帮助缓解使用 SAS 时产生的风险。
| 建议 | DESCRIPTION |
|---|---|
| 始终使用 HTTPS 创建和分发 | 如果 SAS 通过 HTTP 传递且被截获,攻击者可能会截获并使用 SAS。 这些“中间人”攻击可能会危害敏感数据或容许恶意用户损坏数据。 |
| 尽可能引用存储访问策略 | 存储访问策略使你可以选择撤消权限,而不必重新生成 Azure 存储帐户密钥。 将存储帐户密钥到期日期设置为较远的未来时间。 |
| 为计划外的 SAS 设置近期的到期时间 | 如果 SAS 遭到入侵,可以通过将 SAS 有效性限制为较短时间来缓解攻击。 如果你无法引用存储访问策略,此做法非常重要。 临近的到期时间还通过限制可上传到 blob 的时间来限制可写入 blob 的数据量。 |
| 让客户端自动续订 SAS | 让客户端在到期日期之前续订 SAS。 如果提供 SAS 的服务不可用,则提前续订,留出时间进行重试。 |
| 仔细计划 SAS 开始时间 | 如果你将 SAS 的开始时间设置为“现在”,则由于时钟偏移(根据不同计算机,当前时间中的差异),在前几分钟将会暂时观察到失败。 通常,将开始时间至少设置为 15 分钟前。 或者,不要设置特定的开始时间,这会导致 SAS 在所有情况下立即有效。 相同的条件通常适用于到期时间。 对于任何请求,在任一方向你可能会观察到最多 15 分钟的时钟偏移。 对于使用 2012-02-12 之前的 REST API 版本的客户端,未参照某一存储访问策略的 SAS 的最大持续时间是 1 小时。 任何指定了更长期限的策略都将失败。 |
| 定义资源的最大访问权限 | 最佳安全做法是为用户提供所需的最低权限。 如果某一用户仅需要对单个实体的读取访问权限,则向该用户授予对该单个实体的读取访问权限,而不要授予针对所有实体的读取/写入/删除访问权限。 如果 SAS 泄露,此做法也有助于降低损失,因为攻击者手中掌握的 SAS 的权限较为有限。 |
| 验证使用 SAS 写入的数据 | 在某一客户端应用程序将数据写入你的 Azure 存储帐户时,请记住对于这些数据可能存在问题。 如果应用程序需要经过验证或授权的数据,请在写入数据后且使用数据前验证数据。 这一实践还有助于防止损坏的数据或恶意数据写入你的帐户,这些数据可能是正常要求 SAS 的用户写入的,也可能是利用泄露的 SAS 的用户写入的。 |
| 不要假设 SAS 始终是正确的选择 | 在某些场景下,针对 Azure 存储帐户执行特定操作所带来的风险超过了 SAS 所带来的好处。 对于此类操作,应创建一个中间层服务,该服务在执行业务规则验证、身份验证和审核后写入你的存储帐户。 此外,有时候以其他方式管理访问会更简单。 如果想要使某一容器中的所有 blob 都可以公开读取,则可以使该容器成为公共的,而不是为每个客户端都提供 SAS 来进行访问。 |