服务器 频道

Linux服务器安全策略详解之Apache配置

  6.3.9  减少CGI和SSI风险

  CGI脚本的漏洞已经成为Web服务器的首要安全隐患,通常是程序编写CGI脚本中产生了许多漏洞。控制CGI脚本的漏洞除了在编写时需要注意对输入数据的合法性检查、对系统调用的谨慎使用等因素外,首先使用CGI程序所有者的UID来运行这些程序。这些CGI程序即使存在某些漏洞,那么其危害也仅限于该UID所能够访问的文件。也就是说,这样只能伤害用户的文件,而不会对整个系统带来致命的影响。

  通过安装和使用suEXEC的应用程序,可以为Apache服务器提供CGI程序的控制支持(从Apache l.3版以后,suEXEC已经作为Apache服务器的一部分),可以把suEXEC看作一个包装器,在Apache接到对CGI程序的调用请求后,它将这个调用请求交给suEXEC来负责完成具体的调用,并且从suEXEC获得返回的结果。

  suEXEC能解决一些安全问题,但也会降低服务性能,因为它只能运行在CGI版本的PHP上,而CGI版本比模块版本运行速度慢。原因是模块版本使用了线程,而使用CGI版本的是进程。在不同线程之间的环境转换和访问公用的存储区域显然要比在不同的进程之间要快得多。

  建议在对安全性能要求比较高时使用suEXEC,为此还要以牺牲速度为代价。此外,可以尝试另外一个软件CGIWrap,它的安全性能高于suEXEC。官方网址为ftp://ftp.cc.umr.edu/pub/cgi/cgiwrap

  减少SSI脚本的风险,如果用exec等SSI命令运行外部程序,也会存在类似CGI脚本程序的危险,除了内部调试程序时都应当可以使用Option命令禁止其使用。

  Options IncludesNOEXEC

  6.3.10  让Apache服务器在"监牢"中运行

  所谓的"监牢"是指通过chroot机制来更改某个软件运行时所能看到的根目录,即将某软件运行限制在指定目录中,保证该软件只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。这样即使被破坏或侵入,所受的损伤也不大。

  将软件chroot化的一个问题是该软件运行时需要的所有程序、配置文件和库文件都必须事先安装到chroot目录中,通常称这个目录为chroot jail(chroot"监牢")。如果要在"监牢"中运行Apache,而事实上根本看不到文件系统中那个真正的目录,就需要事先创建目录,并将httpd复制到其中。同时,httpd需要库文件,可以使用LDD(Library Dependency Display)命令查看,LDD的作用是显示一个可执行程序必须使用的共享库。这意味着还需要在"监牢"中创建lib目录,并将库文件复制到其中。手工完成这一工作是非常麻烦的,此时可以用jail软件包来帮助简化chroot"监牢"建立的过程。jail官方网站是http://www.jmcresearch.com/,最新版本为1.9a。

  以前,UNIX/Linux上的daemon都是以root权限启动的。当时,这似乎是一件理所当然的事情,因为像Apache这样的服务器软件需要绑定到"众所周知"的端口上(小于1024)来监听HTTP请求,而root是唯一有这种权限的用户。但是,随着攻击者活动的日益频繁,尤其是缓冲区溢出漏洞数量的激增,使服务器安全受到了更大的威胁。一旦某个网络服务存在漏洞,攻击者就能够访问并控制整个系统。因此,为了减小这种攻击所带来的负面影响,现在的服务器软件通常设计为以root权限启动,然后服务器进程自行放弃root权限,再以某个低权限的系统账号来运行进程。这种方式的好处在于一旦该服务被攻击者利用漏洞入侵,由于进程权限很低,攻击者得到的访问权限又是基于这个较低权限的,对系统造成的危害比以前减轻了许多。

  有些攻击者会试图找到系统其他的漏洞来提升权限,直至达到root权限。由于本地安全性远低于远程安全性,因此攻击者很有可能在系统中找到可以提升权限的东西。即使没有找到本地漏洞,攻击者也可能会制造其他损害,如删除文件、涂改主页等。

  为了进一步提高系统安全性,Linux内核引入了chroot机制。chroot是内核中的一个系统调用,软件可以通过调用库函数chroot,来更改某个进程所能见到的根目录。比如,Apache软件安装在/usr/local/httpd/目录下,以root用户(或具有相同权限的其他账号)启动Apache,这个root权限的父进程会派生数个以nobody权限运行的子进程,具体情况取决于个人设置。父进程监听来自80端口的TCP数据流,然后根据内部算法将这个请求分配给某个子进程来处理。这时Apache子进程所处的目录继承父进程,即/usr/local/httpd/。但是,一旦目录权限设定失误,被攻击的Apache子进程可以访问/usr/local、/usr、/tmp,甚至整个文件系统,因为Apache进程所处的根目录仍是整个文件系统的根。如果能够利用chroot将Apache限制在/usr/local/httpd/,那么,Apache所能存取的文件都是/usr/local/httpd/下的文件或其子目录下的文件。创建chroot"监牢"的作用就是将进程权限限制在文件系统目录树中的某一子树中。

  1.编译和安装jail

  在网站http://www.jmcresearch.com/projects/jail/上可以下载到jail的最新版本,它是由jail chroot项目小组开发的。该软件包包含了帮助自动创建chroot"监牢"的C程序、Perl程序和Bash脚本。

  首先将jail.tar.gz置于任意目录,然后执行命令:

  #tar xzvf jail.tar.gz && cd jail/src

  按照个人实际情况修改makefile文件,尤其是安装路径(默认安装路径是/usr/local)、体系结构(jail支持Linux、FreeBSD、IRIX和Solaris),以及编译选项等。最后执行命令:

  #make && make install

  为jail创建chroot"监牢"。

  现在创建一个目录作为chroot"监牢",以/var/chroot/为例。执行下面的命令为chroot"监牢"创建环境:

  #/usr/local/bin/mkjailenv /var/chroot

  这样"监牢"就建好了。jail软件包提供了几个Perl脚本作为其核心命令,包括mkjailenv、addjailuser和addjailsw。addjailsw会从真实文件系统中复制二进制可执行文件及其相关的其他文件(包括库文件、辅助性文件和设备文件)到该"监牢"中。

  2.为jail"监牢"添加软件

  接下来需要为这个"监牢"增加一些软件,以便让它运行起来。执行以下命令安装一些基本的软件,包括ls、cat、cp等程序和ld-linux.so.2等库文件。

  #/usr/local/bin/addjailsw /var/chroot

  事实上仅有这些基本软件是不够的,还需要把一些真正有用的东西加进来。以Apache服务器软件为例:

  #addjailsw /var/chroot/ -P /usr/local/httpd/bin/httpd

  addjailsw

  A component of Jail (version 1.9 for linux)

  http://www.jmcresearch.com/projects/jail/

  Juan M. Casillas <juanm.casillas@jmcresearch.com>

  Guessing /usr/local/httpd/bin/httpd args(0)

  Warning: file /var/chroot//lib/libssl.so.4 exists. Overwritting it

  Warning: file /var/chroot//lib/libcrypto.so.4 exists. Overwritting it

  Warning: file /var/chroot//lib/libresolv.so.2 exists. Overwritting it

  ……

  Done.

  不用在意那些告警信息,因为jail会调用LDD检查httpd用到的库文件。而几乎所有基于共享库的二进制可执行文件都需要上述的几个库文件。接下来将Apache的相关文件复制到"监牢"中:

  #cp -a /usr/local/httpd/ /var/chroot/usr/local/

  可根据个人情况依次将Apache需要的文件复制到"监牢"中。

  3."监禁"用户

  有时候需要为chroot"监牢"创建新的用户,比如Apache要求创建nobody用户作为子进程用户。鉴于可能有其他进程使用nobody,还可以使用另一用户--httpd。首先需要在真实系统中创建httpd用户:

  #useradd -d /var/chroot -s /usr/local/bin/jail httpd

  然后执行以下命令在chroot"监牢"中创建httpd用户:

  #/usr/local/bin/addjailuser /var/chroot /usr/local/httpd /usr/sbin/httpd httpd

  接下来修改/var/chroot/usr/local/httpd/conf/httpd.conf,将User nobody替换为User httpd。由于chroot后Apache将以httpd身份启动进程,只有root有权将Apache绑定在低端口上(通常为80),因此还需要修改端口值,该值必须大于1024(假设为8080)。这个修改要应用到Apache的所有配置文件中,包括虚拟主机的配置。至于Apache的其他设置,与在真实文件系统中一样配置即可。

  接下来需要复制一些其他的文件。启动Apache,最常见的方式就是调用apachectl,这是个Bash脚本。查看这个文件,会发现如下行:

  HTTPD='/usr/local/httpd/bin/httpd'

  LYNX="lynx -dump"

  ULIMIT_MAX_FILES="ulimit -S -n `ulimit -H -n`"

  ARGV="-h"

  $HTTPD -k $ARGV

  $HTTPD -k start -DSSL

  $HTTPD -t

  $LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } '

  其中ulimit、lynx和awk是辅助性的程序。另外需要注意的是,程序使用不同的参数时,可能会使用不同的库文件,因此,为了让Apache完整运行,使用下面的命令来跟踪所有可能的文件:

  ///usr/local/bin/addjailsw /var/chroot -P httpd "-k start -DSSL"

  用上述的参数替换引号中的参数,完成全部的工作。

  最后,让Apache成功运行起来:

  //su - httpd &

  打开浏览器进行测试,访问Web服务器时记住加上8080端口号。

 

0
相关文章