Red Hat / CentOS:Chroot Apache 2 Web 服务器
Red Hat / CentOS / Fedora Linux 操作系统上的 chroot 会更改 Apache 进程及其子进程的明显磁盘根目录。一旦完成此操作,攻击者或其他 php / perl / python 脚本将无法访问或命名该目录之外的文件。这称为 Apache 的“chroot jail”。您永远不应该运行没有 jail 的 Web 服务器。Web 服务器和系统其余部分之间应该有特权分离。
在此独家系列中,您将详细了解:
- 使用 mod_chroot 保护 Red Hat Enterprise Linux / CentOS Linux 下的 Apache 2 Web 服务器
- chrooted jail 下的虚拟主机配置。
- 解决 Chrooted Apache jail 问题。
要求
- 服务器:Apache 2 Web服务器。
- 监狱目录:/httpdjail。
- 用户/组:apache / apache(永远不要使用 root 用户运行 chroot)。
- jail 内所有域的虚拟域目录:/home/httpd。
- PHP 通过默认 mod_php 配置。
- 说明在 CentOS / RHEL 5.x 下测试。
有关 Jail 目录的更多信息:/httpdjail
创建一个jail目录如下:
# J=/httpdjail
# mkdir $J
- 不要在你的监狱内创建 /dev目录。
- 不要在监狱内创建特殊的设备文件。
- 请勿复制 shell 或任何其它单个可执行文件。
- 不要以 root 用户身份运行 httpd 或 php / perl / python。
- 如果可能的话,使用带有 nosuid、nodev 和 noexec 选项的单独分区挂载 $J 。这将提高安全性,因为用户将无法在 jail 内运行启用 suid 的程序和设备文件。
安装 Apache、PHP 和 MySQL
使用yum 命令安装所需的软件包,输入:
# yum install mysql mysql-server httpd php-mysql php-pear php-xml php-mysql php-cli php-imap php-gd php-pdo php-devel php-mbstring php-common php-ldap php httpd-devel
现在,在你的 jail 内创建所需的目录:
# mkdir -p $J/var/run
# chown -R root.root $J/var/run
# mkdir -p $J/home/httpd
# mkdir -p $J/var/www/html
# mkdir -p $J/tmp
# chmod 1777 $J/tmp
# mkdir -p $J/var/lib/php/session
# chown root.apache $J/var/lib/php/session
- $J/var/run将存储 PID 和其他文件。
- $J/var/lib/php/session PHP 会话文件路径(在 php.ini 中配置)。
- $J/tmp – 许多脚本和 cms 软件使用它来上传文件。
安装 mod_chroot
mod_chroot 使在安全的 chroot 环境中运行 Apache 变得简单。您无需创建包含 /dev、/lib、/etc 的特殊目录层次结构。mod_chroot 允许您在 chroot jail 中运行 Apache,而无需任何附加文件。chroot() 系统调用在启动过程结束时执行 - 当所有库都已加载且日志文件已打开时。使用 wget 命令下载 mod_chroot:
解压它:
编译并安装 mod_chroot 以使用 apxs,输入:
# cd /opt/
# wget http://core.segfault.pl/~hobbit/mod_chroot/dist/mod_chroot-0.5.tar.gz
# tar -zxvf mod_chroot-0.5.tar.gz
# cd mod_chroot-0.5
# apxs -cia mod_chroot.c
配置 Apache mod_chroot
打开 /etc/httpd/conf/httpd.conf 文件,输入:
设置 PidFile 路径,服务器启动时应在其中记录其进程标识号。找到如下行:
# C=/etc/httpd/conf/httpd.conf
# vi $C
PidFile run/httpd.pid
替换为:
PidFile /var/run/httpd.pid
接下来添加 ChrootDir 指令,输入:
ChrootDir /httpdjail
找到如下行:
ServerRoot "/etc/httpd"
添加以下几行:
LockFile /var/run/httpd.lock CoreDumpDirectory /var/run ScoreBoardFile /var/run/httpd.scoreboard
确保 mod_chroot.so 行存在。例如,64 位 Linux 应该有如下行:
LoadModule chroot_module /usr/lib64/httpd/modules/mod_chroot.so
32 位 Linux 配置行:
LoadModule chroot_module /usr/lib/httpd/modules/mod_chroot.so
保存并关闭文件。
为 Apache 禁用 SELinux
您需要禁用 apache 的 SELinux,请输入:有关更多详细信息,
# setsebool httpd_disable_trans 1
请参阅文章“在 Linux 中仅为 Apache/httpd 禁用 SELinux ”。
修补 /etc/init.d/httpd
打开/etc/init.d/httpd文件,输入:
# vi /etc/init.d/httpd
找到如下行:
# Start httpd in the C locale by default. HTTPD_LANG=${HTTPD_LANG-"C"}
添加以下行(将 ROOT 设置为 $J):
ROOT=/httpdjail
找到如下的 stop() 方法:
stop() { echo -n $"Stopping $prog: " killproc -d 10 $httpd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} }
替换如下(需要将 /var/run/httpd.pid 链接到 $J/var/run/httpd.pid;这样停止操作才能起作用):
stop() { /bin/ln -s $ROOT/var/run/httpd.pid /var/run/httpd.pid echo -n $"Stopping $prog: " killproc -d 10 $httpd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} }
保存并关闭文件。在 /etc/init.d/httpd 上设置不可变权限,以便文件无法被修改、由 yum 更新、删除或重命名,无法为此文件创建任何链接,也无法向文件写入任何数据。只有超级用户或拥有 CAP_LINUX_IMMUTABLE 功能的进程才能设置或清除此属性:
# chattr +i /etc/init.d/httpd
我如何启动 chrooted httpd?
输入以下命令:
# /etc/init.d/httpd start
您不应该在 /var/log/httpd/error_log 文件中看到任何错误:
[Sun Dec 21 18:43:09 2008] [notice] core dump file size limit raised to 18446744073709551615 bytes [Sun Dec 21 18:43:09 2008] [notice] SELinux policy enabled; httpd running as context root:system_r:initrc_t [Sun Dec 21 18:43:09 2008] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) [Sun Dec 21 18:43:09 2008] [notice] Digest: generating secret for digest authentication ... [Sun Dec 21 18:43:09 2008] [notice] Digest: done [Sun Dec 21 18:43:10 2008] [notice] mod_chroot: changed root to /httpdjail. [Sun Dec 21 18:43:10 2008] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations
我如何停止 chrooted httpd?
# /etc/init.d/httpd stop
我如何重新启动 chrooted httpd?
# /etc/init.d/httpd restart