我的服务器运行 CentOS:Nginx + PHP-FPM(通过 Fast-CGI 的 PHP)。每个站点都在自己的 VirtualHost 上。
目前 Nginx 和 PHP-FPM 都在 root 下运行。我知道这是不好的做法,任何站点都没有理由访问自己目录之外的文件。
我将如何创建被监禁的用户并指示 nginx && php-fpm 相应地进行操作?
Som*_*erd 12
好的,您使用的是一种奇怪的设置,但一般来说:
首先,linux 不支持真正的(bsd 风格)监狱(除非您安装 openvz 或 vserver),但是将所有内容设置为以非特权用户 + chroot 身份运行可以非常显着地提高安全性。以非 root 用户身份运行是必不可少的,chroot 只是潜在攻击者的一个(可以说是相当大的)绊脚石)。
根据 php-fpm 站点,chrooting 是通过配置命令支持的。当然,php-fpm 也有类似的东西,没有文档……如果你翻阅源代码压缩包,你可能会找到一些文档,或者至少是一个示例配置。http://php-fpm.org/about/表示可以设置用户、组和 chroot。我从未使用过 php-fpm,但它应该是相当常识。
要让 nginx 以非 root 用户身份运行,请打开 nginx 配置文件,找到以“user”开头的行并将其更改为系统上的非特权用户。使用 nologin 作为 shell 创建一个新用户或使用 nobody 用户。
那么chroot任何守护进程的过程基本如下:
- 为特定守护进程的根创建一个目录
- 在chroot目录下创建一个骨架目录结构(比如./etc、./usr/lib等)
- 复制任何需要的二进制文件和配置文件(因此 nginx.conf、nginx 二进制文件、您需要的任何帮助程序)
- 复制 chroot 中所需的其他文件。这将至少是 /etc/password 文件的存根(不是影子密码文件,只需要一种方法来查找用户名到 uids)、/etc/group 文件和 /etc/localtime(php 会抱怨如果您没有时区信息,则无穷无尽)。
- 最后,在您复制的二进制文件上运行 ldd。这将为您提供要复制的库列表。浏览此列表,并将所需的共享对象复制到 chroot 目录中的等效位置。尝试保留符号链接,或将原始文件复制到先前存在符号链接的位置。
- 使用 mknod 创建任何需要的设备。如果您不知道设备编号,请使用谷歌搜索它们(例如:/dev/random 是 c 1 8,/dev/null 是 c 2 2)
- 虽然配置文件中的路径应该保持不变,但有时它们需要调整。当您手动 chroot 守护进程时,配置文件中的所有内容都应该忽略在您被 chroot 后将不可见的路径部分,例如 /var/log/somelogfile 将保留 /var/log/somelogfile 尽管它是新的路径实际上是 /chroot/nginx/var/log/somelogfile
请记住,任何可以通过配置文件 chroot 的守护进程都不需要这组步骤 - chroot 将由程序在加载相关库依赖项和配置文件后完成。这让生活变得更加简单。
一旦你这样做了,理论上你应该准备好运行 nginx(或其他任何东西)chrooted。在 nginx 的 /etc/init.d/ 脚本中,找到 nginx 二进制文件实际运行的位置,并将其更改为使用 chroot,例如:
$DAEMON -c $CONFIGFILE
变成
/usr/sbin/chroot /chroot/directory/这里 $DAEMON -c $CONFIGFILE
然后你可以用你的 init.d 脚本正常启动 nginx。*如果你从 chroot 得到一个错误,比如“chroot: cannot run command `/bin/that/actually/exists': No such file or directory”,那么你缺少一些库,或者其他重要的东西。任何导致二进制文件根本无法运行的东西都会导致该错误(实际上,我的一个 centos 盒子说不允许操作)。
由于我没有足够高的代表点来发布大量链接,请查看 www (dot) securityfocus (dot) com (slash) infocus/1694(逐步保护 apache) - 这是一个不同的 http 守护进程,它是相同的基本步骤,至少就 chroot 而言。
还要记住,您需要注意 chroot 文件夹中的文件权限 - 基本上只要运行 nginx 的用户可以读取/处理 chroot 中的文件,一切都会好起来的。
最后,作为在 chroot 环境中需要什么类型的东西的一个例子,这里有一个来自openwall box的随机文件列表,它运行着许多 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
Run Code Online (Sandbox Code Playgroud)
可以通过其配置文件 chroot 的守护进程设置示例是 maradns:
localhost!root:/# find /chroot/maradns/
/chroot/maradns/
/chroot/maradns/logger
/chroot/maradns/db.[removed]
/chroot/maradns/db.[removed2]
/chroot/maradns/db.[removed3]
Run Code Online (Sandbox Code Playgroud)
如您所见,maradns 不需要太多即可将其 chroot(实际上它只需要 /etc/mararc 文件中的“chroot_dir = "/chroot/maradns"。
无论如何,这是一篇冗长且极其杂乱的帖子,旨在针对与您使用的软件略有不同的软件,但我希望这些信息仍然有用。
归档时间: |
|
查看次数: |
6672 次 |
最近记录: |