[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ] [ H ] [ 下一页 ]
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
General 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
创造一个用户和新组. 除了 chroot 了的 Apache 服务器用这个用户/组运行,
在此系统上不再做别的用途. 在这个例子中, 用户和组都叫 chrapach.
$ adduser --home /var/chroot/apache --shell /bin/false \
--no-create-home --system --group chrapach
FIXME: 需要新的用户吗? (Apache 已经作为 apache 用户运行了)
象通常一样在 Debian 上安装 Apache: apt-get install apache
配置 Apache(例如定义您的子域, 等). 在 /etc/apache/httpd.conf
配置文件中, 将 Group 和 User 选项设为 chrapach,
重新启动 Apache, 确保服务运行正常. 然后, 停掉 Apache 守护进程.
安装 makejail(现在 Debian/testing 中提供). 您还需要安装
makejail 会用到的 wget 和 lynx, 以测试
chroot 服务器: apt-get install makejail wget lynx
复制 Apache 示例配置文件到 /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 是全部复制的, 而不是经过过滤.
创造 chroot 目录树: makejail /etc/makejail/apache.py
如果 /etc/password 和 /etc/group 被全部复制, 键入:
$ grep chrapach /etc/passwd > /var/chroot/apache/etc/passwd
$ grep chrapach /etc/group > /var/chroot/apache/etc/group
用过滤出的拷贝覆盖它们.
复制网站的网页和日志文件到 jail 中. 这些文件都不是自动复制的.(参阅
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).
编辑 Apache 的启动脚本(/etc/init.d/apache).
您可能需要适当地做对缺省的启动脚本做一些调整, 使其在 chroot 目录树中运行正常.
譬如:
在文件顶部设置一新 CHRDIR 变量;
编辑 start, stop, reload, 等部分;
增加一行用于在 jail 中加载和卸载 /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
启动 Apache(/etc/init.d/apache start), 并检查 jail
日志文件中的相关报告(/var/chroot/apache/var/log/apache/error.log).
如果您的配置更加复杂, (例如, 您同时还使用 PHP 和 MySQL), 文件可能会找不到.
如果一些文件 makejail 没有自动复制, 您可以在
/etc/makejail/apache.py 配置文件的
forceCopy(直接拷贝的文件) 或 packages
(直接拷贝的整个软件包和它们的依赖包) 选项中列出.
键入 ps aux | grep apache 以确保 Apache 正在运行. 您应当看到如下类似内容:
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
[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ] [ H ] [ 下一页 ]
Debian 安全手册
v3.5, Thu, 24 Nov 2005 21:25:43 +0800jfs@debian.orgetony@tom.com