如何在Azure SDK中撤销共享访问签名

24

我找不到任何有关撤销已创建的Blob共享访问签名访问权限的代码示例,是否有人可以为我提供删除先前创建的Shared Access Signature访问权限的链接或参考资料。


3
你创建共享访问签名时,是否使用了容器访问策略? - Gaurav Mantri
参见:https://dev59.com/53vaa4cB1Zd3GeqPDnhL https://dev59.com/UqXja4cB1Zd3GeqPP1y0 - dreftymac
5个回答

19

即使共享访问签名(SAS)是基于存储访问策略(SAP)的,您仍然只能撤销SAP,而不能撤销单个SAS。

Azure存储安全指南提供了良好的详细信息: https://learn.microsoft.com/en-us/rest/api/storageservices/create-service-sas#revoke-a-sas

不基于SAP的SAS - 无法被撤销:

如果您使用临时URI,则有三个选择。您可以发行具有短期失效策略的SAS令牌,并等待SAS失效。您可以重命名或删除资源(假设令牌范围限于单个对象)。您可以更改存储帐户密钥。这最后一个选项可能会产生重大影响,具体取决于有多少服务正在使用该存储帐户,可能不是您没有进行一些计划就 所要做的事情。

基于SAP的SAS - 可以通过撤销SAP来撤销:

如果您正在使用从存储访问策略派生的 SAS,则可以通过撤销存储访问策略来删除访问权限 - 您可以将其更改为已过期,或者完全删除它。这会立即生效,并使使用该存储访问策略创建的每个 SAS 无效。更新或删除存储访问策略可能会影响通过 SAS 访问特定容器、文件共享、表格或队列的人员,但如果客户端编写得当,当旧的 SAS 变得无效时,它们会请求新的 SAS,这将正常工作。

最佳实践:

因为使用从存储访问策略派生的 SAS 可以立即撤销该 SAS 的能力,所以建议在可能的情况下始终使用存储访问策略。


13

背景

  • MSFT Azure存储账户(截至2019年11月26日的实时版本)
  • 由Shared Access Signature(SAS)管理的MSFT Azure存储权限

问题

  • 用户user145610想立即撤销已部署的SAS
    • (例如,因为SAS允许认证进入Blob Storage,并且SAS已被破解,需要立即进行修复以防止未经授权的数据泄漏)

已提到的解决方法

  • 其他答案已在此主题中讨论了使用Shared Access Policy(也称为Stored Access Policy)(SAP)的方法
  • 基于SAP生成的SAS有限制,同一存储账户内的Blob容器只能附加五个SAP。

解决方法:重新生成账户密钥

  • 一个此帖子发布时未提及的解决方法是重新生成用于创建SAS的账户密钥,如在本答案的“另请参阅”部分中的链接所述。

重新生成账户密钥将导致使用该密钥的所有应用程序组件无法授权,直到它们更新为使用其他有效账户密钥或新生成的账户密钥。重新生成账户密钥是立即撤销即席SAS的唯一方法。

因此,一种潜在的解决方法是基于辅助帐户密钥生成和部署SAS,并期望您会定期重新生成辅助帐户密钥,以便在需要立即撤销一个或多个SAS时使用。
(显然,这不是一个理想的情况,当许多SAS令牌被部署并且依赖于辅助帐户密钥时,因为它们将在密钥重新生成时全部无效)
解决方案
无法部署大量SAP的能力,再加上必须重新生成帐户密钥可能产生的不利副作用,建议潜在解决方案是重新设计项目架构,使用ActiveDirectory来控制授权和访问控制以及生成SAS令牌。
基于SAP的SAS可能更适合仅有少数客户端需要访问且SAS被攻击的概率极低的情况。
截至本文写作时,MSFT Azure存储支持基于ActiveDirectory帐户生成和使用SAS令牌。
另请参见

