如何让web服务器(apache)更安全

联系方式: greycd ## gmail dot com

                                               

如何使web服务器安全(apache)


web服务器(apache)
一个像apache这样的web服务器,它最主要的功能是能让HTML页面在客户端浏览器上显现。

功能 web服务器需要能接入互联网,只需要对静态HTML页面提供支持
服务器能支持基于名字的虚拟主机
一些页面只能某些特殊的IP和用户才能访问(基本的认证)
服务器需要记录web请求的日志(包括浏览器的信息)
web服务器必须对PHP/Perl脚本语言支持
PHP/Perl组件必须能在本地MySQL数据库中读写用户信息

安全设想
  • 操作系统越坚固越好,包括低于本地和远程攻击               
  • 服务器除了HTTP,最好不要提供其他任何网络服务               
  • 远程访问服务器必须通过防火墙,关闭所有出去的连接,和只放过HTTP访问连接。               
  • 在系统上必须只有一个有效的Apache服务               
  • 只有完全必须的apache模块才被装载               
  • 任何诊断web页面和自动目录索引服务必须被关闭               
  • 服务器只能透露最少的关于自身的信息               
  • apache服务必须运行在一个单独的UID/GID下,不能使用其它任何的系统进程               
  • apache服务进程被续被限制访问文件系统(chrooting)               
  • 不能有shell程序能在apache的chrooted环境中出现               
  • PHP配置必须内建的安全机制               
  • PHP脚本只能在chrooted环境中执行               
  • apache服务器必须拒绝所有请求(GET和POST),含有HTML标记(跨站攻击)或者“'”和"""(可能有SQL注入攻击)               
  • 不能有PHP警告和错误信息显示给正式访问的用户               
  • 记录进站的GET和PORT请求到一个日志文件。               
操作系统 UNIX或者类UNIX例如Linux,FreeBSD等等对于Apache最合适,微软的windows只能提供非常有限的安全能力,对于apache并不合适
先决条件
  • 如果你需要apache和ssl安全认证支持,那OpenSSL就需要先被安装               
  • 如何需要apache和postgresql数据库连接支持,那先要安装postgresql或者需要mysql数据库支持那就安装mysql               
  • 如果需要LDAP目录支持那还要安装OpenLDAP               
  • 如果需要IMAP和POP能力,那还要装IMAP和POP               



软件准备
  • UNIX兼容的命令               
  • 含有/var/tmp目录               
  • RedHat        Linux        
  • 所有步骤使用root帐户               
  • apache版本为1.3               
  • Mod_SSL               
  • Mod_Perl               
  • Mod_PHP               

Apache: http://www.apache.org/
Mod_Perl: http://perl.apache.org/
Mod_SSL: http://www.modssl.org/
Mod_PHP: http://www.php.net/
没有的话就去上述网站下载
安装步骤一 把所有tar包放在同一目录中
[root@localhost]/#cp apache_version.tar.gz /var/tmp
[root@localhost]/#cp mod_ssl-version-version.tar.gz /var/tmp
[root@localhost]/#cp mod_perl-version.tar.gz /var/tmp
[root@localhost]/#cp php-version.tar.gz /var/tmp
[root@localhost]/#cd /var/tmp/
解压包
[root@localhost]/tmp#tar xzpf apache_version.tar.gz
[root@localhost]/tmp#tar xzpf mod_ssl-version-version.tar.gz
[root@localhost]/tmp#tar xzpf mod_perl-version.tar.gz
[root@localhost]/tmp#tar xzpf php-version.tar.gz

Mod_SSL [root@localhost]/#cd mod_ssl-version-version
[root@localhost]/#CC="egcs" CFLAGS="-O9 -funroll-loops -ffast-math-malign-double -mcpu=pentiumpro -march=pentiumpro-fomit-frame-pointer -fno-exceptions" ./configure--with-apache=../apache_1.3.37 --with-crt=/etc/ssl/certs/server.crt--with-key=/etc/ssl/private/server.key


