ModSecurity3 + OWASP CRS

一、ModSecurity简介

ModSecurity是一个开源的跨平台Web应用程序防火墙(WAF)引擎,用于Apache,IIS和Nginx,由Trustwave的SpiderLabs开发。作为WAF产品,ModSecurity专门关注HTTP流量,当发出HTTP请求时,ModSecurity检查请求的所有部分,如果请求是恶意的,它会被阻止和记录。

完美兼容nginx,是nginx官方推荐的WAF

支持OWASP规则

3.0版本比老版本更新更快,更加稳定,并且得到了nginx、Inc和Trustwave等团队的积极支持

中文社区:http://www.modsecurity.cn/

ModSecurity的功能

  • SQL Injection (SQLi):阻止SQL注入
  • Cross Site Scripting (XSS):阻止跨站脚本攻击
  • Local File Inclusion (LFI):阻止利用本地文件包含漏洞进行攻击
  • Remote File Inclusione(RFI):阻止利用远程文件包含漏洞进行攻击
  • Remote Code Execution (RCE):阻止利用远程命令执行漏洞进行攻击
  • PHP Code Injectiod:阻止PHP代码注入
  • HTTP Protocol Violations:阻止违反HTTP协议的恶意访问
  • HTTPoxy:阻止利用远程代理感染漏洞进行攻击
  • Shellshock:阻止利用Shellshock漏洞进行攻击
  • Session Fixation:阻止利用Session会话ID不变的漏洞进行攻击
  • Scanner Detection:阻止黑客扫描网站
  • Metadata/Error Leakages:阻止源代码/错误信息泄露
  • Project Honey Pot Blacklist:蜜罐项目黑名单
  • GeoIP Country Blocking:根据判断IP地址归属地来进行IP阻断

二、OWASP CRS(CoreRuleSet)

1、简介

OWASP® CRS 是一组通用攻击检测规则,可与 ModSecurity 或兼容的 Web 应用程序防火墙一起使用。 CRS 旨在保护 Web 应用程序免受各种攻击(包括 OWASP 十大攻击),并尽量减少误报。 CRS 提供针对许多常见攻击类别的保护。

OWASP CRS Github:https://github.com/coreruleset/coreruleset

OWASP CRS 文档:https://coreruleset.org/docs/deployment/

OWASP CRS Docker:https://hub.docker.com/r/owasp/modsecurity-crs

2、CRS 规则生效的原理

3、CRS 相关定义

3.1 偏执级别

3.2 异常阈值

3.3 自带的规则集

规则组名称 说明
REQUEST-911-METHOD-ENFORCEMENT 锁定方法(PUT、PATCH)
REQUEST-913-SCANNER-DETECTION 防范端口和环境扫描程序
REQUEST-920-PROTOCOL-ENFORCEMENT 防范协议和编码问题
REQUEST-921-PROTOCOL-ATTACK 防范标头注入、请求走私和响应拆分
REQUEST-930-APPLICATION-ATTACK-LFI 防范文件和路径攻击
REQUEST-931-APPLICATION-ATTACK-RFI 防范远程文件包含 (RFI) 攻击
REQUEST-932-APPLICATION-ATTACK-RCE 防范远程代码执行攻击
REQUEST-933-APPLICATION-ATTACK-PHP 防范 PHP 注入攻击
REQUEST-941-APPLICATION-ATTACK-XSS 防范跨站点脚本攻击
REQUEST-942-APPLICATION-ATTACK-SQLI 防范 SQL 注入攻击
REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION 防范会话固定攻击
REQUEST-944-APPLICATION-ATTACK-JAVA 防范 JAVA 攻击

3.4 请求处理阶段

  • 请求头阶段

    Apache完成读取请求头(post-read-request阶段)后立即处理此阶段中的规则。在这个时候还没有读取请求体,所以这个时候对所有请求参数并不是都可用。如果需要提前运行规则(在Apache对请求执行某些操作之前),在请求体读取之前执行某些操作,您需确定是否应该缓存请求体,或者决定如何将规则置于此阶段(例如,是否将其解析为XML)。

  • 请求体阶段

    请求体阶段是通用的输入分析阶段,大多数面向应用程序的规则都放在这里。在这个阶段是可以收到所有的请求参数,当然这个前提是请求主体是已经读取的。在此阶段ModSecurity支持请求正文阶段的三种编码类型:

    • application/x-www-form-urlencoded 用于传输表单数据
    • multipart/form-data 用于文件上传
    • text/xml 用于传递XML数据
  • 响应头阶段

    此阶段发生在响应头被发送回客户端之前。如果要在此之前检查响应,以及是否要使用响应头来决定是否要缓存响应体,可以讲将规则配置为此阶段。需要注意的是,某些响应状态码(例如404)由于在Apache请求周期的早期处理,因此此类访问是无法触发ModSecurity的规则。此外,还有一些响应头由Apache在稍后的挂钩(例如日期,服务器和连接)中添加,ModSecurity也无法触发或检查。这应该在代理设置中或阶段5(日志记录)中进行配置。

  • 响应体阶段

    响应体阶段是通用输出分析阶段。此时的响应体是应该要已经被缓存的,然后运行规则检查响应体。在此阶段,可以检查出站HTML来判断是否有信息泄露,是否包含错误消息或是失败的身份验证文本。

  • 记录阶段

    该阶段在日志记录发生之前运行。进入此阶段的规则只会影响日志记录的执行方式。此阶段可用于检查Apache记录的错误消息。但是不能在此阶段拒绝/阻断连接,因为已经太晚了。此阶段还允许检查在阶段3或者阶段4期间不可用的其他响应头。需要注意的是,在这个阶段不要将拒绝/阻断操作继承到规则中,因为这样本身是一个配置的错误。

