Apache HTTP服务器遭DDoS攻击场景下,如何通过Fail2ban、ModSecurity或防火墙封禁发起httpd -k start命令的所有nobody用户
兄弟,你这情况确实头疼——持续四周的攻击还从弱变强,换着IP绕防火墙,而且用nobody用户反复启动Apache耗CPU。我给你整理几个靠谱的方案,分别用Fail2ban、ModSecurity和系统级限制来搞定:
一、用Fail2ban封禁触发异常httpd启动的行为
Fail2ban的核心是监控日志、匹配异常行为,然后自动封禁IP。针对你的场景,我们可以自定义规则来抓nobody执行httpd -k start的行为:
- 第一步:创建自定义过滤器
在/etc/fail2ban/filter.d/目录下新建httpd-nobody-start.conf文件,内容如下(注意要根据你服务器的日志格式调整正则,下面是通用模板):
[Definition] # 匹配日志中包含nobody用户执行httpd -k start的条目 failregex = ^\S+ \S+ \S+ \[.*\] .* user=nobody command=httpd\ -k\ start$ ignoreregex =
- 第二步:配置对应的Jail
在/etc/fail2ban/jail.d/目录下新建httpd-nobody-start.conf文件,开启封禁规则:
[httpd-nobody-start] enabled = true filter = httpd-nobody-start # 指定要监控的日志文件,比如auth.log或syslog,根据实际情况调整 logpath = /var/log/auth.log /var/log/syslog # 只要触发一次就封禁(因为这本身就是异常行为) maxretry = 1 # 封禁时长设为1天(86400秒),可以根据攻击频率调整 bantime = 86400 # 统计1小时内的触发行为 findtime = 3600 # 封禁该IP的所有端口,也可以只封HTTP/HTTPS action = iptables-allports[name=HTTPDNobodyStart, port="http,https", protocol=tcp]
- 第三步:重启Fail2ban生效
执行命令:systemctl restart fail2ban
二、用ModSecurity在Web层拦截异常触发请求
如果攻击者是通过Web请求间接触发httpd -k start(比如利用漏洞或恶意请求),ModSecurity可以在Web应用层提前拦截:
- 首先确保你已经安装并启用了ModSecurity,并且加载了OWASP核心规则集(CRS),这是基础防护。
- 添加自定义规则
在ModSecurity的规则目录(比如/etc/modsecurity/rules/)新建一个自定义规则文件httpd-start-block.conf,内容如下:
# 拦截关联nobody用户、且可能触发httpd启动的异常请求 SecRule REMOTE_ADDR "@rx .*" "phase:1,id:100001,msg:'Block request triggering httpd start by nobody user',log,deny,status:403,chain" SecRule ENV:REMOTE_USER "nobody" "t:none" # 这里的正则可以根据攻击者的请求特征调整,比如特定URI/方法 SecRule REQUEST_URI|REQUEST_METHOD "@rx (start|restart)" "t:none"
- 重启Apache生效:
systemctl restart apache2
三、系统级限制:直接禁止nobody用户执行httpd命令
这是最直接的根治方法——既然攻击者用nobody执行httpd -k start,我们就从权限层面彻底封死这条路:
方法1:通过sudoers限制(如果攻击是通过sudo执行的)
一定要用visudo命令编辑,避免语法错误锁死root权限!
执行visudo,在文件末尾添加:
nobody ALL=(ALL) !/usr/sbin/httpd
这会禁止nobody用户通过sudo执行httpd命令。
方法2:用AppArmor限制httpd的执行主体
如果你的服务器用了AppArmor,可以创建专门的规则限制nobody执行httpd:
- 新建AppArmor配置文件
/etc/apparmor.d/usr.sbin.httpd,内容如下(保留原有规则的基础上添加封禁规则):
/usr/sbin/httpd { # 保留原有所有规则... deny user=nobody execute; }
- 重新加载AppArmor:
systemctl reload apparmor
方法3:修改httpd的文件权限
检查当前httpd的权限:ls -l /usr/sbin/httpd,如果输出是-rwxr-xr-x(其他用户有执行权限),可以修改为只有root能执行:
chmod 700 /usr/sbin/httpd
这样nobody用户就无法直接执行httpd命令了。
另外提个醒:你说攻击来自微软、亚马逊这些知名公司的IP,大概率是这些IP被攻击者当成代理或肉鸡了,单纯封IP治标不治本,结合上面的系统级权限限制+Web层拦截,才能从根源上解决问题。同时建议你排查服务器有没有未修补的漏洞、弱口令,防止攻击者能拿到nobody的执行权限。
备注:内容来源于stack exchange,提问作者Marcell Nemeth

