安全的 django 文件权限

Posted

技术标签:

【中文标题】安全的 django 文件权限【英文标题】:secure django file permissions 【发布时间】:2013-04-30 18:13:31 【问题描述】:

我正在寻找一组基线文件权限,以确保 django 安装尽可能安全。

我似乎在 Django 网站或 Google 上都找不到任何明显的参考资料。

任何链接或线索?

我使用 Apache + mod_wsgi + django。我没有上传目录的权限。这是一个非常基本的设置。

我目前正在成功运行我的代码:

/var/www/djangodir 
                  /django
                  /3rdpartyapp
                  /myapp
                        /serverfiles/my.wsgi

all directorys:   755 owned by root.root
all files:        644 owned by root.root

exceptions to all files
-----------------------
settings.py file: 400  owned by apache.apache
my.wsgi:          400  owned by apache.apache

我不喜欢所有文件上的 644,我想加强它,但似乎无法摆脱 400 或 500。如果我这样做,wsgi 应用程序无法从 django 导入任何内容。

救命!

【问题讨论】:

【参考方案1】:

使用 mod_wsgi 守护程序模式并让您的 Django 应用程序在其中运行。将该守护进程组的用户/组设置为不同于 Apache 用户的特殊专用 Django 应用程序用户。让您使用的 WSGI 脚本文件位于 Django 项目区域之外。

如果 Apache 用户拥有,则包含 WSGI 脚本文件的目录可以是 700。其中的 WSGI 脚本文件只需要 400 个,甚至不需要为 Apache 用户所有,但可以由 root 或专用 Django 应用程序用户所有。 Apache 用户所需要的只是能够查看目录中的 WSGI 脚本文件,而不需要打开 WSGI 脚本文件的能力。

然后,您的所有项目代码和虚拟环境都可以位于专用 Django 用户拥有的目录结构中,所有目录均为 0700,并且文件可根据您认为合适或需要进行读取/写入。只有专用的 Django 应用程序用户需要访问权限,因为所有访问权限都来自以该用户身份运行的守护进程组。

通过这种方式,您的访问权限受到限制,因此 Apache 用户甚至无法看到您的项目代码。这样,如果在同一个 Apache 上托管其他东西,例如 php,就不会有闯入 PHP 代码访问文件的风险。

【讨论】:

就像下面的@Zed Reisender,如果目录是模式 755,我只能让包含 wsgi.py 脚本的目录工作。这让我怀疑守护进程实际上是作为专用 wsgi 运行的我使用 'user=' 属性设置的用户。你如何检查它实际使用的是哪个用户?是否还需要 WSGIAuthUserScript? 修改我上面的评论,守护进程作为我的自定义 wsgi 用户运行(没有在 wsgi 或 apache 配置中的任何地方定义密码)。我知道这一点,因为 wsgi.py 脚本上的模式 400 仅在该用户是所有者时才有效。但我留下了评论,因为这掩盖了 Graham 的指示,即脚本文件“可以由 root 或专用 Django 应用程序用户拥有”,让我相信我不完全理解他在说什么。【参考方案2】:

感谢您的精彩回复!我不知道你是如何找到时间来回答这些年来我看到你的指纹的所有问题,但你正在为整个 python/django/wsgi 社区提供巨大的服务。我喜欢您的博客文章:http://blog.dscpl.com.au2012 年 12 月 5 日关于这些论坛上好的建议和善意的稀释。在谷歌上搜索所有的废话绝对是一个挑战。

无论如何,对于任何观看此线程的人来说,这都有效。

root.root:              755 /var/saas                   <- topdir
apache.apache:          755 /var/saas/wsgi              <- apache folder
vsn.vsn:                400 /var/saas/wsgi/vsn.wsgi     <- wsgi file
vsn.vsn:                700 /var/saas/vsn               <- django code
root.root:              700 /var/saas/scripts           <- operations scripts
root.root:              700 /var/saas/config            <- temp config folder
apache.apache           444 /var/www/html/static        <- destination of django's: python ./manage.py collectstatic

我无法让它在 apache 权限 700 下工作,但我对 755 很满意。我猜这是 apache 未解之谜之一。

【讨论】:

以上是关于安全的 django 文件权限的主要内容,如果未能解决你的问题,请参考以下文章

Nginx/Django 文件上传权限

使用 uwsgi 的 Django 日志文件权限

更改 Apache 的文件权限 - Django

权限被拒绝 django 静态文件

共享文件夹的共享权限和NTFS安全权限有啥区别?哪个权限比较大?用户两个权限都要设置吗?

权限被拒绝,无法打开静态文件,Docker,Django