ModSecurity是一种用于web程序的保护和检测引擎。它采用内嵌入web服务器,防止黑客的攻击,充当了有力的保护伞。具有以下特点:
(1) 请求过滤:当请求提交时,在对提交的数据被web服务器或其他程序使用之前进行分析。
(2)避免逃避技术:在对数据进行分析之前将路径和参数一般化,以避免遗漏。
(3) 理解HTTP协议:由于引擎能够理解HTTP协议,故能进行特殊的细粒度的检查
(4)POST数据分析:引擎将截取采用POST方式传递的数据
(5) 审计纪录:能够详细记录每一组请求的内容(包括POST的内容)以备日后详细分析
(6)HTTPS过滤:由于引擎内嵌入服务器,所以可以访问解密后的请求数据
====================================
1,安装mod security 模块
2,编辑httpd.conf,添加:
LoadModule security_module extramodules/mod_security.so
SecFilterEngine On
Include conf/mod_security.conf
这会调入mod_security.so模块,启动引擎,并包含mod_security.conf文件(根据你使用的版本不同,路径可能不同)。包含一个独立配置文件的理由,是从正常的Apache指令中分离mod_security规则。一旦这些完成后,mod_security文件将包含所有的 mod_security规则;而每次这些规则改变之后,Apache都必须重新加载。
一些示例规则有:
SecAuditLog logs/audit_log
SecAuditEngine RelevantOnly
SecFilterScanPOST On
SecFilterDefaultAction "deny,log,status:500"
SecFilter /etc/passwd
SecFilter "../"
SecFilter "<[[:space:]]*script"
第一条打开了审核记录,并告诉他只记录相应的违反策略事件,这样可以非常容易的识别和记录问题。然后,mod_security被告知扫描所有的POST请求,首先拒绝,然后记录,并返回一个违反策略的“错误500”页面,而不是允许Web服务器执行该请求。
SecFilter 指令则是建立一个真实的策略过滤器。在本例中,所有带有字符串“/etc/passwd”的请求都会被拒绝。这样,路径移动攻击,或者任何带有“../” 字符串的都被禁止在他们的路径里。最后的SecFilter则是一个便宜的XSS过滤器,只允许普通的HTML标记。
mod_security非常强大,许多网站都提供了不同的规则。诀窍就是从小的开始,建立适当的过滤器。对某人有用的,未必适合你,或未必适合你所安装的软件,对mod_security你最后希望的是停止正统的通讯和请求。
===============================
核心规则内容
为了提供一般WEB应用保护,核心规则使用以下技术:
· HTTP保护 - HTTP协议正规划检测,并启用本地有效策略
· 一般WEB攻击保护 - 检测一般WEB应用的安全攻击
· 自动检测 - 检测机器人、爬虫、扫描器和其他的表面恶意行动
· 木马检测 - 检测木马程序进入
· 过失隐藏 - 伪装服务器发出错误消息
===============================
配置文件解释:
(1)打开/关闭过滤器
过滤器缺省情况下是关闭的,要启用该功能,你可以打开它
SecFilterEngine On
(2)POST扫描
POST载荷扫描缺省情况下是关闭的,要启用该功能,你可以打开它
SecFilterScanPOST On
(3)缺省行为 action
当提交的请求满足某一过滤器时,需要采取一定的行为。个别的过滤器都有自己的行为,但实际上,你想要为所有的过滤器定义一系列的行为。你可以通过定义SecFilterDefaultAction来进行配置。
SecFilterDefaultAction “deny,log,status:404”
(4)过滤器继承
对父文件夹定义的过滤器通常被子文件夹继承。这一行为在大多数情况下是可以接受的(也是必需的),但是并不总是适用。有时你需要放松站点某些部分的检查。可以使用以下配置
SecFilterInheritance Off
(5)URL编码有效性
特殊字符在URL中传输之前必须经过编码。任何字符都可以用%XY的形式替代,这里的XY是十六进制编码的。十六进制数只有从A到F的字母,但有时黑客使用其他字母来愚弄编码算法。Mod_security检查所有编码以保证其有效性,配置语句为:
SecFilterCheckURLEncoding Off
注意,当使用”multipart/form-data”编码(文件上传)时,不会对POST的内容进行检查
(6)字节范围检查
你可以强制要求请求的内容包括一定字节范围。这在避免堆栈溢出攻击方面有一定的效果(因为它们通常包含随机的),如果想只允许32到126字节的内容,可以使用以下配置
SecFilterForceByteRang 32 126
缺省的范围是从0到255,即所有范围都被允许。注意:这一选项不会检查使用”multipart/form-data”编码的POST内容。
(7)允许他人看见 mod_security
通常,入侵者不能判断web服务器是否运行了mod_security。你可以通过发送定制的消息或特殊的HTTP编码(如406)来讲自己阻挡在门外。如果你想隐藏信息,那么最好是发送HTTP 500,含义是”Internal Server Error”(服务器内部错误),入侵者受到这个消息之后会认为web服务器已经崩溃了。
(8)简单过滤器
mod_security提供的最简单的过滤器形式的确相当简单,看起来像这样
SecFilter KEYWORD
对每一次像这样的简单过滤器,mod_security将要检查请求中的关键字。检查的范围相当广,这将应用到请求的第一行(看起来像这样”GET /
index.php?parameter=value HTTP/1.0”)。对于POST请求,将搜索body部分(如果设置了SecFilterScanPOST On)
(9)路径规则化
过滤器不会应用于原始的请求数据,而是应用于规则化之后的数据。我们这样做是因为入侵者可以(并且多半)使用各种逃避手段来避免检测。例如,你可能想要设置一个过滤器来检测执行shell命令
SecFilter /bin/sh
但是入侵者可以使用/bin/./sh来绕过过滤器。当前版本的mod_security可以进行以下转换:
。 减少 /./ 为 /
。 检验URL编码(可选)
。 只允许一定范围的字节(可选)
。 解码URL
。 减少 // 为 /
(10)正则表达式
记住最简单的过滤器设置,看起来是这样的
SecFilter KEYWORD {ACTIONS}
在定义关键字的时候不仅仅局限于一个词,你可以使用能够想到的任何正则表达式。为了充分利用这款强有力的工具,你需要对正则表达式有一定的了解,我建议你从以下的资源开始:
。 Perl正则表达式 http://www.perldoc.com/
。 精通正则表达式 http://www.oreilly.com/catalog/regex/
。 Google搜索引擎关于正则表达式的搜索 http://www.google.com
(11)反转表达式
如果感叹号是一条正则表达式的第一个字符,过滤器将其以反义对待。例如:
SecFilter “!php”
将对拒绝所有不包含”php”的请求。
(12)高级过滤器
虽然SecFilter能够让你快速上手,但是你会很快发现这种搜索太宽泛并且不能很好的工作。可以使用另外一个参数
SecFilterSelective LOCATION KEYWORD {ACTION}
它允许你精确选择搜索匹配。KEYWORD和ACTIONS与SecFilter中是一样的,LOCATION位需要进一步的解释。参数LOCATION由一系列管道符号分隔的位置标识构成,例如
SecFilterSelective “REMOTE_ADDR|REMOTE_HOST” KEYWORD
这样就只会搜索客户端的IP地址和主机名。可用的位置包括所有的CGI变量,和一些其他的变量,以下是完整的列表:
l REMOTE_ADDR l REMOTE_HOST l REMOTE_USER l REMOTE_IDENT l REQUEST_METHOD l SCRIPT_FILENAME l PATH_INFO l QUERY_STRING l AUTH_TYPE l DOCUMENT_ROOT l SERVER_ADMIN l SERVER_NAME l SERVER_ADDR l SERVER_PORT l SERVER_PROTOCOL l SERVER_SOFTWARE l TIME_YEAR l TIME_MON l TIME_DAY l TIME_HOUR l TIME_MIN l TIME_SEC l TIME_WDAY l TIME l API_VERSION l THE_REQUEST l REQUEST_URI l REQUEST_FILENAME l IS_SUBREQ 还有一些特殊的位置: l POST_PAYLOAD 过滤POST请求的有效载荷 l ARGS 过滤参数,同“QUERY_STRING|POST_PAYLOAD” l ARGS_NAMES 仅变量/参数名 l ARGS_VALUES 仅变量/参数值 l HTTP_header 搜索请求头部 l ENV_variable 搜索环境变量 l ARG_variable 搜索请求变量/参数