企业级Apache服务器安全防护要点剖析(1) |
发布时间: 2012/5/28 7:44:35 |
Apache一直是世界上使用率排名前三的Web服务器软件。企业使用其构建Web应用,从很大程度上都需要对其安全性进行综合考虑,以保证能够应对拒绝服务攻击、流量窃听、数据泄漏等网络威胁,从而保证企业门户网站的安全。 除了使用业界流行的防火墙、IDS/IPS(入侵检测系统/入侵防御系统)、WAF(Web应用防火墙)、UTM(统一威胁管理)等外部安全设备对 Apache服务进行安全防护外,作为一种优秀的开源服务器软件,Apache本身就具有很多优秀的特性可以为服务器管理员提供安全配置,以防范各种网络攻击。因此,充分、高效地挖掘Apache服务器的自身安全能力也是企业安全工作者一个必备的技能。基于此,本文将从4个方面详细剖析Apache服务器的安全防护要点。 策略一:服务器端安全设置 1.限制root用户运行Apache服务器 一般情况下,在Linux下启动Apache服务器的进程httpd需要root权限。由于root权限太大,存在许多潜在的安全威胁。一些管理员为了安全起见,认为httpd服务器不可能没有安全漏洞,因而更愿意使用普通用户的权限来启动服务器。http.conf主配置文件里面有如下两个配置是 Apache的安全保证,Apache在启动后,就将其本身设置为这两个选项设置的用户和组权限进行运行,降低了服务器的危险性。 Userapache Groupapache 需要特别指出的是:以上两个配置在主配置文件里面是默认选项,当采用root用户身份运行httpd进程后,系统将自动将该进程的用户组和权限改为apache,这样,httpd进程的权限就被限制在apache用户和组范围内,因而保证了安全。 2.向客户端隐藏Apache服务器的相关信息 Apache服务器的版本号可作为黑客入侵的重要信息被利用,通常他们在获得版本号后,通过网上搜索针对该版本服务器的漏洞,从而使用相应的技术和工具有针对性的入侵,这也是渗透测试的一个关键步骤。因此,为了避免一些不必要的麻烦和安全隐患,可以通过主配置文件httpd.conf下的如下两个选项进行: (1)ServerTokens:该选项用于控制服务器是否响应来自客户端的请求,向客户端输出服务器系统类型或者相应的内置模块等重要信息。RedHatEnterpriseLinux5操作系统在主配置文件中提供全局默认控制阈值为OS,即 ServerTokensOS。它们将向客户端公开操作系统信息和相关敏感信息,所以保证安全情况下需要在该选项后使用“ProductOnly”,即 ServerTokensProductOnly。 (2)ServerSignature:该选项控制由系统生成的页面(错误信息等)。默认情况下为off,即 ServerSignatureoff,该情况下不输出任何页面信息。另一情况为on,即ServerSignatureon,该情况下输出一行关于版本号等相关信息。安全情况下应该将其状态设为off。 图1和图2为安全设定这两个选项前后正常情况下和错误情况下的输出页面(通过Rhel5中的MozillaFirefox浏览器访问Rhel5中的 Apache服务器)的详细对比。可以清楚看到,安全设定选项后,可以充分地向客户端用户隐藏Linux操作系统信息和Apache服务器版本信息。 图1错误情况下未设定安全选项前示意 图2操作情况下使用安全设定后的对比 3.设置虚拟目录和目录权限 要从主目录以外的其他目录中进行发布,就必须创建虚拟目录。虚拟目录是一个位于Apache的主目录外的目录,它不包含在Apache的主目录中,但在访问Web站点的用户看来,它与主目录中的子目录是一样的。每个虚拟目录都有一个别名,用户Web浏览器中可以通过此别名来访问虚拟目录,如 http://服务器IP地址/别名/文件名,就可以访问虚拟目录下面的任何文件了。 使用Alias选项可以创建虚拟目录。在主配置文件中,Apache默认已经创建了两个虚拟目录。这两条语句分别建立了“/icons/”和“ /manual”两个虚拟目录,它们对应的物理路径分别是“/var/www/icons/”和“/var/www/manual”。在主配置文件中,用户可以看到如下配置语句: Alias/icons/"/var/www/icons/" Alias/manual"/var/www/manual" 在实际使用过程中,用户可以自己创建虚拟目录。比如,创建名为/user的虚拟目录,它所对应的路径为上面几个例子中常用的/var/www/html/rhel5: Alias/test"/var/www/html/rhel5" 如果需要对其进行权限设置,可以加入如下语句: <Directory“/var/www/html/rhel5”> AllowOverrideNone OptionsIndexes Orderallow,deny Allowfromall </Directory> 设置该虚拟目录和目录权限后,可以使用客户端浏览器进行测试验证,采用别名对该目录中的文件进行访问,浏览结果如图3所示。 图3使用虚拟目录的测试结果 策略二:限制Apache服务的运行环境 Apache服务器需要绑定到80端口上来监听请求,而root是唯一有这种权限的用户,随着攻击手段和强度的增加,服务器受到相当大的威胁,一旦缓冲区溢出漏洞被利用,就可以控制整个系统。为了进一步提高系统安全性,Linux内核引入chroot机制,chroot是内核中的一个系统调用,软件可以通过调用函数库的chroot函数,来更改某个进程所能见到的根目录。 chroot机制是将某软件运行限制在指定目录中,保证该软件只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。在这种情况下,即使出现黑客或者不法用户通过该软件破坏或侵入系统,Linux系统所受的损坏也仅限于该设定的根目录,而不会影响到系统的其他部分。 将软件chroot化的一个问题是该软件运行时需要的所有程序、配置文件和库文件都必须事先安装到chroot目录中,通常称这个目录为 chroot“监牢”。如果在“监牢”中运行httpd,那么用户根本看不到Linux文件系统中那个真正的目录,从而保证了Linux系统的安全。 在使用该技术的时候,一般情况下需要事先创建目录,并将守护进程的可执行文件httpd复制到其中。同时,由于httpd需要几个库文件,所以需要把httpd程序依赖的几个lib文件同时也拷贝到同一个目录下,因此手工完成这一工作是非常麻烦的。幸运的是,用户可以通过使用开源的jail软件包来帮助简化chroot“监牢”建立的过程,具体步骤如下所示: Jail官方网站是http://www.jmcresearch.com/projects/。首先将其下载,然后执行如下命令进行源代码包的编译和安装: #tarxzvfjail_1.9a.tar.gz #cdjail/src #make jail软件包提供了几个Perl脚本作为其核心命令,包括mkjailenv、addjailuser和addjailsw,他们位于解压后的目录jail/bin中。这几个命令的基本用途如下所示: mkjailenv:用于创建chroot“监牢”目录,并且从真实文件系统中拷贝基本的软件环境。 addjailsw:用于从真实文件系统中拷贝二进制可执行文件及其相关的其它文件(包括库文件、辅助性文件和设备文件)到该“监牢”中。 addjailuser:创建新的chroot“监牢”用户。 采用jail创建监牢的步骤如下所示; (1)首先需要停止目前运行的httpd服务,然后建立chroot目录,命令如下所示。该命令将chroot目录建立在路径/root/chroot/httpd下: #servicehttpdstop #mkjailenv/root/chroot/httpd kjailenv AcomponentofJail(version1.9forlinux) http://www.gsyc.inf.uc3m.es/~assman/jail/ JuanM.Casillas<assman@gsyc.inf.uc3m.es> Makingchrootedenvironmentinto/root/chroot/httpd Doingpreinstall() Doingspecial_devices() Doinggen_template_password() Doingpostinstall() Done. (2)为“监牢”添加httpd程序,命令如下: #./addjailsw/root/chroot/httpd/-P/usr/sbin/httpd addjailsw AcomponentofJail(version1.9forlinux) http://www.gsyc.inf.uc3m.es/~assman/jail/ JuanM.Casillas<assman@gsyc.inf.uc3m.es> Guessing/usr/sbin/httpdargs(0) Warning:can'tcreate/proc/mountsfromthe/procfilesystem Done. 在上述过程中,用户不需要在意那些警告信息,因为jail会调用ldd检查httpd用到的库文件。而几乎所有基于共享库的二进制可执行文件都需要上述的几个库文件。 (3)然后,将httpd的相关文件拷贝到“监牢”的相关目录中,命令如下所示: #mkdir-p/root/chroot/httpd/etc #cp–a/etc/httpd/root/chroot/httpd/etc/ 。。。。。。 添加后的目录结构如下所示: #ll 总计56 drwxr-xr-x2rootroot409603-2313:44dev drwxr-xr-x3rootroot409603-2313:46etc drwxr-xr-x2rootroot409603-2313:46lib drwxr-xr-x2rootroot409603-2313:46selinux drwsrwxrwx2rootroot409603-2313:46tmp drwxr-xr-x4rootroot409603-2313:46usr drwxr-xr-x3rootroot409603-2313:46var (4)重新启动httpd,并使用ps命令检查httpd进程,发现该进程已经运行在监牢中,如下所示: #ps-aux|grephttpd Warning:badsyntax,perhapsabogus'-'?See/usr/share/doc/procps-3.2.7/FAQ root35460.60.338281712pts/2S13:570:00/usr/sbin/nss_pcacheoff/etc/httpd/alias root355014.23.64938817788?Rsl13:570:00/root/chroot/httpd/httpd apache35590.21.4493886888?S13:570:00/root/chroot/httpd/httpd apache35600.21.4493886888?S13:570:00/root/chroot/httpd/httpd apache35610.21.4493886888?S13:570:00/root/chroot/httpd/httpd apache35620.21.4493886888?S13:570:00/root/chroot/httpd/httpd apache35630.21.4493886888?S13:570:00/root/chroot/httpd/httpd apache35640.21.4493886888?S13:570:00/root/chroot/httpd/httpd apache35650.21.4493886888?S13:570:00/root/chroot/httpd/httpd apache35660.21.4493886888?S13:570:00/root/chroot/httpd/httpd root35680.00.14124668pts/2R+13:570:00grephttpd 本文出自:亿恩科技【www.enkj.com】 |