我的服务器运行CentOS:Nginx + PHP-FPM(PHP通过Fast-CGI)。 每个站点都是独立的VirtualHost。
目前Nginx和PHP-FPM都是在root下运行的。 我知道这是不好的做法,没有理由让任何网站有权访问自己的目录之外的文件。
我将如何去创build监狱用户并指示nginx && php-fpm相应地播放?
好的,你正在使用一种奇怪的设置,但一般来说:
首先,linux不支持真正的(bsd样式)jail(除非你安装openvz或vserver),但是把所有东西都作为非特权用户运行,chroots可以非常严格地提高安全性。 以非root用户身份运行是非常重要的,chroots只是一个(可以说是相当大的)可能成为攻击者的绊脚石)。
根据php-fpm站点,通过configuration命令支持chroot。 当然,php-fpm有类似的文档,如果你通过源代码tarball,你可能会发现一些文档,或者至less是一个configuration示例。 http://php-fpm.org/about/说,设置用户,组和chroot是可能的。 我从来没有使用php-fpm,但它应该是相当常见的。
要让nginx以非root用户身份运行,打开nginxconfiguration文件,find以“user”开头的行,并将其更改为系统上的非特权用户。 用nologin创build一个新的用户作为shell或使用nobody用户。
那么chroot守护进程的过程基本如下:
- 为特定的守护进程的根目录创build一个目录
- 在chroot目录下创build一个骨架目录结构(如./etc,./usr/lib等)
- 复制任何需要的二进制文件和configuration文件(所以nginx.conf,nginx二进制文件,你需要的任何帮助程序)
- 复制chroot中需要的其他文件。 这将是至less一个/ etc / password文件的存根(不是影子密码文件,只需要一个查找用户名到uid的方法),/ etc / group文件和/ etc / localtime(php会抱怨无休止的,如果你没有时区信息)。
- 最后,在复制的二进制文件上运行ldd。 这会给你一个要复制的库列表。 遍历这个列表,并将需要的共享对象复制到chrooted目录中的相应位置。 尝试保留符号链接,或将原始文件复制到之前存在符号链接的位置。
- 使用mknod创build任何需要的设备。 如果你不知道设备号,那么google(例如:/ dev / random是c 1 8,/ dev / null是c 2 2)
- 尽pipeconfiguration文件中的path应该保持不变,但偶尔需要调整。 当你手动对一个守护进程进行chroot时,configuration文件中的所有内容都应该忽略一部分path,一旦你被chrooted,那么/ var / log / somelogfile将保留在/ var / log / somelog文件中,尽pipe它是新的path实际上是/ chroot / nginx / var / log / somelogfile
请记住,任何可以通过configuration文件进行chroot的守护进程都不需要这些步骤 – 在相关的库依赖项和configuration文件加载后,将通过程序完成chroot。 这使得生活更简单。
一旦你这样做了,理论上你应该准备运行nginx(或其他任何东西)chrooted。 在nginx的/etc/init.d/脚本中,findnginx二进制文件实际运行的位置,并将其更改为使用chroot,例如:
$ DAEMON -c $ CONFIGFILE
变
/ usr / sbin / chroot / chroot / directory / $ DAEMON -c $ CONFIGFILE
然后你可以用你的init.d脚本正常启动nginx。 *如果你从chroot得到一个错误,例如“chroot:can not run command`/ bin / that / actually / exists':没有这样的文件或目录”,那么你错过了一些库或其他必需的东西。 任何导致二进制文件无法运行的东西都会导致这个错误(实际上,我的一个centos box说操作不允许)。
由于我没有足够的重点发布大量的链接,请检查www(dot)securityfocus(dot)com(斜线)infocus / 1694(保护apache一步一步) – 这是一个不同的http守护进程,它是至less就chroot而言,是相同的基本步骤。
另外请记住,在chroot文件夹中的文件权限需要注意 – 基本上只要nginx运行的用户可以在chroot中读取/处理您的文件,一切都会好起来的。
最后,作为chroot环境中需要什么types的东西的一个例子,下面是一个随机列表,其中包含了运行chroot的许多事情。 我使用mysql作为例子:
localhost!root:/# find /chroot/mysql /chroot/mysql /chroot/mysql/var /chroot/mysql/var/run /chroot/mysql/var/run/mysql.sock /chroot/mysql/var/run/mysqld.pid /chroot/mysql/var/log /chroot/mysql/etc /chroot/mysql/etc/my.cnf /chroot/mysql/etc/hosts /chroot/mysql/etc/host.conf /chroot/mysql/etc/resolv.conf /chroot/mysql/etc/group /chroot/mysql/etc/passwd /chroot/mysql/etc/my.cnf.orig /chroot/mysql/etc/nsswitch.conf /chroot/mysql/tmp /chroot/mysql/lib /chroot/mysql/lib/libtermcap.so.2 /chroot/mysql/lib/libdl.so.2 /chroot/mysql/lib/libc.so.6 /chroot/mysql/lib/librt.so.1 /chroot/mysql/lib/libpthread.so.0 /chroot/mysql/lib/libz.so.1 /chroot/mysql/lib/libcrypt.so.1 /chroot/mysql/lib/libnsl.so.1 /chroot/mysql/lib/libstdc++.so.6 /chroot/mysql/lib/libm.so.6 /chroot/mysql/lib/libgcc_s.so.1 /chroot/mysql/lib/ld-linux.so.2 /chroot/mysql/lib/libnss_compat.so.2 /chroot/mysql/lib/libnss_files.so.2 /chroot/mysql/lib/libnss_compat-2.3.6.so /chroot/mysql/lib/libnss_files-2.3.6.so /chroot/mysql/data /chroot/mysql/data/mysql /chroot/mysql/data/mysql/db.frm /chroot/mysql/data/mysql/db.MYI /chroot/mysql/data/mysql/db.MYD [further mysql tables have been omitted] /chroot/mysql/dev /chroot/mysql/dev/null /chroot/mysql/usr /chroot/mysql/usr/local /chroot/mysql/usr/local/libexec /chroot/mysql/usr/local/libexec/mysqld /chroot/mysql/usr/local/charsets /chroot/mysql/usr/local/charsets/README /chroot/mysql/usr/local/charsets/Index.xml /chroot/mysql/usr/local/charsets/armscii8.xml /chroot/mysql/usr/local/charsets/ascii.xml /chroot/mysql/usr/local/charsets/cp1250.xml /chroot/mysql/usr/local/charsets/cp1251.xml /chroot/mysql/usr/local/charsets/cp1256.xml /chroot/mysql/usr/local/charsets/cp1257.xml /chroot/mysql/usr/local/charsets/cp850.xml /chroot/mysql/usr/local/charsets/cp852.xml /chroot/mysql/usr/local/charsets/cp866.xml /chroot/mysql/usr/local/charsets/dec8.xml /chroot/mysql/usr/local/charsets/geostd8.xml /chroot/mysql/usr/local/charsets/greek.xml /chroot/mysql/usr/local/charsets/hebrew.xml /chroot/mysql/usr/local/charsets/hp8.xml /chroot/mysql/usr/local/charsets/keybcs2.xml /chroot/mysql/usr/local/charsets/koi8r.xml /chroot/mysql/usr/local/charsets/koi8u.xml /chroot/mysql/usr/local/charsets/latin1.xml /chroot/mysql/usr/local/charsets/latin2.xml /chroot/mysql/usr/local/charsets/latin5.xml /chroot/mysql/usr/local/charsets/latin7.xml /chroot/mysql/usr/local/charsets/macce.xml /chroot/mysql/usr/local/charsets/macroman.xml /chroot/mysql/usr/local/charsets/swe7.xml /chroot/mysql/usr/local/share /chroot/mysql/usr/local/share/mysql /chroot/mysql/usr/local/share/mysql/english /chroot/mysql/usr/local/share/mysql/english/errmsg.sys /chroot/mysql/bin /chroot/mysql/bin/test /chroot/mysql/bin/nohup
守护进程可以通过configuration文件进行chroot设置的一个例子是maradns:
localhost!root:/# find /chroot/maradns/ /chroot/maradns/ /chroot/maradns/logger /chroot/maradns/db.[removed] /chroot/maradns/db.[removed2] /chroot/maradns/db.[removed3]
正如你所看到的,maradns并不需要太多的chroot(实际上它只需要/ etc / mararc文件中的“chroot_dir =”/ chroot / maradns“)。
无论如何,这是一个长期和非常漫无目的的软件针对软件略有不同,你正在使用,但我希望这些信息仍然有用。
nginx需要root作为主进程绑定到80端口。 其工作进程然后运行在不同的用户(基于configuration)。
使chrooted的nginx和php-fpm好玩并不难 – 只要确保nginx有一个访问php-fpm的方法(使用tcp是最简单的),并确保它传递正确的path到php-fpm(相对于chrooted的php-当然是fpm)。
其他安全提示是正确设置文件权限。 以下是我如何做到的:
条件:
权限:
简而言之:
chown -R php:www /var/www/root find /var/www/root -type d -exec chmod 750 {} \; find /var/www/root -type f -exec chmod 640 {} \; find /var/www/root -type f -name '*.php' -exec chmod 600 {} \;
更好的权限可以给予,但这个应该很容易,不会破坏任何东西。