原文来源:www.linux.com
翻译:山崖 (如需转载,由你自己高兴是否保留此行。)
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模块,是一个不错的选择。相关的文章请网上搜索,因本人水平有限,本翻译文档仅供参考,不当之处还请大家斧正。
翻译:山崖 (如需转载,由你自己高兴是否保留此行。)
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模块,是一个不错的选择。相关的文章请网上搜索,因本人水平有限,本翻译文档仅供参考,不当之处还请大家斧正。