Linux用户权限运行Web应用程序的最佳实践是什么?

10
我在网上看到很多不同的建议,关于web应用程序应该从哪里服务,以什么用户身份运行等。
例如,我曾经看到过它从/var/www/site、/srv/www/site、/home/$USER/site中提供服务。
我曾经见过的用户是www-data,$USER(即我的用户帐户),或者是专门为此目的创建的自定义用户(如用户uwsgi)。
就安全性而言,我可以选择什么样的最佳方案?
作为参考,我正在尝试使用Nginx和uwsgi部署Django网站。
目前,uwsgi以emperor模式作为root运行,uid/gid设置为www-data,因此vassals生成与Nginx工作进程具有相同的权限。我正在/home中服务,但考虑进行移动。
1个回答

8

对于位置,请选择最适合您的位置。以下是一些考虑因素:

  • /var下的位置用于文件大小变化或通常为“可变”文件。
  • /srv通常表示与机器上运行的某些服务相关的文件。
  • /home通常应保留给交互式用户。但是,您可以将系统用户的主目录设置为任何内容。

为了安全起见,您应尽可能分隔。应用程序不应该以与Web服务器相同的用户身份运行,以便不能被滥用来读取与服务器本身相关的敏感文件(.htaccess或其他文件)。应用程序的二进制文件(或对于Django,Python源代码)应由root所有,应用程序用户无写访问权限。

这是我关于如何设置它的建议:

  • Django应用程序:如果已安装,则位于/usr/lib/python/site-packages/appname//usr/lib/appname/。由root拥有,chmod 644。
  • 应用程序的文件(例如sqlite数据库文件,FastCGI的Unix套接字,上传的文件存储等):位于/var/lib/appname/。由应用程序用户拥有,chmod 600。
  • 应用程序用户的shell是/bin/nologin,home是/var/lib/appname/。用户没有配置密码。

如果我有一个 virtualenv,它会放在 /var/lib/appname/venv 下面吗?并且,要明确一点,app-user 可以是例如 'uwsgi',但不是我通过 ssh 登录并具有 sudo 权限的用户。 - user1431368
就我个人而言,我的Python代码存放在/home目录下,这是因为Django教程中的一部分("代码应该存放在哪里?")。 - user1431368
是的,uwsgi 对于您的应用程序用户来说是一个不错的选择,除非您有多个应用程序在运行,这种情况下您可能需要每个应用程序都拥有不同的用户。该用户不应具有sudo或登录权限。正如教程所指出的那样,最重要的是不要将您的代码放在您的Web根目录下。 - bonsaiviking
我无法让它工作。我发现uwsgi需要在目录上具有执行权限才能导入Python模块,对SQLite文件具有rw权限,并且对SQLite所在的目录具有wx权限。最终,我让root拥有所有文件(除了Unix套接字),并使用具有读取权限的组来允许www-data和uwsgi读取它们所需的文件,从最严格的权限开始逐渐放宽,直到它实际上可以工作。这些建议让我有了一个好的开端。谢谢! - user1431368

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接