如何正确保护S3存储桶中的私有数据

时间:2016-08-07 14:55:06

标签: php security amazon-web-services amazon-s3

我有一个应用程序,我在那里存储用户'图像和音频。我们使用S3进行存储,并且我希望确保我们存储的用户数据既安全又不能被外界完全访问。

这是我到目前为止所想到的。

  1. 使用有效期限的预签名网址,以便在网页加载后浏览器中的网址无法使用。
  2. 将我的存储桶内容配置为只能通过域访问 - 不确定这是否会影响用户下载其内容的能力。
  3. 我有以下问题:

    1. 使用CloudFront提供文件是否充当安全层,因为浏览器中的网址实际上不是来自s3?
    2. 如果在URL中看到存储桶名称和结构(如果在浏览器中查看页面源),那么在安全方面是不是很糟糕?
    3. 是否可以将s3配置为使用存储桶的别名,以便我可以通过不同的URL访问相同的内容,从而不公开存储桶名称?
    4. 确保正确的文件安全性同时允许用户轻松访问其内容的最佳方法是什么?
    5. 提前致谢!

2 个答案:

答案 0 :(得分:3)

  

使用寿命有限的预签名网址,以便在网页加载后浏览器中的网址无法使用。

从安全性和实用性的角度来看,这或者非常类似的东西可以说是最好的策略。您的网站在页面加载时生成URL ...或者......链接实际指向您的服务器。单击时,您的服务器会验证会话/授权并根据需要签署URL,并在那里向浏览器发送临时重定向。

HTTP/1.1 302 Found
Location: https://example-bucket.s3...
Cache-Control: private, no-cache, no-store
  

将我的存储桶内容配置为只能通过域访问 - 不确定这是否会影响用户下载其内容的能力。

这是一种非常原始的策略,容易被击败。如果您尝试停止热链接到您的内容,这没关系,但它并不符合“安全”标准。测量

  

使用CloudFront提供文件是否充当安全层,因为浏览器中的网址实际上不是来自s3?

嗯,不是真的。浏览器中直接指向S3的URL实际上没有安全隐患。见下文。

  

如果在URL中看到存储桶名称和结构(如果在浏览器中查看页面源),那么安全性是否错误?

如果您正确保护内容,则不会。例如,我有一个网站,其中用户" department_id"在可下载的文件的路径中清晰可见,该文件可用于签名的S3 URL。如果用户认识到该号码尝试递增或递减该号码以查看来自其他部门的报告,则无关紧要,因为他们没有该另一个文件的signes URL。签名URL是防篡改到计算不可行的地方 - 也就是说,您无法在签名URL中更改任何而不会使其失效,并且您无法对签名的URL进行逆向工程以达到您的目的能够有足够的信息在宇宙热死之前签署不同对象的URL。当然,如果内容可以公开访问,那么在URL中嵌入明显/可猜测值的结构将是一种可怕的做法。

  

是否可以将s3配置为使用存储桶的别名,以便我可以通过不同的URL访问相同的内容,从而不公开存储桶名称?

知道存储桶名称并不能为您提供任何特别有用的信息。在安全配置中,知道存储桶的名称并不重要。在某些情况下,S3错误消息或响应标头实际上可能会显示存储桶的名称或位置,因此这不一定总是可以预防的。 CloudFront URL会隐藏存储桶名称,但这并不能为您提供任何有意义的保护,因为存储桶名称不是敏感的信息。

  

确保正确的文件安全性同时允许用户轻松访问其内容的最佳方法是什么?

如上所述 - 使用签名网址。

CloudFront提供了一些与S3不同的附加功能。

首先,请注意,当一个存储桶位于CloudFront后面时,CloudFront可以使用自己的凭据(原始访问标识)来签署其认为已授权的请求,以便S3允许CloudFront代表请求者,并提供内容。

然后,您可以使用CloudFront预签名URL,该URL使用与S3签名URL不同的算法。两个值得注意的差异:

  • 与S3签名的URL不同,CloudFront签名的URL可以允许请求者访问多个单个对象,例如,您可以允许访问https://dxxxexample.cloudfront.net/user_files/${user_id}/*(其中${user_id}是包含用户ID的变量,在签名URL之前将其替换为字符串)。这可能是您可以做的优化,允许您的代码生成签名URL的查询字符串部分,您可以在构建页面的过程中重复使用,以避免CPU负载按顺序单独签署许多URL渲染单页。

  • 与S3签名URL不同,CloudFront签名URL可选地允许您包含用户的IP地址,使签名仅可从该单个IP地址使用。您需要在使用站点时平衡这种额外的安全性与用户IP地址变化的可能性,因为这种情况在台式机上的可能性较小,而且更可能在移动设备上(特别是如果从移动数据自动切换到WiFi)。

CloudFront还支持签名网址的相同授权功能,但使用的是Cookie。如果您的整个站点都通过CloudFront运行,那么这可能是您需要考虑的有用选项。您的整个站点可以通过指向主要主机名,然后配置多个源服务器(S3存储桶和应用服务器本身)来运行CloudFront,然后使用路径模式配置缓存行为,以选择将哪些路径发送到哪个源

签名网址是您要完成的工作的关键。

当然,与任何安全机制一样,重要的是不仅要验证它是否按预期工作,而且还要确保它不会工作"当它不应该 - 也就是说,确保您验证您的安全资源不可公开访问没有签名的URL。如果您的存储桶策略或CloudFront分配配置错误以允许公共访问,或者您错误地使用x-amz-acl: public-read将安全内容上传到S3,那么您当然已经打败了自己的安全措施。这些服务假设您知道自己在做什么,因此这些配置在技术上是有效的。不要在不了解其含义的情况下盲目地遵循配置或故障排除建议。

答案 1 :(得分:0)

  

使用CloudFront提供文件是否充当安全层   因为浏览器中的url实际上不是来自s3?

您不能将其视为安全层,但它不会公开S3存储桶URL,因为云端服务于S3对象的缓存内容。如果您使用签名URL进行云前端,则会增加安全性。

  

如果桶名称和结构可见,那么在安全方面是不是很糟糕   在URL中(如果在浏览器中查看页面源)?

如果所提供的内容对所有人公开,则公开S3存储桶URL并不错。您只需要注意应用正确的策略,即不要让put对象访问桶对世界开放。

  

是否可以将s3配置为使用存储桶的别名   我可以通过不同的URL访问相同的内容,因此不能   暴露存储桶名称?

是的,这是可能的。查看此AWS文档https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html#VirtualHostingCustomURLs

  

同时确保正确文件安全性的最佳方法是什么?   允许用户轻松访问他们的内容?

使用适当的IAM策略以及对S3内容的用户细粒度访问可确保正确的安全性。