[ 上一篇 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ] [ H ] [ 下一篇 ]
Apache 的 Chroot 环境chroot 实用程序通常用于将守护进程隔离在受限目录树中。你可以使用它来隔离服务,以便一个软件包中的安全问题不会危及整个服务器。当使用 makejail 脚本时,设置和更新 chroot 目录树会容易得多。
待办事项:Apache 也可以使用 http://www.modsecurity.org 进行 chroot,它在 libapache-mod-security (用于 Apache 1.x) 和 libapache2-mod-security (用于 Apache 2.x) 中可用。
本文档版权归 2002 年 Alexandre Ratti 所有。它已获得双重许可,并根据 GPL version 2 (GNU General Public License) 和 GNU-FDL 1.2 (GNU Free Documentation Licence) 发布,并已获得他的明确许可包含在本手册中。(来自 原始文档)
此过程已在 Debian GNU/Linux 3.0 (Woody) 上使用 makejail 0.0.4-1 (在 Debian/testing 中) 进行测试。
以 root 身份登录并创建一个新的 jail 目录
$ mkdir -p /var/chroot/apache
创建一个新用户和一个新组。chroot 的 Apache 服务器将以此用户/组身份运行,该用户/组不用于系统上的任何其他用途。在此示例中,用户和组都称为 chrapach。
$ adduser --home /var/chroot/apache --shell /bin/false \
--no-create-home --system --group chrapach
待办事项:需要新用户吗?(Apache 已经以 apache 用户身份运行)
像往常一样在 Debian 上安装 Apache:apt-get install apache
设置 Apache (例如,定义你的子域名等)。在 /etc/apache/httpd.conf 配置文件中,将 Group 和 User 选项设置为 chrapach。重启 Apache 并确保服务器正常工作。现在,停止 Apache 守护进程。
安装 makejail (目前在 Debian/testing 中可用)。你还应该安装 wget 和 lynx,因为 makejail 将使用它们来测试 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 文档。此处显示了一个示例
chroot="/var/chroot/apache"
testCommandsInsideJail=["/usr/sbin/apachectl start"]
processNames=["apache"]
testCommandsOutsideJail=["wget -r --spider https:///",
"lynx --source https:///"]
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"]
待办事项: 某些选项似乎无法正常工作。例如,/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 套接字。在 /etc/default/syslogd 中,将:SYSLOGD="" 替换为 SYSLOGD=" -a /var/chroot/apache/dev/log" 并重启守护进程 (/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
待办事项:第一个 Apache 进程是否应该以 root 以外的其他用户身份运行(即添加 --chuid chrapach:chrapach)?缺点:chrapach 将需要写入日志的权限,这很麻烦。
在 /etc/logrotate.d/apache 中将 /var/log/apache/*.log 替换为 /var/chroot/apache/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
确保 Apache 进程以 chroot 方式运行,方法是查看 /proc 文件系统:ls -la /proc/process_number/root/. 其中 process_number 是上面列出的 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/.
待办事项:添加其他可以运行的测试,以确保 jail 已关闭?
我喜欢这样做的原因是设置 jail 并不困难,并且只需两行即可更新服务器
apt-get update && apt-get install apache
makejail /etc/makejail/apache.py
如果你正在寻找更多信息,可以考虑以下信息来源,本文档中的信息基于这些来源
makejail 主页,此程序由 Alain Tesio 编写
[ 上一篇 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ] [ H ] [ 下一篇 ]
Debian 手册安全
版本: 3.13, Sun, 08 Apr 2012 02:48:09 +0000jfs@debian.org