3.5 严重等级对应异常分数

严重程度 默认异常分数
CRITICAL 5
ERROR 4
WARNING 3
NOTICE 2

三、ModSecurity安装配置集成

1、编译安装

2、配置

3、集成 Nginx

4、集成 CRS

5、自定义配置

http://www.modsecurity.cn/chm/index.html

6、远程加载CRS规则集

在安装成功ModSecurity之后,使用SecRemoteRules指令,将远程规则文件添加到modsecurity.conf文件中即可,如下所示:

Include /usr/local/nginx/conf/modsecurity/crs-setup.conf
SecRemoteRules some-key https://rules.modsecurity.cn/rules/customize.conf
Include /usr/local/nginx/conf/modsecurity/rules/*.conf

上述规则表示,将OWASP的规则放置在本地,然后远程服务器放置了一个customize.conf的规则文件,文件中主要放置一些更新比较频繁的自定义规则,此时请注意!之所以将加载远程规则的语句放置在第二位,是因为首先要加载OWASP规则的默认配置,即crs-setup.conf。

some-key意味着可以定义一个key值,远程服务器可以根据key值,来判断要返回哪些规则内容,或是否返回规则内容,当然,随便定义一个key值,远程服务器不进行任何判断也可以。

也可以直接将OWASP的所有规则全部放置在远程服务器当中,然后通过以下方式进行加载(内容需复制到modsecurity.conf末尾):

SecRemoteRules 123 https://rules.modsecurity.cn/crs-setup.conf
SecRemoteRules 123 https://rules.modsecurity.cn/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
SecRemoteRules 123 https://rules.modsecurity.cn/rules/REQUEST-901-INITIALIZATION.conf
SecRemoteRules 123 https://rules.modsecurity.cn/rules/REQUEST-903.9001-DRUPAL-EXCLUSION-RULES.conf
.................

但此时请注意,由于OWASP规则中除了规则文件外,还有一些后缀为.data的数据文件。如果.data数据文件也放置在了远程服务器中,那么引用这些数据的规则(通过pmFromFile指令进行引用),也需要把路径改为远程服务器的路径,如REQUEST-913-SCANNER-DETECTION.conf文件中ID为913100的规则,原内容如下:

SecRule REQUEST_HEADERS:User-Agent "@pmFromFile scanners-user-agents.data" \
    "id:913100,\
    phase:2,\
    block,\
    capture,\
    t:none,t:lowercase,\
    msg:'Found User-Agent associated with security scanner',\
    logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',\
    tag:'application-multi',\
    tag:'language-multi',\
    tag:'platform-multi',\
    tag:'attack-reputation-scanner',\
    tag:'paranoia-level/1',\
    tag:'OWASP_CRS',\
    tag:'OWASP_CRS/AUTOMATION/SECURITY_SCANNER',\
    tag:'WASCTC/WASC-21',\
    tag:'OWASP_TOP_10/A7',\
    tag:'PCI/6.5.10',\
    ver:'OWASP_CRS/3.2.0',\
    severity:'CRITICAL',\
    setvar:'tx.anomaly_score_pl1=+%{tx.critical_anomaly_score}',\
    setvar:'ip.reput_block_flag=1',\
    setvar:'ip.reput_block_reason=%{rule.msg}',\
    expirevar:'ip.reput_block_flag=%{tx.reput_block_duration}'"

此时就需要修改scanners-user-agents.data数据文件的路径,即"@pmFromFile scanners-user-agents.data",需要改成"@pmFromFile https://rules.modsecurity.cn/rules/scanners-user-agents.data"

使用SecRemoteRules后,WEB服务在启动时,ModSecurity会访问配置的HTTPS路径来读取远程文件中的规则,而与此同时,请求头中会增加三个参数:ModSec-unique-idModSec-statusModSec-key

GET /plain-text-rules.txt HTTP/1.1
User-Agent: modesecurity
Host: www.yourserver.com
Accept: */*
ModSec-unique-id: e781ee72979d16cd91ed89c716dc087f195d7cb8
ModSec-status: 2.9.3,(null),1.5.2/1.5.2,8.43/8.43 2019-02-23,Lua 5.1,2.9.9,e781ee72979d16cd91ed89c716dc087f195d7cb8
ModSec-key: some-key

