如何让web服务器(apache)更安全
cnleon
|
1#
cnleon 发表于 2008-05-11 10:53
如何让web服务器(apache)更安全
联系方式: greycd ## gmail dot com
如何使web服务器安全(apache) web服务器(apache) 一个像apache这样的web服务器,它最主要的功能是能让HTML页面在客户端浏览器上显现。 功能 web服务器需要能接入互联网,只需要对静态HTML页面提供支持 服务器能支持基于名字的虚拟主机 一些页面只能某些特殊的IP和用户才能访问(基本的认证) 服务器需要记录web请求的日志(包括浏览器的信息) web服务器必须对PHP/Perl脚本语言支持 PHP/Perl组件必须能在本地MySQL数据库中读写用户信息 安全设想
先决条件
软件准备
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系统将很安全。 优点
寻找依赖 [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等)的服务器安全是非常困难的在实际中 理由如下:
|