无法设置变量“USER.user_false_counter”,因为 ModSecurity 日志中不存在该集合 ApacheWindows 操作系统

如何解决无法设置变量“USER.user_false_counter”,因为 ModSecurity 日志中不存在该集合 ApacheWindows 操作系统

我们正在为我们的网络服务器(Windows 操作系统)使用 apache 模块。我们需要防止用户进行不成功的身份验证尝试。因此我们想到使用 Mod Security 模块。我在“modsecurity-minimal.conf”中使用这个标准配置设置如下 SecStatusEngine 开启 安全规则 IP:bf_block "@eq 1"
"id:'2000004',phase:4,deny,
日志数据:'访问被拒绝 [通过 IP] IP:@%{REMOTE_ADDR},用户:%{USER.name}' 安全规则用户:bf_block "@eq 1"
"id:'2000005',
日志数据:'访问被拒绝 [by USER] IP:@%{REMOTE_ADDR},用户:%{USER.name}'

Secrule REQUEST_HEADERS:authorization "Basic ([a-zA-Z0-9]+=*)$" "phase:3,nolog,pass,id:2000012,chain,capture"
    Secrule TX:1 "^([-a-zA-Z0-9_]+):" "t:base64Decode,capture"                
    SecAction initcol:USER=%{TX.1},setvar:USER.name=%{TX.1},initcol:IP=%{REMOTE_ADDR}
    
    
Secrule RESPONSE_STATUS "401" \
    "phase:5,id:2000015,logdata:'basic auth de @%{IP},var: %{IP.begin},user: %{USER.name},ufc: %{USER.user_false_counter},block: %{USER.bf_block},IPblock: %{IP.bf_block},ifc: %{IP.ip_false_counter}'"        
    SecAction setvar:USER.user_false_counter=+1,setvar:IP.ip_false_counter=+1,expirevar:USER.user_false_counter=300,expirevar:IP.ip_false_counter=300

# Check for too many failures for a single username,blocking 30 seconds after 3 tries
Secrule USER:user_false_counter "@ge 2" \
            "id:'2000020',phase:3,t:none,\
            setvar:USER.bf_block,\
            setvar:!USER.user_false_counter,\
            expirevar:USER.bf_block=30"

# Check for too many failures from a single IP address. Block for 5 minutes after 10 tries.
    Secrule IP:ip_false_counter "@ge 2" \
            "id:'2000021',\
            setvar:IP.bf_block,\
            setvar:!IP.ip_false_counter,\
            expirevar:IP.bf_block=300"      

但是,当我看到 modsec_debug.log 时,出现以下错误

无法设置变量“USER.user_false_counter”,因为该集合不存在。

无法设置变量“IP.ip_false_counter”,因为集合不存在。

请帮我解决这个问题。

解决方法

这是一个非常复杂的规则集(是否取自 ModSec 手册?)并且可能需要数小时才能对其进行调试。因此,您不太可能在这里获得正确的支持。

我立即看到的是,您并不总是初始化集合,并且有可能在没有初始化的情况下命中规则 2000015。也就是说,当浏览器请求没有基本身份验证的资源时,服务器以 401 响应,然后您的规则 2000015 命中,并且只有在后续请求中,浏览器才会请求具有基本身份验证标头的相同 URI。

所以在我看来,你的逻辑/规则架构好像是乱码。

当我像这样编写复杂的规则集时,我会记录每条规则,然后一步一步地编写和测试它们,只有当每条规则独立运行时,我才会开始将它们放在一起,然后优化它们,然后我将它们中的大部分放入 nolog。

这可能需要一些时间,所以请注意。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?