在Azure存储中访问私有Blob的URL

21

我们刚刚开始使用Azure存储。在我们的场景中,我们上传到私有blob,随后需要从我们的客户端应用程序直接访问,例如图像。

是否有一种方式可以使用包含访问密钥的URL来访问Azure存储中的私有blob?

在微软文档中找到的唯一方法是通过Blob URI进行简单的URL访问,例如通过使用.net API列出Blob时给出的CloudBlockBlob实例的URI属性。

自然地,从Web浏览器访问失败,因为Blob不是公有的。
但是,我们可以使URL也包括访问密钥,以允许经过授权的客户端访问Blob吗?


1
阅读此链接:https://learn.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1它描述了使用令牌允许客户访问的方法。 - kkirk
1
@kkirk 是的,我也在想这个问题,但似乎不太适用: “当您想要向未拥有存储帐户访问密钥的任何客户提供对存储帐户中资源的访问权限时,可以使用SAS” - 我拥有访问密钥。 - ATV
1
如果您拥有访问密钥,则必须使用它生成SAS令牌,然后使用SAS令牌自己访问文件。有很多库可以为您完成大部分繁重的工作。 - juunas
1
在这种情况下,您可以简单地使用以下链接:https://learn.microsoft.com/en-us/azure/storage/blobs/storage-dotnet-how-to-use-blobs。 但是,这里有一些安全考虑。如果您愿意将存储帐户访问密钥分发给所有客户(例如,您的程序供公司内部使用),那么这是一种方法。 如果您不想这样做,您应该在您的 Blob 存储和客户之间创建一个服务,实现您需要的任何安全性。 - kkirk
1
如果您正在构建本地应用程序,则在程序中嵌入存储访问密钥有点危险。拥有正确工具的人可以找到它,然后对您的存储帐户进行任何操作。考虑到这一点,Valet Key模式经常在此处使用,其中您的应用程序后端对用户请求进行身份验证和授权,然后返回包含临时SAS令牌的URL,客户端可以使用该令牌。 - juunas
显示剩余4条评论
3个回答

12

您可以为私有Blob生成SAS URL和令牌。以下是在Azure门户中手动生成此内容的过程,以测试概念。即使您的存储容器是私有的,它也会使用包含令牌的URL提供临时的、时间限制的文件访问权限。

在存储容器中单击文件,选择“生成SAS”选项卡,在右侧窗格中选择enter image description here

这将生成一个令牌和一个包含该令牌的URL,如下所示:

enter image description here

您可以通过使用curl来测试将URL下载为文件。使用上面图像中显示的第二个URL(包含查询字符串中的完整令牌和其他参数),然后执行以下操作(重要提示:URL必须用双引号括起来):

curl "<YOUR_URL>" --output myFileName.txt

提示 - 这也是将文件提供给Azure VM的好方法,如果您出于任何原因需要直接在VM上安装文件(我需要这样做来安装SSL证书),您可以生成URL然后使用curl在VM本身上下载文件。例如,首先使用Bastion或SSH连接到VM,然后使用curl将文件下载到某个地方。


7
这是关于从存储中读取Blob的API:

https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob

没有URL参数可以传递访问密钥,只有头部值Authorization。因此,您可以手动进行请求,并将结果数据作为base64编码的图像添加。如果可能的话,我建议不要这样做。
您还必须意识到,通过将您的访问密钥传递给客户端,您实际上已经使您的Blob公开了。与匿名访问相比,您将使您的数据面临更大的风险,因为访问密钥允许执行更多操作。即使是在您的objective-c应用程序中,这也是正确的,尽管在那里它更加模糊不清。SAS是其中的一种选择-创建一个后端服务,为给定资源创建一组定义的SAS令牌。但是,这比简单地在某个地方混淆完整的访问密钥要花费更多的精力。
请参见“匿名用户可用的功能”:

https://learn.microsoft.com/en-us/azure/storage/blobs/storage-manage-access-to-resources


谢谢回复。使用https与Azure存储通信应该可以减轻风险,对吗..? - ATV
它只会保护您设备和服务器之间的通信。例如,如果您查看Chrome的开发人员控制台,还可以看到https调用及其标头。此外,如果URL是某些HTML的一部分,则可以通过查看页面源代码来查看它。 - Alex AIT
好的,我可以从Chrome中看到它,因为作为客户端,这是我的自己的通信。第三方不能。将其存储在HTML中并不明智,我同意 - URL将以混淆的方式存储在我们应用程序的二进制文件中。 - ATV
没问题,只是想指出应用程序本身可能会被攻击/反编译/... 。可能不值得做比你描述的更多的事情,但我想确保你知道。如果您创建一个后端服务来生成在客户端上使用的SAS令牌,则可以100%安全地防止客户端获得完全访问存储的权限,因为您的服务只能生成一组定义的令牌。但这需要比简单地在某个地方混淆完全访问密钥要花费更多的努力。 - Alex AIT

0
扩展@Chris Halcrow的观点。
我不得不在我的URL中添加了一些额外的参数(*),例如ss=bfqt&srt=sco
(*) 注意,SAS不是一个“键”,而是一组查询参数。 然后:
curl -X GET -H "x-ms-date: $(date -u)" "https://<ACCOUNT>.blob.core.windows.net/<PATH>/<FILENAME>?<SIGNATURE>"

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