全部博文(317)
分类: LINUX
2010-11-09 02:20:20
英文原文:
以下是我简单翻译和总结的。
chroot可以把进程的根目录变成不是“/”目录的其他目录。这就意味着该进程被锁定到一个虚拟文件系统的根中。如果你再适当地配置你的chroot jail,Apache和它的子进程(比如CGI脚本)将除于chroot jail环境之外不能访问其他任何东西。同时,非根进程也不能离开chroot jail环境的。
在下边的文档中,你将会学到:
。使用mod_chroot来加固apache2
。chroot jail中的虚拟主机配置
。如何排错
系统需求:
1. Server: Apache 2 Web server.
2. Jail目录: /httpdjail.
3. User / Group: apache / apache (千万不要使用root运行chroot).
4. Jail中的Virtual domain目录: /home/httpd.
5. PHP已经通过mod_php配置好了.
6. OS版本为CentOS / RHEL 5.x.
一、创建Jail目录 /httpdjail
# J=/httpdjail
# mkdir $J
需要特别注意的是:
1. 不要创建 /dev 目录
2. 不要创建特别的设备文件
3. 不要复制shell或者其他可执行程序到Jail目录
4. 不要使用root用户运行httpd 或 php / perl / python
5. 如果可以,尽量将Jail目录放到一个单独的分区,并且对该分区使用nosuid, nodev,noexec选项。这样可以有效防止用户在Jail中执行suid程序或访问具有suid的设备文件。
二、安装Apache,PHP,MySQL
# 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
# 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 session文件路径(在php.ini中配置).
$J/tmp - 许多脚本和CMS系统用来保存上传文件的目录。
三、安装mod_chroot
mod_chroot可以简化apache的chroot操作,你不需要再去创建/dev, /lib, /etc这些目录。使用mod_chroot进行操作以后,不需要任何额外的文件即可正常运行apache。在apache的启动过程末尾,所有库已经载入,日志文件已经被打开以后,chroot()系统调用被执行。
# cd /opt/
# wget
# tar -zxvf mod_chroot-0.5.tar.gz
# cd mod_chroot-0.5
# apxs -cia mod_chroot.c
# vi /etc/httpd/conf/httpd.conf
查找PidFile run/httpd.pid 修改为 PidFile /var/run/httpd.pid
增加 ChrootDir /httpdjail
查找ServerRoot "/etc/httpd",在后边增加
LockFile /var/run/httpd.lock
CoreDumpDirectory /var/run
ScoreBoardFile /var/run/httpd.scoreboard
确认配置文件中包含mod_chroot一行
LoadModule chroot_module /usr/lib64/httpd/modules/mod_chroot.so (64bits)
LoadModule chroot_module /usr/lib/httpd/modules/mod_chroot.so (32bits)
关闭SELinux
# setsebool httpd_disable_trans 1
四、修改启动脚本
# vi /etc/init.d/httpd
找到如下行:
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
在后边增加 ROOT=/httpdjail
找到如下行:
stop() {
echo -n $"Stopping $prog: "
killproc -d 10 $httpd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
替换成:
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}
}
加固httpd启动脚本,设置粘滞位
# chattr +i /etc/init.d/httpd
五、启动apache
# /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
# /etc/init.d/httpd stop 停止服务命令
# /etc/init.d/httpd restart 重启服务命令