chroot apache(中文翻译)

原文来源:www.linux.com
翻译:山崖  (如需转载,由你自己高兴是否保留此行。chroot apache(中文翻译)
2007年6月1日

  chroot守护进程允许你运行一个程序,使得它感觉你给它的目录就是根(/)目录。实际上就是把进程孤立与真正的"/"文件系统,锁定在一个你给它的文件系统中(chroot*)

。在这一章中我们将讨论如何安装apache服务器在这样的一个环境中。   
  chroot*安装apache并不会跟apache自身带来什么安全。当然,把apache及其子进程限制在一个特定的文件系统中对防止入侵者非常有利。但是,这也有其潜在的问题。

  所以在你决定是否需要chroot你的web服务器之前,你应该考虑下这样安装的利与弊。

优点:
如果apache被入侵者攻克,那么他只能访问到chroot中的文件。
具有潜在威胁的CGI脚本不能访问你chroot之外的文件系统。
你web目录中的内容在一特定的区域,很容易备份或是删除。

缺点:
  chroot安装跟传统的安装方法比较起来困难很多,特别是当你运行一些诸如:perl,php,mysql或python等外部软件的时候。

如果你的整个WEB目录在单一的文件系统中,那么进程仅仅是能运行.
(译注:我也不明白这句话什么意思,可能作者的意思是在性能上会有所下降.)

编译安装apache二进制文件

  在安装apache为chroot之前我们并没有什么特别的步骤。下面的安装步骤适用于预编译包(像RPM)的安装或是你自己编译安装。良好的开始有助于以后的调试工作。你仅需要确

定你的服务器使用的是最新的补丁包。正常安装apache,并且确定它跟你预想的一样正常运行着。
   最后,确定你以配置apache运行在它自己的用户ID和组ID之上。用下面的命令创建用户和组。

# groupadd apache
# useradd -c "Apache Server" -d /dev/null -g apache -s /bin/false apache

以上命令建立了一个叫apache的普通用户和一个apache用户组。默认情况下apache运行于nobody用户。可能有很多守护进程在使用nobody,如果该帐号被入侵者获得,那么他就得

到了运行于该UID下所有守护进程的访问权限。

  创建chroot目录树

chroot*其实就是一个最小化的LINUX文件系统。我更喜欢单独给它分一个区,然后挂载为/chroot,然后在我的chroot分区中为apache建立一个名为httpd的目录。

# mkdir /chroot/httpd
# mkdir /chroot/httpd/dev
# mkdir /chroot/httpd/lib
# mkdir /chroot/httpd/etc
# mkdir -p /chroot/httpd/usr/sbin
# mkdir /chroot/httpd/usr/lib
# mkdir /chroot/httpd/usr/libexec
# mkdir -p /chroot/httpd/var/run
# mkdir -p /chroot/httpd/var/log/apache
# mkdir -p /chroot/httpd/home/httpd

现在为目录结构设置权限:

# chown -R root /chroot/httpd
# chmod -R 0755 /chroot/httpd
# chmod 750 /chroot/httpd/var/log/apache/

一但你创建了这些必需的目录后,你还应该再创建一个NULL设备.

# mknod  /chroot/httpd/dev/null c 1 3
# chown root.sys /chroot/httpd/dev/null (译注:原文如此,不清楚这里为什么不是chown 0.0)
# chmod 666 /chroot/httpd/dev/null
  你必需建立NULL设备和/chroot/httpd/var/log/httpd/,因为当你运行chroot,apache就会把/chroot/httpd目录当成"/".这句话的意思是,它将不能访问正常文件系统下

的/dev/null 或是/var/log.

copy必需的文件

  现在关闭apache,运行 killall httpd,然后你可以开始copy文件了.他们的目录可能不同,取决于当初你是如何安装apache的.首先,copy配置文件:

# cp -r /etc/apache /chroot/httpd/etc/

  接着,copy apache主目录和CGI脚本目录:

# cp -r /home/httpd/html /chroot/httpd/home/httpd/
# cp -r /home/httpd/cgi-bin /chroot/httpd/home/httpd/

  然后从/usr/sbin/下copy你的httpd文件(和apache脚本,如果使用他们)

# cp /usr/sbin/httpd /chroot/usr/sbin/
# cp /usr/sbin/apache* /chroot/usr/sbin/

  如果使用mod_ssl,你还需要copy /etc/ssl目录:

# cp -a /etc/ssl /chroot/httpd/etc/
  
  完成拷贝apache(和ssl,如果你需要),你还必需copy apache依赖运行的所有共享库,为了找出你需要copy的文件,执行:# ldd /chroot/httpd/usr/sbin/httpd.输出应该类似于:

        /lib/libsafe.so.2 => /lib/libsafe.so.2 (0x40017000)
        libm.so.6 => /lib/libm.so.6 (0x40037000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x40059000)
        libdb.so.2 => /lib/libdb.so.2 (0x40086000)
        libexpat.so.0 => /usr/lib/libexpat.so.0 (0x40096000)
        libdl.so.2 => /lib/libdl.so.2 (0x400b6000)
        libc.so.6 => /lib/libc.so.6 (0x400b9000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

首先应该弄清楚以上输出这些文件的相互依赖关系,然后copy它们到各自的目录.

# cp /lib/libsafe* /chroot/httpd/lib/
# cp /lib/libm* /chroot/httpd/lib/
# cp /lib/libcrypt* /chroot/httpd/lib/
# cp /lib/libdb* /chroot/httpd/lib/
# cp /usr/lib/libexpat* /chroot/httpd/usr/lib/
# cp /lib/libdl* /chroot/httpd/lib/
# cp /lib/libc* /chroot/httpd/lib/
# cp /lib/ld-* /chroot/httpd/lib/

你还要需要一些提供标准网络功能的库文件.
# cp /lib/libnss_compat* /chroot/httpd/lib/
# cp /lib/libnss_dns* /chroot/httpd/lib/
# cp /lib/libnss_files* /chroot/httpd/lib/
# cp /lib/libnsl* /chroot/httpd/lib/


/chroot/httpd/etc 配置文件

为了让apache工作起来,可能还要在/etc下配置几个文件.首先,编辑/etc/pass和/etc/group文件,这两个文件仅应该有你之前创建的用户和组.例如:

/etc/passwd:
apache:x:12347:12348:Apache Server:/dev/null:/bin/false

/etc/group:
apache:x:12347:

你还要再编辑几个网络配置文件:

# cp /etc/hosts /chroot/httpd/etc/
# cp /etc/host.conf /chroot/httpd/etc/
# cp /etc/resolv.conf /chroot/httpd/etc/
# cp /etc/nsswitch.conf /chroot/httpd/etc/

为了得到更多的安全,你还可以对这些文件加"i"标志位,当设置了"i"标志位后,只有root用户去掉标志位,文件才可修改.那么当入侵者想要修改这些文件,他们还必需付出更多的努



# chattr +i /chroot/httpd/etc/hosts
# chattr +i /chroot/httpd/etc/host.conf
# chattr +i /chroot/httpd/etc/resolv.conf
# chattr +i /chroot/httpd/etc/nsswitch.conf
# chattr +i /chroot/httpd/etc/passwd
# chattr +i /chroot/httpd/etc/group

为了让日志文件的时间正确,你还得检查/etc/localtime.localtime文件是否连接到/usr/share/zoneinfo文件.运行ls -l /etc/localtime找出是哪个文件.然后copy它

到/chroot/httpd/etc/localtime.

默认,syslogd守护进程仅监视/var/log日志文件,而chroot后的httpd守护进程会把日志写入/chroot/httpd/var/log.因此,你还需要告诉syslogd守护进程也监视这个目录.编辑你的

启动脚本/etc/rc.d/rc.syslog 或是 /etc/rc.d/init.d/syslog文件.

打开 /etc/rc.d/rc.syslog 文件

修改: daemon syslogd -m 0
为: daemon syslogd -m 0 -a /chroot/httpd/dev/log

修改:  echo -n " /usr/sbin/syslogd"
    /usr/sbin/syslogd
为:
    echo -n " /usr/sbin/syslogd"
    /usr/sbin/syslogd -m 0 -a /chroot/httpd/dev/log

(译注:这好像是slackware,如果你是其他的发行版,请自行参考管理员手册)

在创建日志文件后给它们加上"a"标志位,是一个不错的主意

# touch /chroot/httpd/var/log/apache/access_log
# touch /chroot/httpd/var/log/apache/error_log
# chmod 600 /chroot/httpd/var/log/apache/*
# chattr +a /chroot/httpd/var/log/apache/*

最后,修改httpd启动脚本让它运行chroot后的httpd.打开/etc/rc.d/rc.httpd或者/etc/rc.d/init.d/httpd文件,修改命令让httpd守护进程运行.
/usr/sbin/chroot  /chroot/httpd/  /usr/sbin/httpd.


测试服务器

关闭HTTPD守护进程,然后重启syslog: /etc/rc.d/rc.syslog restart(或 /etc/rc.d/init.d/syslog restart).
好了,现在可以启动以经chroot后的apache了.
/etc/rc.d/rc.httpd start (或 /etc/rc.d/init.d/httpd start).

如果没有发现错误,那么运行命令ps -aux |grep httpd 检查守护进程是否在运行.
如果你看到有输出,那么表示apache以经运行.记录下ps命令输出的进程号,然后运行
ls -l /proc/PROC_NUMBER/root/ 显示的是你的/chroot/httpd目录 而不是你服务器的"/"文件目录。
(译注:其实我认为运行ls -l /proc/PROC_NUMBER/ 的输出更直观一点.因为你直接就看到了诸如: root -> /chroot/httpd的输出)

一旦所有的工作都完成,你就可以删除你原来安装的apache了.

  总结:虽然chroot有助于创建一个更安全的环境,但它也并不是完美的.你仍需要保证你的 web服务器的补丁包是最新的并经常查看日志文件.当然,一旦系统出现未知的漏洞,营造web服务器的chroot环境更有助于你控制入侵者,保护你系统中的主文件系统.

---------------------------------------------------------------------------------------------------------------------------
译者注:就如原作者所说的那样,chroot只能在一定的基础上保证整个系统的安全,为了防范诸如SQL注入类的攻击,正确配置apache仍是极其重要的。除了文中介绍严格的目录、CGI脚本权限,健全的日志等之外,编译并合理配置mod_security模块,是一个不错的选择。相关的文章请网上搜索,因本人水平有限,本翻译文档仅供参考,不当之处还请大家斧正。
 
上一篇:shell脚本备份数据库


下一篇:《大数据原理:复杂信息的准备、共享和分析》一一2.7 案例:医院登记