如何使用mod_security加强Apache的安全性?
如何使用mod_security加强Apache的安全性?
使用mod_security加强Apache的安全性
目录:
一. 介绍
二. 准备
1. 需要的软件包
2. 下载和解压缩Apache HTTP软件包.
3. 下载和解压缩modsecurity软件包.
4. 下载modsecurity规则文件
三. 安装Apache和Modsecurity
1. 安装Apache
2. 安装Modsecurity
四. Modsecurity配置文件
五. 更多
一. 介绍
mod_security是一个集入侵检测和防御引擎功能的开源web应用安全程序(或web应用程序防火墙).
它以Apache Web服务器的模块方式运行, 目标是增强web应用程序的安全性, 防止web应用程序
受到已知或未知的攻击.
本文使用的系统是Redhat linux高级服务器版3, 推荐大家使用modsecurity的最新稳定发行版,
现在是1.8.7, 安装方式是通过DSO(动态共享对象)把mod_security集成到Apache Web Server.
(提示, 本文的步骤在其它linux发行版上也是适用的.)
二. 准备
1. 需要的软件包
1). apache的源代码包
下载地址:
http://apache.justdn.org/httpd/apache_1.3.33.tar.gz
2). mod_security的源代码包
下载地址:
http://www.modsecurity.org/download/modsecurity-1.8.7.tar.gz
3). mod_security基本规则
http://fedoranews.org/jorge/mod_security/mod_security.conf
2. 下载和解压缩Apache HTTP软件包.
建议从apache的官方网站获得可靠的apache HTTP软件包.
下载网址: http://apache.justdn.org/httpd/apache_1.3.33.tar.gz
1) 创建apache软件包存放的目录.
#mkdir -p /usr/local/src/webserver
2) 使用wget命令获得源代码包.
#wget http://apache.tarchive.com/httpd/apache_1.3.33.tar.gz
(如不能下载, 可直接通过浏览器保存或ftp上传到webserver目录)
3) 确认下载软件的完整性.
首先, 我们下载和检查分离的签名文件apache_1.3.33.tar.gz.md5, 然后进行
比较软件包和软件包md5签名文件的md5 checksum.
检查apache_1.3.33.tar.gz.md5内容
# cat apache_1.3.33.tar.gz.md5
MD5 (apache_1.3.33.tar.gz) = 3dfd2c3778f37a2dfc22b97417a61407
检查apache_1.3.33.tar.gz的md5 checksum
# md5sum apache_1.3.33.tar.gz
3dfd2c3778f37a2dfc22b97417a61407 apache_1.3.33.tar.gz
比较上面两个步骤的md5 checksum内容是一致的, 从而可以确认apache软件包
的完整性.
4) 解压缩源代码包, 在webserver目录下会生成一个新的目录apache_1.3.33
#tar zpxf apache_1.3.33.tar.gz
3. 下载和解压缩modsecurity软件包.
建议从modsecurity官方网站获得可靠的软件包.
下载网址: http://www.modsecurity.org/download/index.html
1) 使用wget命令获得源代码包.
#wget http://www.modsecurity.org/download/modsecurity-1.8.7.tar.gz
(如不能下载, 可直接通过浏览器保存或ftp上传到webserver目录)
# ls -al modsecurity-1.8.7.tar.gz
-rw-r--r-- 1 root root 313004 Mar 5 23:47 modsecurity-1.8.7.tar.gz
# pwd
/usr/local/src/webserver
2) 确认下载软件的完整性.
首先, 我们下载和检查分离的签名文件modsecurity-1.8.7.tar.gz.md5, 然后进行
比较软件包和软件包md5签名文件的md5 checksum.
下载modsecurity的签名文件
#wget http://www.modsecurity.org/download/modsecurity-1.8.7.tar.gz.md5
检查modsecurity-1.8.7.tar.gz.md5内容
#cat modsecurity-1.8.7.tar.gz.md5
0dd48656e451c711358c097dc80e0369 modsecurity-1.8.7.tar.gz
检查modsecurity-1.8.7.tar.gz的md5 checksum
# md5sum modsecurity-1.8.7.tar.gz
0dd48656e451c711358c097dc80e0369 modsecurity-1.8.7.tar.gz
比较上面两个步骤的md5 checksum内容是一致的, 从而可以确认modsecurity软件包
的完整性.
3) 解压缩源代码包, 在webserver目录下会生成一个新的目录modsecurity-1.8.7
#tar zpxf modsecurity-1.8.7.tar.gz
4. 下载modsecurity规则文件
#cd /usr/local/src/webserver
#wget http://fedoranews.org/jorge/mod_security/mod_security.conf
三. 安装Apache和Modsecurity
1. 安装Apache
请参考文章:
在Redhat Linux 9上通过DSO方式搭建Apache HTTP服务器
http://bbs.islab.org/showthread.php?t=370
注: 在Red Hat 9上安装Apache的步骤亦可用其它系统上.
2. 安装Modsecurity
到modsecurity的apache 1.X 模块目录运行apxs(你必须要root权限才能运行下面命令).
#cd /usr/local/src/webserver/modsecurity-1.8.7/apache1
[root@reakosys apache1]# /www/bin/apxs -cia mod_security.c
gcc -DLINUX=22 -DHAVE_SET_DUMPABLE -I/usr/include/gdbm -DUSE_HSREGEX -fpic
-DSHARED_MODULE -I/www/include -c mod_security.c
gcc -shared -o mod_security.so mod_security.o
[activating module `security' in /www/conf/httpd.conf]
cp mod_security.so /www/libexec/mod_security.so
chmod 755 /www/libexec/mod_security.so
cp /www/conf/httpd.conf /www/conf/httpd.conf.bak
cp /www/conf/httpd.conf.new /www/conf/httpd.conf
rm /www/conf/httpd.conf.new
复制modsecurity规则文件到apache的conf目录
#cd /usr/local/src/webserver
#cp mod_security.conf /www/conf/
创建日志目录
#mkdir - /var/log/httpd
修改apache配置文件
#vi /www/conf/httpd.conf
在文件末尾添加
Include conf/mod_security.conf
注: 到此为止, httpd.conf文件已包含下面三行代码(1,2条为自动, 3条手动添加)
LoadModule security_module libexec/mod_security.so
AddModule mod_security.c
Include conf/mod_security.conf
然后重启你的Apache Web Server..
# apachectl restart
/usr/sbin/apachectl restart: httpd not running, trying to start
/usr/sbin/apachectl restart: httpd started
检查一下是否生成日志文件
# ls -al
total 8
drwxr-xr-x 2 root root 4096 May 22 21:29 .
drwxr-xr-x 10 root root 4096 May 22 21:02 ..
-rw------- 1 root root 0 May 22 21:18 audit_log
-rw------- 1 root root 0 May 22 21:18 modsec_debug_log
modsecurity的配置文件mod_security.conf位于apache的配置目录conf中, 日志文件
是/var/log/httpd/audit_log.
modsecurity配置文件包含了一些非常基础的规则设置, 这对于一般的站点而言是足够了.
如果你有什么特殊的需求, 更多可以参考下面的网址:
http://www.modsecurity.org/documentation/index.html
下面将介绍mod_security.conf配置文件.
四. Modsecurity配置文件
<IfModule mod_security.c>
# Turn the filtering engine On or Off
SecFilterEngine On
分析每一个http请求
# Make sure that URL encoding is valid
SecFilterCheckURLEncoding On
URL编码确认
# Only allow bytes from this range
SecFilterForceByteRange 32 126
字节范围检查, 以有效防止stack overflow attacks(栈溢出攻击).
# The audit engine works independently and
# can be turned On of Off on the per-server or
# on the per-directory basis
SecAuditEngine RelevantOnly
有效解决apache日志对某个用户或攻击者信息记录的不足. 如果要
对某一个用户或攻击者发出的一个请求的详细记录, 可以访问
/var/log/httpd/audit_log文件.
# The name of the audit log file
SecAuditLog /var/log/httpd/audit_log
SecFilterDebugLog /var/log/httpd/modsec_debug_log
SecFilterDebugLevel 0
设置调试模式下的输出文件.
# Should mod_security inspect POST payloads
#SecFilterScanPOST On
# Action to take by default
SecFilterDefaultAction "deny,log,status:406"
设置特别的行动, 406为行动名称, 前面的三个为行动参数.
# Redirect user on filter match
#SecFilter xxx redirect:http://www.webkreator.com
# Execute the external script on filter match
#SecFilter yyy log,exec:/home/ivanr/apache/bin/report-attack.pl
# Simple filter
#SecFilter 111
# Only check the QUERY_STRING variable
#SecFilterSelective QUERY_STRING 222
# Only check the body of the POST request
#SecFilterSelective POST_PAYLOAD 333
# Only check arguments (will work for GET and POST)
#SecFilterSelective ARGS 444
# Test filter
#SecFilter "/cgi-bin/keyword"
# Another test filter, will be denied with 404 but not logged
# action supplied as a parameter overrides the default action
#SecFilter 999 "deny,nolog,status:404"
# Prevent OS specific keywords
#SecFilter /etc/password
# Prevent path traversal (..) attacks
SecFilter "/././"
阻止目录周游攻击.
# Weaker XSS protection but allows common HTML tags
SecFilter "<( |/n)*script"
对不安全的(跨站点脚本)XSS进行保护, 但允许普通的HTML标识.
# Prevent XSS atacks (HTML/Javascript injection)
SecFilter "<(.|/n)+>"
防止XSS攻击 (HTML/Javascript注射)
# Very crude filters to prevent SQL injection attacks
SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"
防止SQL注射攻击
# Require HTTP_USER_AGENT and HTTP_HOST headers
SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"
需要 HTTP_USER_AGENT和HTTP_HOST头.
# Forbid file upload
#SecFilterSelective "HTTP_CONTENT_TYPE" multipart/form-data
# Only watch argument p1
#SecFilterSelective "ARG_p1" 555
# Watch all arguments except p1
#SecFilterSelective "ARGS|!ARG_p2" 666
# Only allow our own test utility to send requests (or Mozilla)
#SecFilterSelective HTTP_USER_AGENT "!(mod_security|mozilla)"
# Do not allow variables with this name
#SecFilterSelective ARGS_NAMES 777
# Do now allow this variable value (names are ok)
#SecFilterSelective ARGS_VALUES 888
# Stop spamming through FormMail
# note the exclamation mark at the beginning
# of the filter - only requests that match this regex will
# be allowed
#<Location /cgi-bin/FormMail>
#SecFilterSelective "ARG_recipient" "!@webkreator.com$"
#</Location>
# when allowing upload, only allow images
# note that this is not foolproof, a determined attacker
# could get around this
#<Location /fileupload.php>
#SecFilterInheritance Off
#SecFilterSelective POST_PAYLOAD "!image/(jpeg|bmp|gif)"
#</Location>
</IfModule>