modsecurity规则入门(二) 及正则表达式学习

modsecurity handbook心得:

                                                                               

1.modsecurity是基于正则匹配的应用级防火墙,正则匹配是其核心也是其检测的重要方法,我认为也是可能限制其性能的一个因素,所以其CRS表达式会涉及到很多正则表达式的书写和组合,这个sql注入检测的规则尤其明显,其对特定的的sql注入形式进行匹配,为了保证匹配的完整性,对多个正则表达式进行组合。所以阅读规则需要对正则表达式比较熟悉,下面引用原文的翻译:

如果有时候使用正则表达式不知所措,请不要感到惊讶。 那是完全正常的,并且会及时消失。 您不必为了精通正则表达式而购买一本书,但是如果您这样做,一定会有所帮助。 我对现有书籍的唯一问题是,它们都涵盖了许多正则表达式风格,而我只对PCRE感兴趣。 您至少应该看两本书:

  Mastering Regular Expressions , by Jeffrey Friedl (O’Reilly, 2006),
  Regular Expressions Cookbook , by Jan Goyvaerts and Steven Levithan (O’Reilly, 2009)
     还有一些补充的正则表达式工具:
 
RegexBuddy [http://www.regexbuddy.com], a commercial tool written by the Regu lar Expression Cookbook co-author Jan Goyvaerts, is often recommended as the ultimate regular expression assistant.
 
 
The Regex Coach [http://weitz.de/regexcoach/], a free tool written by Edi Weitz.
 
 
Expresso [http://www.ultrapico.com/Expresso.htm] is a free tool (requires registra tion) from Ultrapico.
    
 希望上面的资源可以帮助你,还有正则表达式的中文站:链接
 
 
2. modsecurity的防御处理是利用事务来划分,单个请求过来就构成一个事务,事务分为5个阶段处理,这也是事务的生命周期,当请求中有上传文件的话,modsecurity也将生成单个临时文件。关于规则的配置也有规律,SecRuleEngine 可视为规则事务的引擎开关,此文件我定义在modsecurity.conf,由modsec_includes.conf添加,如果开始测试可以只开启detect模式,在include的文件中可以添加整个路径下的规则文件,而modsecurity的加载顺序会按照文件的字典顺序添加,就是文件名的字母顺序,也可以利用数字顺序来命名文件保证规则文件按序加载,查看CRS核心规则库也可以发现文件名的命名基本按照规则的id大小顺序来命名,其中id较小的规则也对应事务较早处理阶段。
 
                              
                                       
 
3.其中为了方便查看日志可以设置日志的级别和路径,利用 ctl:debugLogLevel设置单个事务的日志级别,
 
 
   
  而auditlog会记录整个HTTP事务数据:
 
            

使用logdata会包含将数据包含在错误信息作为其一部分,有时候查看403错误可以直接查看nginx的log目录下的error.log,因为在1-3的日志下,modsecurity将meaning日志自动输出到error.log下面。

4.规则里面的变量有一大类是集合操作,其中可以读写的集合如TX,可以由我们自己定义和修改集合中的变量,这个变量也是事务绑定的,集合中可以用:指定一个成员,在变量前面增加!也可以排除特定的变量,利用&可以获取集合中成员的计数,用来判断变量是否存在,为了确定多个变量,可以在集合冒号后面使用正则匹配,用/和/包围表达式,转换函数以t:定义,通常以t:none为开头保证初始化转换流程,一般会定义一连串的转换函数来保证拦截的准确性和避免利用编码来逃过检测。
 
5.元数据操作(id,rev,msg,tag,severity,logdata),例如allow操作可以有不同程度的影响,如影响阶段或者整个事务过程,利用skip可以实现if-else的处理逻辑,也可以利用两个重复的规则保证初次处理和再次出现处理有区别。ctl:ruleRomoveById,这个是运行时排除规则,需要在规则定义之前执行,而配置时排除规则可以使用 SecRuleRemoveById,这个需要放在规则定义的后面。
 
6.还有一块就是持久化处理,modsecurity对变量的处理和获取主要是事务级别的,这在大多数适用,但有些处理需要结合多个请求,于是就必须得要对集合记录进行持久化,产生有状态的处理效果,相当于有个集合的数据库,可以随时把变量进行保存和恢复,可用于周期告警、Dos攻击检测,暴力破解检测。initcol可以初始化集合,expirevar用于设置集合变量的过期时间,depreciation可以设置变量的衰减时间,使用setvar:!也可以删除指定的变量。
 
7.还需要强调链式规则的情况,链式规则比如说第二规则,仅当规则匹配后操作才会执行,而第一个规则的操作,如元数据操作仅当整个链都匹配的时候才会执行,而除去元数据操作,如setvar操作在第一个规则匹配上就会执行。