【发布时间】:2019-08-11 16:07:13
【问题描述】:
问题:假设用户上传了高度机密的信息。这被放置在第三方存储服务器中。此第三方存储桶对 Web 应用程序使用不同的身份验证系统。确保只有用户或管理员才能访问文件 url 的最佳做法是什么?
更多上下文: Django Web 应用程序在 Google App Engine Flexible 上运行。 Google Storage 用于通过 Django 提供静态和媒体文件。高度机密的信息是护照、法律合同等。
静态文件以相当不安全的方式提供。 /static/ 存储桶是公共的,文件通过 django 的静态文件系统提供。这是因为
- 我们的任何静态文件中都没有机密或用户信息
文件,仅库存图片、css 和 javascript,以及 - 文件在生产前被 uglified 和 minifed。
但是对于媒体文件,我们需要用户特定的权限,如果用户A上传了一张图片,那么用户A可以查看它,工作人员可以查看它,但是用户B和未经身份验证的用户在任何情况下都不能查看它。这包括他们是否有网址。
我的首选系统是,GCP 存储可以使用相同的 django 身份验证服务器,因此当浏览器请求 ...google.storage..../media/user_1/verification/passport.png 时,我们可以检查此用户拥有哪些权限,将其与上传的用户 ID 进行比较,并决定是否显示 403 或实际文件。
此问题的行业标准/最佳实践解决方案是什么?
我是否让这两个存储桶只能由应用程序访问,使用服务帐户,并确保只有在正确的用户正在查看页面时才在内部共享链接? (任何人代表静态,{user or staff} 代表媒体?)
我的问题,特别是(关于网络应用程序安全性):
- 从公开可读的存储桶中提供静态文件是否安全?
- 是否可以假设如果我的应用程序请求文件 url,它来自经过身份验证的用户?
- 特别是关于 Django 和 GCP 存储,如果 2 为假(我相信是),我如何确保从存储桶提供的文件是 只有拥有正确权限的用户才能看到?
【问题讨论】:
-
这是一个非常广泛的问题,听起来你是在征求人们的意见。你能把它缩小到一个可以或多或少客观地回答的具体问题吗?
-
我希望在广泛的问题之后使用上下文会降低范围。我将尝试对其进行编辑以降低范围。
-
您的
GCP Storage是否可以通过 URL 直接访问,或者您是否可以控制它 - 这意味着它只是您代理背后的存储空间?我们使用 X-Accel 从 nginx 传递 Django 的 /media 内容,存储在我们的案例中 Azure 存储中。如果这是您正在寻找的,我可以添加一个答案。见nginx.com/resources/wiki/start/topics/examples/x-accel
标签: django google-app-engine google-cloud-platform google-cloud-storage media