Apache
的 chroot
环境
chroot
工具常用来限制一个守护进程在一个限制的目录树中.
您可以使用它使各个服务之间相互隔离. 这样软件的安全问题就不会影响到整个服务器.
当使用 makejail
脚本时, 设置, 和更新 chroot 目录树是非常简单的.
FIXME: Apache 还可以使用 http://www.modsecurity.org
进行chroot, 其可以在 libapache-mod-security
(for Apache 1.x) 和
libapache2-mod-security
(for Apache 2.x) 中找到.
此文档2002版权为 Alexandre Ratti 所有. 其遵从双重许可证, 在 GPL version 2 (GNU
Public License) the GNU-FDL 1.2 (GNU
自由文档许可证)和包含在此手册中其明确的许可下发布 (源自original
document
).
此过程在提供 makejail
0.0.4-1(在 Debian/testing 中)的 Debian
GNU/Linux 3.0 (Woody)上经过测试.
root
登录, 创建 jail 目录:
$ mkdir -p /var/chroot/apache
chrapach
.
$ adduser --home /var/chroot/apache --shell /bin/false \ --no-create-home --system --group chrapach
FIXME: 需要新的用户吗? (Apache 已经作为 apache 用户运行了)
/etc/apache/httpd.conf
配置文件中, 将 Group 和 User 选项设为 chrapach,
重新启动 Apache, 确保服务运行正常. 然后, 停掉 Apache 守护进程.
makejail
(现在 Debian/testing 中提供). 您还需要安装
makejail
会用到的 wget
和 lynx
, 以测试
chroot 服务器: apt-get install makejail wget lynx
/etc/makejail
目录:
# cp/usr/share/doc/makejail/examples/apache.py /etc/makejail/
/etc/makejail/apache.py
. 您需要修改 chroot,
users 和 groups 选项. 运行这个版本的 makejail
,
您还可以添加一个 packages
选项. 详见 makejail
documentation
. 下边是一个示例:
chroot="/var/chroot/apache" testCommandsInsideJail=["/usr/sbin/apachectl start"] processNames=["apache"] testCommandsOutsideJail=["wget -r --spider http://localhost/", "lynx --source https://localhost/"] preserve=["/var/www", "/var/log/apache", "/dev/log"] users=["chrapach"] groups=["chrapach"] packages=["apache", "apache-common"] userFiles=["/etc/password", "/etc/shadow"] groupFiles=["/etc/group", "/etc/gshadow"] forceCopy=["/etc/hosts", "/etc/mime.types"]
FIXME: 一些选项似乎不能正确运行. 例如, /etc/shadow
和
/etc/gshadow
没有复制, 然而 /etc/password
和
/etc/group
是全部复制的, 而不是经过过滤.
/etc/password
和 /etc/group
被全部复制, 键入:
$ grep chrapach /etc/passwd > /var/chroot/apache/etc/passwd $ grep chrapach /etc/group > /var/chroot/apache/etc/group
用过滤出的拷贝覆盖它们.
makejail
配置文件中的 preserve 项).
# cp -Rp /var/www /var/chroot/apache/var # cp -Rp /var/log/apache/*.log /var/chroot/apache/var/log/apache
/var/chroot/apache/dev/log
socket. 在
/etc/init.d/sysklogd
文件中, 用 SYSLOGD=" -a
/var/chroot/apache/dev/log" 替换 SYSLOGD=""
然后重启守护进程 (/etc/init.d/sysklogd restart).
/etc/init.d/apache
).
您可能需要适当地做对缺省的启动脚本做一些调整, 使其在 chroot 目录树中运行正常.
譬如:
/proc
文件系统
#! /bin/bash # # apache Start the apache HTTP server. # CHRDIR=/var/chroot/apache NAME=apache PATH=/bin:/usr/bin:/sbin:/usr/sbin DAEMON=/usr/sbin/apache SUEXEC=/usr/lib/apache/suexec PIDFILE=/var/run/$NAME.pid CONF=/etc/apache/httpd.conf APACHECTL=/usr/sbin/apachectl trap "" 1 export LANG=C export PATH test -f $DAEMON || exit 0 test -f $APACHECTL || exit 0 # ensure we don't leak environment vars into apachectl APACHECTL="env -i LANG=${LANG} PATH=${PATH} chroot $CHRDIR $APACHECTL" if egrep -q -i "^[[:space:]]*ServerType[[:space:]]+inet" $CONF then exit 0 fi case "$1" in start) echo -n "Starting web server: $NAME" mount -t proc proc /var/chroot/apache/proc start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON \ --chroot $CHRDIR ;; stop) echo -n "Stopping web server: $NAME" start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" --oknodo umount /var/chroot/apache/proc ;; reload) echo -n "Reloading $NAME configuration" start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" \ --signal USR1 --startas $DAEMON --chroot $CHRDIR ;; reload-modules) echo -n "Reloading $NAME modules" start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" --oknodo \ --retry 30 start-stop-daemon --start --pidfile $PIDFILE \ --exec $DAEMON --chroot $CHRDIR ;; restart) $0 reload-modules exit $? ;; force-reload) $0 reload-modules exit $? ;; *) echo "Usage: /etc/init.d/$NAME {start|stop|reload|reload-modules|force-reload|restart}" exit 1 ;; esac if [ $? == 0 ]; then echo . exit 0 else echo failed exit 1 fi
FIXME: 第一个 Apache 进程应当以其它用户而不是 root 用户运行的(即, add --chuid chrapach:chrapach)? Cons: chrapache将需要对日志有写权限, 这非常不便.
/etc/logrotate.d/apache
中用
/var/chroot/apache/var/log/apache/*.log 替换
/var/log/apache/*.log
/etc/init.d/apache start
), 并检查 jail
日志文件中的相关报告(/var/chroot/apache/var/log/apache/error.log
).
如果您的配置更加复杂, (例如, 您同时还使用 PHP 和 MySQL), 文件可能会找不到.
如果一些文件 makejail
没有自动复制, 您可以在
/etc/makejail/apache.py
配置文件的
forceCopy(直接拷贝的文件) 或 packages
(直接拷贝的整个软件包和它们的依赖包) 选项中列出.
root 180 0.0 1.1 2936 1436 ? S 04:03 0:00 /usr/sbin/apache chrapach 189 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache chrapach 190 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache chrapach 191 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache chrapach 192 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache chrapach 193 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
/proc
文件系统来确认 Apache 在 chroot 环境下运行:
ls -la /proc/process_number/root/.. 这里
process 是上边列出的 PID 号码(例如第二栏
189).应当列出限制目录树的内容:
drwxr-sr-x 10 root staff 240 Dec 2 16:06 . drwxrwsr-x 4 root staff 72 Dec 2 08:07 .. drwxr-xr-x 2 root root 144 Dec 2 16:05 bin drwxr-xr-x 2 root root 120 Dec 3 04:03 dev drwxr-xr-x 5 root root 408 Dec 3 04:03 etc drwxr-xr-x 2 root root 800 Dec 2 16:06 lib dr-xr-xr-x 43 root root 0 Dec 3 05:03 proc drwxr-xr-x 2 root root 48 Dec 2 16:06 sbin drwxr-xr-x 6 root root 144 Dec 2 16:04 usr drwxr-xr-x 7 root root 168 Dec 2 16:06 var
键入: ls -la /proc/`cat /var/chroot/apache/var/run/apache.pid`/root/. 自动完成整个测试
FIXME: 增加其它的测试, 以确保 jail 被关闭了?
我喜欢这样的原因是因为设定 jail 不是很困难, 并且服务器可以通过下边两行更新:
apt-get update && apt-get install apache makejail /etc/makejail/apache.py
如果您要寻找更多资料, 不妨考虑这些信息来源的大本营:
makejail 的主页
,
这个程序是由 Alain Tesio 完成的
Chrooting
daemons and system processes HOWTO
by Jonathan, Network Dweebs,
21/10/2002
Securing Debian Manual
v3.2, Mon, 20 Jun 2005 08:01:11 +0000jfs@debian.org
etony@tom.com