Web应用程序在提供机密媒体文件时应如何确保安全性?

问题描述 投票:0回答:2

问题:假设用户上传高度机密的信息。它位于第三方存储服务器中。此第三方存储桶对Web应用程序使用不同的身份验证系统。确保只有用户或管理员可以访问文件URL的最佳做法是什么?

更多上下文:Django Web应用程序正在Google App Engine Flexible上运行。 Google Storage用于通过Django提供静态和媒体文件。高度机密的信息是护照,法律合同等。

静态文件以相当不安全的方式提供。 /static/存储桶是公共的,文件通过django的静态文件系统提供。这是因为

  • 我们的任何静态信息都没有机密或用户信息 文件,只有库存图片,CSS和JavaScript,以及
  • 生产前文件是uglify和minify。

但是对于媒体文件,我们需要用户特定的权限,如果用户A上传图像,则用户A可以查看它,工作人员可以查看它,但用户B和未经身份验证的用户在任何情况下都无法查看它。这包括他们是否有网址。

我的首选系统是,GCP存储可以使用相同的django认证服务器,因此当浏览器请求...google.storage..../media/user_1/verification/passport.png时,我们可以检查该用户具有哪些权限,将其与上传的用户ID进行比较,并决定是否显示403或实际的文件。

针对此问题的行业标准/最佳实践解决方案是什么?

我是否只允许应用程序使用服务帐户访问这两个存储桶,并在内部确保仅在正确的用户正在查看页面时才共享链接? (静电的任何人,媒体的{用户或员工}?)

我的问题,特别是(关于Web应用程序安全性):

  1. 从公共可读存储桶提供静态文件是否安全?
  2. 是否可以假设如果我的应用程序请求文件URL,这是来自经过身份验证的用户?
  3. 特别是关于Django和GCP存储,如果2是假的(我相信它是),我如何确保从桶中提供的文件仅对具有正确权限的用户可见?
django google-app-engine google-cloud-platform google-cloud-storage media
2个回答
1
投票
  1. 是的。 Public readable buckets就是为此而制造的。诸如CSS,您公司的徽标或一些没有合理数据的文件都可以安全地共享。

当然,不要使用相同的公共存储桶来存储私有/公共资源。公共公共,私人私有。


  1. 这是问题所在。当您说“经过身份验证的用户”时,您希望该用户对其进行身份验证?

例如,如果您使用任何Django methods对您的用户进行身份验证,那么该用户将通过Django身份验证,但对于云存储,它将是一个陌生人。此外,即使是在GCP上授权的用户也可能无权获得云存储上的存储桶。

这里重要的是与云存储来回通信的不是用户,它的Django。它可以通过使用python SDK of Cloud Storage来实现这一点,service account获取实例上使用的服务帐户的凭据来验证对云存储的任何请求。因此,运行VM的signed urls(因为您处于灵活状态)是应该授权给云存储的。


  1. 您必须首先在Django上授权用户,然后检查用户是否能够通过其他方式访问此文件(例如,将他上传的文件的名称存储在user_uploaded_files表中)。

关于您在帖子顶部的第一个问题,云存储可以让您创建django-storages[google]。此网址允许互联网上的任何人只需按住网址即可从云存储上传/下载文件。因此,您只需要授权Django上的用户获取已签名的URL,就是这样。他不需要在云存储上“授权”(因为网址已经存在)

取自之前链接的文档:

什么时候应该使用签名的URL?

在某些情况下,您可能不希望要求您的用户拥有Google帐户才能访问云端存储,但您仍希望使用特定于应用程序的逻辑来控制访问权限。解决此用例的典型方法是向用户提供签名URL,该URL允许用户在有限时间内对该资源进行读取,写入或删除访问。知道URL的任何人都可以访问资源,直到URL过期。您可以在要签名的查询字符串中指定到期时间。


0
投票

继Nahuel Varela的回答之后:

我的系统现在由4个桶组成:

  • 静态的
  • 媒体
  • 静态分期
  • 媒体分期

两个静态存储桶都是公共存储的,并且只有项目中创建的应用引擎服务帐户才能访问媒体存储桶。 (dev / test的设置不同)

我正在使用@elnygrens modificationwith url。我修改了这个以删除媒体的qazxswpoi方法(以便我们创建签名的URL)但保持静态(以便我们访问静态文件的公共URL)。

每个文件访问的身份验证都在Django中完成,如果用户通过了测试(is_staff或id匹配文件ID),那么他们可以在给定的时间内(目前为1小时)访问该文件,页面加载等时刷新

跟进问题:这个时间限制的最佳做法是什么,我听说人们可以在15分钟到24小时之间使用?

© www.soinside.com 2019 - 2024. All rights reserved.