用于访问 Azure 存储中的私有 blob 的 URL

Posted

技术标签:

【中文标题】用于访问 Azure 存储中的私有 blob 的 URL【英文标题】:URL to access private blob in Azure Storage 【发布时间】:2018-04-15 21:38:34 【问题描述】:

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

有没有办法使用包含访问密钥的 URL 来处理 Azure 存储中的私有 blob?

筛选 MS 文档到目前为止,我只能找到通过 blob URI 进行的简单 URL 访问,例如在通过 .net API 列出 blob 时,由 CloudBlockBlob 实例的 URI 属性给出。

由于 blob 不是公开的,因此从 Web 浏览器自然访问它会失败。 但是,我们是否可以限定 URL 以包含访问密钥以允许授权客户端访问 blob..?

【问题讨论】:

阅读这个:docs.microsoft.com/en-us/azure/storage/common/… 它描述了使用令牌来允许访问客户端。 @kkirk 是的,我想知道这一点,但它似乎不太适用:“当您想向任何人提供对存储帐户中资源的访问权限时,您可以使用 SAS客户端不拥有您的存储帐户的访问密钥” - 我确实拥有访问密钥。 如果您拥有访问密钥,那么您必须使用它生成一个 SAS 令牌,然后使用 SAS 令牌自己访问该文件。有图书馆可以为您完成很多繁重的工作。 在这种情况下,您可以简单地使用:docs.microsoft.com/en-us/azure/storage/blobs/…。不过这里有安全方面的考虑。如果您可以将存储帐户访问密钥分发给所有客户端(例如,您的程序供公司内部使用),那么这是一种可行的方法。如果你不是,你可能应该在你的 blob 存储和客户端之间创建一个服务,它实现你需要的任何安全性。 @juunas ..在查看了 github 上的 SDK(客户端将是 Objective-C,而不是 C#)之后,使用该库访问 Azure 存储似乎不会那么麻烦。感谢您的意见! 【参考方案1】:

这是用于从存储中读取 blob 的 API:

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

没有 URL-Parameter 来传递访问密钥,只有标头值 Authorization。因此,您可以手动执行请求,例如将结果数据添加为 base64 编码图像。如果可能的话,我会建议不要这样做。

您还必须意识到,通过将您的访问密钥传递给客户端,您实际上是在将您的 blob 公开。与匿名访问相比,您将数据置于更大的风险中,因为访问密钥允许比匿名访问更多的操作。这也适用于您的objective-c 应用程序,即使它在那里更加模糊。 SAS 是通往那里的道路 - 创建一个后端服务,为给定资源创建一组定义的 SAS 令牌。然而,这比简单地在某处混淆完整的访问密钥要付出更多的努力。

请参阅“匿名用户可用的功能”:

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

【讨论】:

感谢您的回复。然而,使用 https 与 Azure 存储通信应该可以降低风险,对吧..? 它只会保护您的设备和服务器之间的通信。例如。如果您查看 chrome 的开发者控制台,您还可以看到 https 调用及其标头。此外,如果 URL 是某些 html 的一部分,则可以通过查看页面源来查看它。 嗯,我可以从 Chrome 中看到它,因为作为客户端,它是我自己的通信。第三者不能。我同意,以 HTML 格式存储是不明智的 - URL 将以模糊的方式存储在我们应用程序的二进制文件中。 那很好,只是想指出应用程序本身可能会受到攻击/反编译/......它可能不值得付出比你描述的更多的努力,但我想确保你知道的。如果您创建一个后端服务来生成在客户端上使用的 SAS 令牌,那么您可以 100% 确保客户端永远无法完全访问存储,因为您的服务只能生成一组定义的令牌。然而,这比简单地在某处混淆完整的访问密钥要付出更多的努力。【参考方案2】:

您可以为私有 blob 生成 SAS URL 和令牌。这是在 Azure 门户中手动生成此概念的过程,以测试该概念。即使您的存储容器是私有的,它也可以工作,因为它允许使用在其查询字符串中包含令牌的 URL 对文件进行临时的、时间限制的访问。

单击存储容器中的文件,选择“生成 SAS”选项卡,然后在右侧窗格中选择

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

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

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

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

【讨论】:

以上是关于用于访问 Azure 存储中的私有 blob 的 URL的主要内容,如果未能解决你的问题,请参考以下文章

用于访问 Azure Blob 存储的连接字符串和 StorageCredentials 有啥区别?

是否可以在私有天蓝色存储容器中有一个公共 blob

如何保护 Azure Key Vault 中的 blob 存储访问密钥

由于授权标头,Azure Blob 存储 403 身份验证失败

试图从 azure blob 下载 word 文档

Azure 存储模拟器访问 Blob 时出错