*CC– C 编译器
**egcs– 增强GNU边一起
***CFLAGS– O2 (i386), O3 (i586), O9 (i686) 优化选项
PHP 4 [root@localhost]#cd apache_1.3.37
Configure
[root@localhost]#CC="egcs" OPTIM="-O9 -funroll-loops -ffast-math-malign-double -mcpu=pentiumpro -march=pentiumpro-fomit-frame-pointer -fno-exceptions"CFLAGS="-DDYNAMIC_MODULE_LIMIT=0" \
./configure\
--prefix=/home/httpd\
--bindir=/usr/bin\
--sbindir=/usr/sbin\
--libexecdir=/usr/lib/apache\
--includedir=/usr/include/apache\
--sysconfdir=/etc/httpd/conf\
--localstatedir=/var\
--runtimedir=/var/run\
--logfiledir=/var/log/httpd\
--datadir=/home/httpd\
--proxycachedir=/var/cache/httpd\
--mandir=/usr/man
--proxycachedir=/var/cache/httpd\
--mandir=/usr/man
[root@deep]/php-4.0# make && make install
Mod_PERL [root@localhost]cd ../mod_perl-version.version/
[root@localhost]perl Makefile.PL EVERYTHING=1 APACHE_SRC=../apache_1.3.37/srcUSE_APACI=1 PREP_HTTPD=1 DO_HTTPD=1
[root@localhost]/mod_perl-version.version#make && make install
Apache [root@localhost]/apache1.3.37# SSL_BASE=SYSTEM EAPI_MM=SYSTEM  CC="egcs" OPTIM="-O9 -funroll-loops -ffast-math-malign-double -mcpu=pentiumpro   -march=pentiumpro-fomit-frame-pointer-fno-exceptions" CFLAGS="- DDYNAMIC_MODULE_LIMIT=0" \
./configure\
--prefix=/home/httpd\
--bindir=/usr/bin\
--sbindir=/usr/sbin\
--libexecdir=/usr/lib/apache\
--includedir=/usr/include/apache\
--sysconfdir=/etc/httpd/conf\
--localstatedir=/var\
--runtimedir=/var/run\
--logfiledir=/var/log/httpd\
--datadir=/home/httpd\
--proxycachedir=/var/cache/httpd\
--mandir=/usr/man\
--add-module=src/modules/experimental/mod_mmap_static.c\
--add-module=src/modules/standard/mod_auth_db.c\
--enable-module=ssl\
--enable-rule=SSL_SDBM\
--disable-rule=SSL_COMPAT\
--activate-module=src/modules/php4/libphp4.a\
--enable-module=php4\
--activate-module=src/modules/perl/libperl.a\
--enable-module=perl\
--disable-module=status\
--disable-module=userdir\
--disable-module=negotiation\
--disable-module=autoindex\
--disable-module=asis\
--disable-module=imap\
--disable-module=env\
--disable-module=actions
[root@localhost]/apache1.3.37#make && make install
安装步骤二ChrootJail
chroot一个能让你改变一个系统的root权限到另外一个地方,所以从入侵者来说是一个事实的root系统将很安全。
优点
  • apache默认是运行于一个非root帐户,作为一个拥有本地shell的普通帐户将限制一些危险的操作。               
  • 主要的好处是,jail作为文件的一部分,后台程序在这个jail中将视作为根目录               
  • jail只需要支持apache,在jail中程序的有效性将被极大的限制。               
  • 不再需要setuid-root程序。               
  • 如果apache被侵害,攻击者将不能访问真实的文件系统               
  • 允许访问你服务器的CGI脚本将不能执行               
  • 有一些扩展的库你需要在chroot        jail中为了使apache能够执行               
  • 如果你使用任何Perl/CGI特性在apache中,你需要拷贝必须的二进制文件,Perl库和在chroot环境中适当的文件。如一些支持SSL,PHP,LDAP,PostgreSQL以及其他的第三方程序。               


寻找依赖 [root@localhost]/#ldd /usr/sbin/httpd
  libpam.so.0=>/lib/libpam.so.0 (0x40016000)
  libm.so.6=>/lib/libm.so.6 (0x4001f000)
  libdl.so.2=>/lib/libdl.so.2 (0x4003b000)
  libcrypt.so.1=>/lib/libcrypt.so.1 (0x4003e000)
  libnsl.so.1=>/lib/libnsl.so.1 (0x4006b000)
  libresolv.so.2=>/lib/libresolv.so.2 (0x40081000)
  libdb.so.3=>/lib/libdb.so.3 (0x40090000)
  libc.so.6=>/lib/libc.so.6 (0x400cb000)
  /lib/ld-linux.so.2=>/lib/ld-linux.so.2 (0x40000000)

创建目录结构 (像依赖的一样) [root@localhost]/# mkdir /chroot/httpd
[root@localhost]/# mkdir /chroot/httpd/dev
[root@localhost]/# mkdir /chroot/httpd/lib
[root@localhost]/# mkdir /chroot/httpd/etc
[root@localhost]/# mkdir -p /chroot/httpd/usr/sbin
[root@localhost]/# mkdir -p /chroot/httpd/var/run
[root@localhost]/# mkdir -p /chroot/httpd/var/log/httpd
[root@localhost]/# chmod 750
  /chroot/httpd/var/log/httpd/
[root@localhost]/# mkdir -p /chroot/httpd/home/httpd

拷贝所有发现的依赖文件(包括相应权限)到所创建的目录中 [root@localhost]/# cp -r /etc/ssl /chroot/httpd/etc/ 如果你需要mod_ssl所必须的
[root@localhost]/# chmod 600 /chroot/httpd/etc/ssl/certs/ca.crt 如果你需要mod_ssl所必须的
[root@localhost]/# chmod 600 /chroot/httpd//etc/ssl/certs/server.crt 如果你需要mod_ssl所必须的
[root@localhost]/# chmod 600 /chroot/httpd/etc/ssl/private/ca.key  如果你需要mod_ssl所必须的
[root@localhost]/# chmod 600 /chroot/httpd/etc/ssl/private/server.key 如果你需要mod_ssl所必须的

