问题:假设用户上传高度机密的信息。它位于第三方存储服务器中。此第三方存储桶对Web应用程序使用不同的身份验证系统。确保只有用户或管理员可以访问文件URL的最佳做法是什么?
更多上下文:Django Web应用程序正在Google App Engine Flexible上运行。 Google Storage用于通过Django提供静态和媒体文件。高度机密的信息是护照,法律合同等。
静态文件以相当不安全的方式提供。 /static/
存储桶是公共的,文件通过django的静态文件系统提供。这是因为
但是对于媒体文件,我们需要用户特定的权限,如果用户A上传图像,则用户A可以查看它,工作人员可以查看它,但用户B和未经身份验证的用户在任何情况下都无法查看它。这包括他们是否有网址。
我的首选系统是,GCP存储可以使用相同的django认证服务器,因此当浏览器请求...google.storage..../media/user_1/verification/passport.png
时,我们可以检查该用户具有哪些权限,将其与上传的用户ID进行比较,并决定是否显示403或实际的文件。
针对此问题的行业标准/最佳实践解决方案是什么?
我是否只允许应用程序使用服务帐户访问这两个存储桶,并在内部确保仅在正确的用户正在查看页面时才共享链接? (静电的任何人,媒体的{用户或员工}?)
我的问题,特别是(关于Web应用程序安全性):
当然,不要使用相同的公共存储桶来存储私有/公共资源。公共公共,私人私有。
例如,如果您使用任何Django methods对您的用户进行身份验证,那么该用户将通过Django身份验证,但对于云存储,它将是一个陌生人。此外,即使是在GCP上授权的用户也可能无权获得云存储上的存储桶。
这里重要的是与云存储来回通信的不是用户,它的Django。它可以通过使用python SDK of Cloud Storage来实现这一点,service account获取实例上使用的服务帐户的凭据来验证对云存储的任何请求。因此,运行VM的signed urls(因为您处于灵活状态)是应该授权给云存储的。
关于您在帖子顶部的第一个问题,云存储可以让您创建django-storages[google]
。此网址允许互联网上的任何人只需按住网址即可从云存储上传/下载文件。因此,您只需要授权Django上的用户获取已签名的URL,就是这样。他不需要在云存储上“授权”(因为网址已经存在)
取自之前链接的文档:
什么时候应该使用签名的URL?
在某些情况下,您可能不希望要求您的用户拥有Google帐户才能访问云端存储,但您仍希望使用特定于应用程序的逻辑来控制访问权限。解决此用例的典型方法是向用户提供签名URL,该URL允许用户在有限时间内对该资源进行读取,写入或删除访问。知道URL的任何人都可以访问资源,直到URL过期。您可以在要签名的查询字符串中指定到期时间。
继Nahuel Varela的回答之后:
我的系统现在由4个桶组成:
两个静态存储桶都是公共存储的,并且只有项目中创建的应用引擎服务帐户才能访问媒体存储桶。 (dev / test的设置不同)
我正在使用@elnygrens modificationwith url
。我修改了这个以删除媒体的qazxswpoi方法(以便我们创建签名的URL)但保持静态(以便我们访问静态文件的公共URL)。
每个文件访问的身份验证都在Django中完成,如果用户通过了测试(is_staff或id匹配文件ID),那么他们可以在给定的时间内(目前为1小时)访问该文件,页面加载等时刷新
跟进问题:这个时间限制的最佳做法是什么,我听说人们可以在15分钟到24小时之间使用?