apache安全优化
作者:timo 联系方式: greycd ## gmail dot com 如何使web服务器安全(apache) web服务器(apache) 一个像apache这样的web服务器,它最主要的功能是能让HTML页面在客户端浏览器上显现。 功能 web服务器需要能接入互联网,只需要对静态HTML页面提供支持 服务器能支持基于名字的虚拟主机 一些页面只能某些特殊的IP和用户才能访问(基本的认证) 服务器需要记录web请求的日志(包括浏览器的信息) web服务器必须对PHP/Perl脚本语言支持 PHP/Perl组件必须能在本地MySQL数据库中读写用户信息 安全设想 1. 操作系统越坚固越好,包括低于本地和远程攻击 2. 服务器除了HTTP,最好不要提供其他任何网络服务 3. 远程访问服务器必须通过防火墙,关闭所有出去的连接,和只放过HTTP访问连接。 4. 在系统上必须只有一个有效的Apache服务 5. 只有完全必须的apache模块才被装载 6. 任何诊断web页面和自动目录索引服务必须被关闭 7. 服务器只能透露最少的关于自身的信息 8. apache服务必须运行在一个单独的UID/GID下,不能使用其它任何的系统进程 9. apache服务进程被续被限制访问文件系统(chrooting) 10. 不能有shell程序能在apache的chrooted环境中出现 11. PHP配置必须内建的安全机制 12. PHP脚本只能在chrooted环境中执行 13. apache服务器必须拒绝所有请求(GET和POST),含有HTML标记(跨站攻击)或者“’”和”””(可能有SQL注入攻击) 14. 不能有PHP警告和错误信息显示给正式访问的用户 15. 记录进站的GET和PORT请求到一个日志文件。 操作系统 UNIX或者类UNIX例如Linux,FreeBSD等等对于Apache最合适,微软的windows只能提供非常有限的安全能力,对于apache并不合适 先决条件 1. 如果你需要apache和ssl安全认证支持,那OpenSSL就需要先被安装 2. 如何需要apache和postgresql数据库连接支持,那先要安装postgresql或者需要mysql数据库支持那就安装mysql 3. 如果需要LDAP目录支持那还要安装OpenLDAP 4. 如果需要IMAP和POP能力,那还要装IMAP和POP 软件准备 1. UNIX兼容的命令 2. 含有/var/tmp目录 3. RedHat Linux 4. 所有步骤使用root帐户 5. apache版本为1.3 6. Mod_SSL 7. Mod_Perl 8. 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包放在同一目录中 ```c
[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/解压包
c
[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
c
[root@localhost]# cd apache_1.3.37Configure
c
[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 installMod_PERL
c
[root@localhost] cd ../mod_perl-version.version/ [root@localhost] perl Makefile.PL EVERYTHING=1 APACHE_SRC=../apache_1.3.37/src USE_APACI=1 PREP_HTTPD=1 DO_HTTPD=1 [root@localhost]/mod_perl-version.version# make && make installApache
c
- [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
安装步骤二 Chroot Jail chroot一个能让你改变一个系统的root权限到另外一个地方,所以从入侵者来说是一个事实的root系统将很安全。 优点 1. apache默认是运行于一个非root帐户,作为一个拥有本地shell的普通帐户将限制一些危险的操作。 2. 主要的好处是,jail作为文件的一部分,后台程序在这个jail中将视作为根目录 3. jail只需要支持apache,在jail中程序的有效性将被极大的限制。 4. 不再需要setuid-root程序。 5. 如果apache被侵害,攻击者将不能访问真实的文件系统 6. 允许访问你服务器的CGI脚本将不能执行 7. 有一些扩展的库你需要在chroot jail中为了使apache能够执行 8. 如果你使用任何Perl/CGI特性在apache中,你需要拷贝必须的二进制文件,Perl库和在chroot环境中适当的文件。如一些支持SSL,PHP,LDAP,PostgreSQL以及其他的第三方程序。 寻找依赖
c
[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)创建目录结构 (像依赖的一样)
c
[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拷贝所有发现的依赖文件(包括相应权限)到所创建的目录中
c
[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程序的权限,使用以下命令
c
[root@localhost ]/# chmod 750 /usr/bin/dbmmanage创建一个用户名和密码使用以下命令
c
[root@deep ]/# /usr/bin/dbmmanage /etc/httpd/.dbmpasswd adduser username New password: Re-type new password: User username added with password encrypted to l4jrdAL9MH0K.拷贝/etc/passwd /etc/group文件到/chroot/httpd/etc下,同时移出所有帐户和组出了apache运行所依赖的
c
[root@localhost ]/# cp /etc/passwd /chroot/httpd/etc/ [root@localhost ]/# cp /etc/group /chroot/httpd/etc/编辑passwd文件
c
vi /chroot/httpd/etc/passwd www:x:80:80::/home/www:/bin/bash编辑passwd文件
c
vi /chroot/httpd/etc/group www:x:80:你还需要/etc/resolv.conf文件和/etc/nsswitch.conf以及/etc/hosts文件在你的chroot jail中相同的目录结构来解析主机名。 第三步 安全的CGI应用程序 配置PHP 增加以下行到httpd.conf中
c
AddModule mod_php4.c AddType application/x-httpd-php .php AddType application/x-httpd-php .inc AddType application/x-httpd-php .class修改PHP配置文件(/chroot/httpd/usr/local/lib/php.ini)
c
Parameter Description safe_mode = On safe_mode_gid = Off open_basedir = directory[:…] (只有这个目录脚本文件才能使用) safe_mode_exec_dir = directory[:…] (apache拒绝执行程序目录) expose_php = Off (不要显示php info) register_globals = Off display_errors = Off log_errors = On error_log = filename修改文件扩展名 把所有\*.php文件改为*.dhtml(举例),所以需要修改/chroot/httpd/usr/local/apache/conf/httpd.conf文件增加以下
c
AddType application/x-httpd-php .php AddType application/x-httpd-php .dhtmlweb用户将看不到*.php扩展名在url地址中,实际已经PHP技术已经被使用在服务器上。 The last step - Defending against CSS and SQL Injection attacks In order to perform that, we will use the mod_security module, which we enable by adding the following line into httpd.conf:
c
AddModule mod_security.cTo enable logging of the GET and POST requests, it suffices to add the following section to httpd.conf:
c
AddHandler application/x-httpd-php .php SecAuditEngine On SecAuditLog logs/audit_log SecFilterScanPOST On SecFilterEngine On最后一步--防御拒绝CSS和SQL注入攻击 为了实现这个功能,我们将使用mod_security模块,所以我们需要加入下面这行在httpd.conf中
c
AddModule mod_security.c为了实现记录GET和POST请求,需要在httpd.conf增加下面这段
c
AddHandler application/x-httpd-php .php SecAuditEngine On SecAuditLog logs/audit_log SecFilterScanPOST On SecFilterEngine On超出的命令需要audit引擎来记录,如登录请求;以及过滤POST引擎,它能记录POST请求到日志中。为了防止web应用程序被CSS攻击,以下这几行也要被加入到之前
c
SecFilterDefaultAction “deny,log,status:500” SecFilter ““