本文内容
共享访问签名 (SAS) 提供对存储帐户中资源的安全委托访问。 使用 SAS 可以精细控制客户端访问数据的方式。 例如:
共享访问签名的类型
Azure 存储支持三种类型的共享访问签名:
用户委托 SAS
用户委托 SAS 使用 Azure Active Directory (Azure AD) 凭据以及为 SAS 指定的权限进行保护。 用户委托 SAS 仅适用于 Blob 存储。
有关用户委托 SAS 的详细信息,请参阅创建用户委托 SAS (REST API)。
服务 SAS
使用存储帐户密钥保护的服务 SAS。 一个服务 SAS 只会委托对一个 Azure 存储服务中的资源的访问权限:Blob 存储、队列存储、表存储或 Azure 文件。
有关服务 SAS 的详细信息,请参阅创建服务 SAS (REST API)。
帐户 SAS
帐户 SAS 使用存储帐户密钥进行保护。 帐户 SAS 可委派对一个或多个存储服务中的资源的访问权限。 通过服务或用户委托 SAS 提供的所有操作也可以通过帐户 SAS 提供。
还可将访问权限委派给以下操作:
有关帐户 SAS 的详细信息,请参阅创建帐户 SAS (REST API)。
注意
Microsoft 建议你尽可能使用 Azure AD 凭据,而不要使用更容易受到安全威胁的帐户密钥,这是安全性方面的最佳做法。 当应用程序设计需要共享访问签名以访问 Blob 存储时,请尽可能使用 Azure AD 凭据创建用户委托 SAS 以提高安全性。 有关详细信息,请参阅授权访问 Azure 存储中的数据。
共享访问签名可以采取以下两种形式的一种:
注意
用户委托 SAS 或帐户 SAS 必须是临时 SAS。 用户委托 SAS 或帐户 SAS 不支持存储的访问策略。
共享访问签名的工作方式
共享访问签名是追加到 Azure 存储资源的 URI 的令牌。 该令牌包含一组特殊的查询参数,这些参数指示客户端如何可访问资源。 作为一个查询参数,签名是基于 SAS 参数构造的,已通过用来创建该 SAS 的密钥签名。 Azure 存储使用该签名授予对存储资源的访问权限。
注意
无法审核 SAS 令牌的生成。 任何有权通过帐户密钥或 Azure 角色分配生成 SAS 令牌的用户都可以在存储帐户所有者不知情的情况下生成 SAS 令牌。 注意限制那些允许用户生成 SAS 令牌的权限。 若要防止用户生成使用 blob 和队列工作负荷的帐户密钥签名的 SAS,可以禁止共享密钥访问存储帐户。 有关详细信息,请参阅阻止通过共享密钥进行授权。
SAS 签名和授权
可使用用户委托密钥或使用存储帐户密钥(共享密钥)对 SAS 令牌进行签名。
使用用户委托密钥对 SAS 令牌进行签名
可使用通过 Azure Active Directory (Azure AD) 凭据创建的用户委托密钥对 SAS 令牌进行签名。 用户委托 SAS 是使用用户委托密钥进行签名的。
若要获取密钥并创建 SAS,必须为 Azure AD 安全主体分配一个包含 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作的 Azure 角色。 有关详细信息,请参阅创建用户委托 SAS (REST API)。
使用帐户密钥对 SAS 令牌进行签名
服务 SAS 和帐户 SAS 都是使用存储帐户密钥签名的。 若要创建使用帐户密钥签名的 SAS,应用程序必须有权访问该帐户密钥。
当请求包含 SAS 令牌时,将根据此 SAS 令牌的签名方式对该请求进行授权。 Azure 存储还使用用于创建 SAS 令牌的访问密钥或凭据来向拥有 SAS 的客户端授予访问权限。
下表总结了每种类型的 SAS 令牌的授权方式。
SAS 类型授权类型
用户委托 SAS(仅限 Blob 存储)
Azure AD
服务 SAS
共享密钥
帐户 SAS
共享密钥
Microsoft 建议尽可能使用用户委托 SAS 以提高安全性。
SAS 令牌
SAS 令牌是在客户端生成的字符串,例如,使用某个 Azure 存储客户端库生成。 Azure 存储不会以任何方式跟踪 SAS 令牌。 可以在客户端上创建不限数量的 SAS 令牌。 创建 SAS 后,可将其分发到需要访问存储帐户中的资源的客户端应用程序。
客户端应用程序将 SAS URI 作为请求的一部分提供给 Azure 存储。 然后,服务将检查 SAS 参数和签名,以验证其是否有效。 如果服务确认签名有效,则请求获得授权。 否则,请求被拒绝,错误代码为 403(禁止访问)。
下面是服务 SAS URI 的一个示例,其中显示了资源 URI、分隔符字符 (?) 和 SAS 令牌。
注意
查询字符串的分隔符字符 (?) 不是 SAS 令牌的一部分。 如果通过门户、PowerShell、Azure CLI 或 Azure 存储 SDK 之一生成 SAS 令牌,则可能需要将分隔符字符追加到资源 URL。
何时使用共享访问签名
使用 SAS 向任何无权访问这些资源的客户端授予对存储帐户中资源的安全访问权限。
SAS 通常适用于用户需要在存储帐户中读取和写入其数据的服务情形。 在存储帐户存储用户数据的情形中,有两种典型的设计模式:
客户端通过执行身份验证的前端代理服务上传和下载数据。 此前端代理服务允许验证业务规则。 但对于大量数据或大量事务,创建可扩展以匹配需求的服务可能成本高昂或十分困难。
轻型服务按需对客户端进行身份验证,并生成 SAS。 客户端应用程序接收到 SAS 后,可以直接访问存储帐户资源。 访问权限由 SAS 定义,并定义为 SAS 允许的时间间隔。 SAS 减少了通过前端代理服务路由所有数据的需要。
许多实际服务可能会混合使用这两种方法。 例如,一些数据可能通过前端代理进行处理和验证。 其他数据使用 SAS 直接保存和/或读取。
此外,在某些方案的复制操作中,需要使用 SAS 来授权访问源对象:
使用 SAS 的最佳实践
在应用程序中使用共享访问签名时,需要知道以下两个可能的风险:
下面这些针对使用共享访问签名的建议可帮助降低这些风险:
注意
存储不会跟踪为存储帐户生成的共享访问签名的数量,并且没有 API 可以提供此详细信息。 如果需要知道已为存储帐户生成的共享访问签名的数目,则必须手动跟踪该数目。
开始使用 SAS
若要开始使用共享访问签名,请参阅以下适用于每种 SAS 类型的文章。
用户委托 SAS服务 SAS帐户 SAS后续步骤