其中,ModSec-key的值就是定义的key值,在实际中将其设置为了some-key

注意

  • 目前只有ModSecurity V3版本支持配置多个SecRemoteRules指令,其他版本只能配置一条SecRemoteRules指令,也就是说,如果使用的不是ModSecurity V3版本,所有规则都需要放置在一个文件中,且规则必须一行一个,不能像OWASP规则那样,一条规则可以通过"\"来拆分成多行;
  • ModSecurity 2.9.3无法使用SecRemoteRules指令,ModSecurity 2.9.2在与Apache搭配使用时可使用SecRemoteRules指令。

四、ModSecurity日志详解

1、日志配置

modsecurity.conf

SecAuditEngine On|Off|RelevantOnly
SecAuditLog /path/to/audit.log
SecAuditLogParts ABIJDEFHZ
SecAuditLogType Serial|Concurrent 
SecAuditLogStorageDir /path/to/storage/dir 
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
  • SecAuditEngine:是否开启日志审计
    • Off: 禁用审核日志
    • On:记录所有事务,调试时有用。如果要了解黑客是如何利用漏洞进行入侵的,还是记录所有的日志。
    • RelevantOnly: 仅记录指定HTTP状态码的访问,与SecAuditLogRelevantStatus搭配使用。
  • SecAuditLogRelevantStatus:如果 SecAuditEngine 设置为 RelevantOnly,则此指令控制应记录哪些 HTTP 响应状态代码。它是基于正则表达式的。上述值将记录所有 5xx 和 4xx 响应,不包括 404。
  • SecAuditLogParts:设置日志记录的内容,建议配置为ABCDEFHZ,每字母代表的内容详见日志格式中的配置。当记录请求体时,建议使用C来记录请求体,不然日志会记录完整的请求体中的内容。在ModSecurity v3版本中,使用IJ无效,只能使用C来记录请求体。
  • SecAuditLogType:日志记录方式

    • Serial : 将日志记录到单个日志文件中,与SecAuditLog搭配使用。如果使用串行方式,服务器内网站过多或访问量过大时,日志文件会越来越大,不利于内容的检索
    • Concurrent(推荐) :并行记录文件,每一次访问都会生出一个单独文件进行记录,与SecAuditLogStorageDir搭配使用
  • SecAuditLogStorageDir:设置日志保存的目录,当SecAuditLogType设置为Concurrent时方可生效,注意,请确保配置的目录存在并赋予777权限,否则将无法记录日志

  • SecAuditLog:设置日志保存的文件路径,注意,请确保文件所在目录存在并赋予777权限,否则将无法记录日志;

2、日志格式

Section Description
A 日志标题(强制)
B 请求 headers
C 请求 body
D 暴露
E 响应 body
F 响应 headers
G 暴露
H 日志trailer,其中包含附加数据
I Compact request body alternative (to part C), which excludes files
J 上传文件的信息
K 包含与事务匹配的所有规则的列表
Z 日志最终边界(强制)
---ICmPEb5c---A--[04/Oct/2017:21:45:15 +0000] 150715351558.929952 141.212.122.16 64384 141.212.122.16 80
---ICmPEb5c---B--
GET / HTTP/1.1
Host: 54.183.57.254
User-Agent: Mozilla/5.0 zgrab/0.x
Accept-Encoding: gzip

---ICmPEb5c---D--

---ICmPEb5c---F--
HTTP/1.1 200
Server: nginx/1.13.4
Date: Wed, 04 Oct 2017 21:45:15 GMT
Content-Type: text/html
Connection: keep-alive

---ICmPEb5c---H--
ModSecurity: Warning. Matched "Operator `Rx' with parameter `^[d.:]+$' against variable `REQUEST_HEADERS:Host' (Value: `54.183.57.254' ) [file "/root/owasp
-v3/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "733"] [id "920350"] [rev "2"] [msg "Host header is a numeric IP address"] [data "54.183.57.254"] [s
everity "4"] [ver "OWASP_CRS/3.0.0"] [maturity "9"] [accuracy "9"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-prot
ocol"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/IP_HOST"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] [ref "o0,13v21,13"]

---ICmPEb5c---I--

---ICmPEb5c---J--

---ICmPEb5c---Z--

四、模拟测试

不同ModSecurity版本的Nginx的并发性能测试结果 :http://www.modsecurity.cn/practice/post/25.html

参考

Copyright Curiouser all right reserved,powered by Gitbook该文件最后修改时间: 2024-09-12 13:20:44

results matching ""

    No results matching ""