我成为净网小能手啦!
留心看过我的网站运维日志《本站优化日志》的朋友,可能会发现前两周,也就是9月18日,我悄咪咪更新了两段记录,向大家宣告加入了abuseipdb。加入一个社区本来不是什么值得大张旗鼓的重大消息,但这次不仅仅是加入社区这么简单,而是我迈出了WordPress插件开发的第一步。
作为一个称职的webmaster,每天检查日志必不可少,对那些稀奇古怪的请求,我除了IP反查,还会到网上看下有没有相关的滥用报告。就是在这种情境之下,我接触到了abuseipdb这个社区。在这里,来自世界各地的webmaster们,积极报告自己遭遇的恶意IP,一天天地充实着这个公共数据库。一直以来对网安非常热忱的我顿时意兴盎然,并决定加入他们,成为他们。
一开始我是手动报告滥用IP,但很快就对复制粘贴的重复劳动失去了兴趣。我开始思考:为什么我不能像其他前辈一样自动汇报呢?对于自动汇报,abuseipdb文档给出的建议是与Fail2Ban等软件整合。但我遇到了第一个问题:网站用的是云主机,无法使用命令行工具,在自带的控制面板上找了一圈也没找到Fail2Ban这些软件的安装方式。最方便的法子已经走不通了,我只能白手起家写一个小插件来实现我的需求。
实现的原理非常简单,给abuseipdb的API发POST请求就行。我看到网上有前辈用了Guzzle来发送请求,但云主机无法安装Guzzle,我要用WordPress的方式来实现。都说WordPress是著名的屎山代码,我是没耐心去研究这堆老古董了,好在WP提供了大量可以开箱即用的钩子,wp_remote_post可以当做各类HTTP客户端发POST请求的平替。
解决了发送请求的问题,那该如何判断恶意请求呢?我参考了一个前辈的做法,用php关联数组存储服务器日志上404的请求路径,可疑路径作为键,“Suspicous request”、“Trying to exploit PbootCMS vulnerability”等简短说明作为值。每当收到新的请求,遍历数组,如果请求路径与数组中的路径一致,就提取值和请求路径,将两者拼接,发送POST请求到外部API。
最后,认真看了看WP的动作钩子说明后,我把主函数往‘init’上一挂,起飞了!
PS:现在还有两个值得进一步思考和优化的地方:
我在服务器配置文件里写上了不少拦截恶意访问的规则,同时网站有WAF,目前能被插件侦测到的请求是前面这两大金刚的“漏网之鱼”。对于那些已经被服务器和WAF拦截的请求,我还得手动报告。
那么:
1、我该如何与提供WAF的插件通信?
2、如何整合服务器?
迭代之路继续!