Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2108013
  • 博文数量: 317
  • 博客积分: 5670
  • 博客等级: 大校
  • 技术积分: 3677
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-10 17:51
文章分类

全部博文(317)

文章存档

2016年(2)

2015年(44)

2014年(68)

2013年(42)

2012年(23)

2011年(51)

2010年(67)

2009年(17)

2008年(3)

分类: LINUX

2010-11-09 02:20:20

在CentOS中对apache 2.x做chroot

英文原文:

以下是我简单翻译和总结的。

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  重启服务命令

阅读(2273) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~