使用.dbmpasswd密码文件进行用户认证改变dbmmanage程序的权限,使用以下命令
[root@localhost]/# chmod 750 /usr/bin/dbmmanage
创建一个用户名和密码使用以下命令
[root@deep]/# /usr/bin/dbmmanage /etc/httpd/.dbmpasswd adduser username
Newpassword:
Re-typenew password:
Userusername added with password encrypted to l4jrdAL9MH0K.


拷贝/etc/passwd/etc/group文件到/chroot/httpd/etc下,同时移出所有帐户和组出了apache运行所依赖的
   [root@localhost]/# cp /etc/passwd /chroot/httpd/etc/
   [root@localhost]/# cp /etc/group /chroot/httpd/etc/
编辑passwd文件
vi/chroot/httpd/etc/passwd
   www:80:80::/home/www:/bin/bash
编辑passwd文件
vi/chroot/httpd/etc/group
   www:80:
你还需要/etc/resolv.conf文件和/etc/nsswitch.conf以及/etc/hosts文件在你的chrootjail中相同的目录结构来解析主机名。

第三步  安全的CGI应用程序配置PHP增加以下行到httpd.conf中
AddModulemod_php4.c
AddTypeapplication/x-httpd-php .php
AddTypeapplication/x-httpd-php .inc
AddTypeapplication/x-httpd-php .class

修改PHP配置文件(/chroot/httpd/usr/local/lib/php.ini) Parameter        Description
safe_mode= On
safe_mode_gid= Off
open_basedir= directory[:...] (只有这个目录脚本文件才能使用)
safe_mode_exec_dir= directory[:...] (apache拒绝执行程序目录)
expose_php= Off (不要显示phpinfo)
register_globals= Off
display_errors= Off
log_errors= On
error_log= filename

修改文件扩展名 把所有*.php文件改为*.dhtml(举例),所以需要修改/chroot/httpd/usr/local/apache/conf/httpd.conf文件增加以下
AddTypeapplication/x-httpd-php .php
AddTypeapplication/x-httpd-php .dhtml
web用户将看不到*.php扩展名在url地址中,实际已经PHP技术已经被使用在服务器上。


Thelast step - Defending against CSS and SQL Injection attacks
  Inorder to perform that, we will use the mod_security module, which weenable by
   addingthe following line into httpd.conf:
  AddModulemod_security.c
Toenable logging of the GET and POST requests, it suffices to add thefollowing section
   tohttpd.conf:
  <IfModulemod_security.c>
      AddHandlerapplication/x-httpd-php .php
      SecAuditEngineOn
      SecAuditLoglogs/audit_log
      SecFilterScanPOSTOn
      SecFilterEngineOn
  </IfModule>
最后一步--防御拒绝CSS和SQL注入攻击为了实现这个功能,我们将使用mod_security模块,所以我们需要加入下面这行在httpd.conf中
  AddModulemod_security.c
为了实现记录GET和POST请求,需要在httpd.conf增加下面这段
  <IfModulemod_security.c>
      AddHandlerapplication/x-httpd-php .php
      SecAuditEngineOn
      SecAuditLoglogs/audit_log
      SecFilterScanPOSTOn
      SecFilterEngineOn
  </IfModule>
超出的命令需要audit引擎来记录,如登录请求;以及过滤POST引擎,它能记录POST请求到日志中。为了防止web应用程序被CSS攻击,以下这几行也要被加入到</IfModule>之前
    SecFilterDefaultAction"deny,log,status:500"
    SecFilter"<(.|\n)+>“
第一行是用来当请求包含任何安全过滤变量的搜索断语将返回“服务器内部错误”
第二行在搜索HTML标记的GET和POST请求中建立过滤



一个标准的SQL注入攻击是在GET和POST请求中包含"'"(单引号)和"""(双引号)。为了句句所有包含这些字符的请求,我们标记SQL注入技术非常困难。
     SecFilter"'"
     SecFilter"\""
尽管过滤像<,>,',"这些字符让我们防护拒绝CSS和SQL注入攻击,它将导致PHP应用程序中不正确的函数。它的发生,是由于合法的用户将不能使用这些字符在HTML表单中。为了解决这个问题,JavaScript语言使得在客户端执行用来代替这些被禁止的特殊标记像<> " 等等
小结 要在使用服务器段技术(PHP,ASP,JSP等)的服务器安全是非常困难的在实际中
理由如下:
  • 服务器自己不能反对糟糕的编程。               
  • 服务器段技术(PHP,ASP,JSP)的弱点也能制造web服务器攻击倾向。               
  • 为了web服务器更安全,打上所有的安全补丁和移出不必要的文件是必须的。               
  • 我们不能忘记整个环境的安全不仅依赖apache和php的配置,更依赖于web应用程序的自身。               
  • 程序员需要分析代码和程序在被实施到正式服务器之前。               
  • 日志的合理监控和CGI行为必须在没有攻击的情况下长久运行在服务器上