3
这个答案绝对是最好的,因为它是唯一一个提供立即撤销基于策略之外的共享访问签名机制的答案。我已经尝试刷新主帐户密钥,并可以证明Blob容器上的共享访问签名立即被撤销了。请注意,在Storage Explorer中生成容器的SAS时,您无法选择要使用哪个帐户密钥进行签名,所以我猜它总是主密钥。 - Josh Gallagher
1
“一个存储帐户只能附加五个SAP。”实际上,它是“一个块容器只能附加五个SAP”。[链接] (https://learn.microsoft.com/en-us/azure/storage/blobs/scalability-targets#scale-targets-for-blob-storage) - li ki
1
@liki 谢谢你发现了那个错误...已经修复了。 - dreftymac

9
如果共享访问签名不是基于存储的访问策略,则无法撤销它。如需了解更多信息,请参见https://learn.microsoft.com/en-us/rest/api/storageservices/define-stored-access-policy#modifying-or-revoking-a-stored-access-policy

要撤销存储的访问策略,您可以将其删除或重命名,并更改已签名的标识。更改已签名的标识会破坏任何现有签名与存储访问策略之间的关联。删除或重命名存储的访问策略会立即影响所有与之关联的共享访问签名。


请提供简单的代码以删除存储访问策略或更改签名标识符。 - user145610
13
为什么Azure会允许创建没有存储访问策略的SAS密钥呢?吊销访问权限是任何身份验证系统的基本要求。 - rags
现在有没有办法做到这一点?我通过编程方式生成SAS令牌,其有效期为1小时,但有时如果与之关联的操作已完成,我想提前撤销它。 - user3587624
1
根据我的理解,SAS令牌是一个包含有关其允许访问的加密信息的字符串。这使开发人员能够生成无限数量的SAS令牌而无需额外开销,但缺点是它们实际上无法被撤销。 - Nican
根据文档,撤销基于即席访问策略的临时 SAS 只能通过重新生成帐户密钥来完成。 - baouss

3

我也遇到过这个问题。正如@IlyaBerdichevsky在顶部所提到的,最佳实践是使用从存储访问策略派生的SAS

TLDR;

观看此YouTube视频教程


(一步一步)如何创建从Store Access Policy衍生的SAS?

首先,设置存储访问策略
  1. 进入Azure Storage资源
  2. 点击容器(数据存储下的左侧面板),选择您的容器(不同的容器可能设置了不同的策略)。
  3. 点击访问策略(设置下的左侧面板)
  4. 点击添加策略
  5. 在此处可以指定所需的策略(屏幕截图示例) enter image description here
  6. 点击OK
  7. 点击顶部的保存按钮(它实际上很快反映出来,尽管它声称需要大约30秒)
第二步,基于创建的SAP(存储访问策略)生成SAS
  1. 返回Azure Storage资源
  2. 点击存储资源管理器(预览) enter image description here
  3. 在我的情况下,我正在使用Blob容器,所以我会展开我的Blob容器并单击我想要的容器。一旦选择了文件,您将看到其在容器内。
  4. 右键单击文件,单击获取共享访问签名enter image description here
  5. 在下拉列表中选择刚刚创建的策略。 enter image description here
  6. 点击创建
  7. 完成!您已经获得了您的令牌:)

如何撤销/延长为客户创建的SAS令牌?

  1. 返回您设置的策略
  2. 更新过期时间
  3. 保存
  4. TAAA-DAHH!与SAS令牌相同的链接现在应该过期/起作用了。

0

我曾经遇到过同样的问题,这是我解决它的方法:

SAS uri revoke

红色服务与Azure Blob Storage之间的通信是通过SDK v8.0完成的。


那么你的撤销操作依赖于客户端发送DELETE请求?当你遇到任何不合作或损坏的客户端时,这似乎是有问题的。 - ZX9
@ZX9请注意,此客户端在此情况下已作为管理员登录。当然,您也可以完全在服务器上执行此操作。 - GuyT
1
如果上传是直接从客户端到Azure Blob Storage完成的(这也是SAS的全部意义),那么我认为服务器不会看到来自Blob Storage的201。你会等待另一个POST /storage/blob/token来撤销,还是使用类似Blob Storage触发器之类的东西来删除策略呢? - ZX9
我建议使用您提出的触发器之类的东西。对我来说,这听起来像是正确的实现。假设:限制为5个策略(这仍然是限制吗?),触发器可用。 - GuyT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接