我有一个应用程序,用户可以上传他们的文档(比如说一些文档是敏感文档,比如身份证明)。我的s3 bucket结构是这样的:每个用户都有自己的文件夹,在其中保存他/她的文档。应用程序在平均堆栈上运行。到目前为止,这个桶是公开的(敏感文档上传是未来的补充)。我希望登录用户只能访问他/她的文档。此外,还应保护文档url(预签名url(可能)对于上述要求,我应该采取什么方法?有代码资源/文档等吗。。?
gzszwxb41#
您不应该使用任何bucket策略。存储桶应保持“私有”,并应通过以下两种方式之一授予最终用户访问权限:选项1:提供临时aws凭证如果有“智能”客户端(如浏览器中的移动应用程序或javascript),您的后端可以使用aws安全令牌服务生成临时凭据。然后,客户机可以使用这些凭证直接与aws服务进行通信,例如访问AmazonS3中的对象和在dynamodb中读取/写入数据。后端负责对用户进行身份验证,生成临时凭证并将其传递给客户端,但不参与对aws的后续调用。可以将策略附加到这些临时凭据以授予权限,例如“允许此amazon s3 bucket的此特定子目录(路径)中的getobject”。如果每个用户的策略只授予对“其子目录”的访问权限,则这符合您的要求,即他们只能访问其特定文档。实现上述功能的一种常见方法是使用AmazonCognito进行身份验证和分配权限。选项2:使用预签名URL在客户端是不直接使用aws凭据调用aws服务的简单网页的情况下,安全性在后端使用预先签名的URL进行处理。当后端生成链接到私有对象的网页时(例如通过 <img src='...'> ),后端应:验证用户是否有权访问私有对象生成AmazonS3预签名url,这是一个有时间限制的url,提供对私有对象的临时访问将该url插入html页面,或作为链接提供(如pdf)当用户的浏览器使用url从s3请求对象时,s3服务将验证签名,以确认用户有权访问私有对象,并且到期时间尚未过去如果签名被确认,s3将传回私有对象此方法使后端完全控制用户可以访问s3中的哪些对象。它可以在数据库中维护此列表,也可以依赖对象的路径来确定此访问。这甚至可以扩展到允许用户之间共享对象。例如,设想一个照片共享应用程序,其中一个用户希望与另一个用户共享一张照片。他们可以通过ui来指示这一点,后端可以将其存储在数据库中。稍后,当用户想要查看共享照片时,后端将检查数据库以确认其权限,然后生成预签名url以查看共享对象,即使该对象位于不同的路径中。
<img src='...'>
1条答案
按热度按时间gzszwxb41#
您不应该使用任何bucket策略。存储桶应保持“私有”,并应通过以下两种方式之一授予最终用户访问权限:
选项1:提供临时aws凭证
如果有“智能”客户端(如浏览器中的移动应用程序或javascript),您的后端可以使用aws安全令牌服务生成临时凭据。然后,客户机可以使用这些凭证直接与aws服务进行通信,例如访问AmazonS3中的对象和在dynamodb中读取/写入数据。
后端负责对用户进行身份验证,生成临时凭证并将其传递给客户端,但不参与对aws的后续调用。可以将策略附加到这些临时凭据以授予权限,例如“允许此amazon s3 bucket的此特定子目录(路径)中的getobject”。
如果每个用户的策略只授予对“其子目录”的访问权限,则这符合您的要求,即他们只能访问其特定文档。
实现上述功能的一种常见方法是使用AmazonCognito进行身份验证和分配权限。
选项2:使用预签名URL
在客户端是不直接使用aws凭据调用aws服务的简单网页的情况下,安全性在后端使用预先签名的URL进行处理。
当后端生成链接到私有对象的网页时(例如通过
<img src='...'>
),后端应:验证用户是否有权访问私有对象
生成AmazonS3预签名url,这是一个有时间限制的url,提供对私有对象的临时访问
将该url插入html页面,或作为链接提供(如pdf)
当用户的浏览器使用url从s3请求对象时,s3服务将验证签名,以确认用户有权访问私有对象,并且到期时间尚未过去
如果签名被确认,s3将传回私有对象
此方法使后端完全控制用户可以访问s3中的哪些对象。它可以在数据库中维护此列表,也可以依赖对象的路径来确定此访问。这甚至可以扩展到允许用户之间共享对象。例如,设想一个照片共享应用程序,其中一个用户希望与另一个用户共享一张照片。他们可以通过ui来指示这一点,后端可以将其存储在数据库中。稍后,当用户想要查看共享照片时,后端将检查数据库以确认其权限,然后生成预签名url以查看共享对象,即使该对象位于不同的路径中。