保护 WordPress 远离 XML-RPC 攻击
WordPress 使用 XML-RPC 进行远程过程调用,XML-RPC 攻击通过在短时间内大量发出请求,导致服务器宕机,在 WordPress 上的一个典型症状就是显示“Error connecting to database”。本文介绍 Apache + WordPress 环境下阻止 XML-RPC 攻击的方法。
1. 判断是否受到 XML-RPC 攻击
登录服务器后检查log,搜索 xmlrpc 关键字:
grep xmlrpc /var/log/apache2/access.log
如果能看到某个 IP 在短时间内连续发出请求:
144.76.230.225 - - [09/Apr/2017:06:49:00 -0400] "POST /xmlrpc.php HTTP/1.0" 200 54919 "-" "-" 144.76.230.225 - - [09/Apr/2017:06:49:03 -0400] "POST /xmlrpc.php HTTP/1.0" 200 54919 "-" "-" 144.76.230.225 - - [09/Apr/2017:06:49:05 -0400] "POST /xmlrpc.php HTTP/1.0" 200 54919 "-" "-" 144.76.230.225 - - [09/Apr/2017:06:49:07 -0400] "POST /xmlrpc.php HTTP/1.0" 200 54919 "-" "-" 144.76.230.225 - - [09/Apr/2017:06:49:09 -0400] "POST /xmlrpc.php HTTP/1.0" 200 54919 "-" "-" 144.76.230.225 - - [09/Apr/2017:06:49:11 -0400] "POST /xmlrpc.php HTTP/1.0" 200 54919 "-" "-" 144.76.230.225 - - [09/Apr/2017:06:49:13 -0400] "POST /xmlrpc.php HTTP/1.0" 200 46399 "-" "-"
就基本可以断定遇到了 XML-RPC 攻击。
2. 修改
WordPress 的 Jetpack 插件自带保护功能,可以在一定程度上阻止 XML-RPC 攻击,但实测并不能完全防护,且该插件本身也比较重。通过修改 VHOST 直接阻止一切 XML-RPC 访问,可以一劳永逸地解决 XMP-RPC 攻击的问题。
首先进入如下路径:
cd /etc/apache2/sites-available
在里面找到自己站点的配置文件,比如 XXX.conf,使用编辑器打开:
sudo nano XXX.conf
在里面的 <VirtualHost> 下,加入:
<files xmlrpc.php> order allow,deny deny from all </files>
保存后,重启 Apache:
sudo service apache2 restart
就设置完毕了。
3. 验证
为了验证上面的修改已经生效,可以在 WordPress 里安装并启用一个使用了 XML-RPC 的插件,如前面提到的 Jetpack,启用插件时应该会失败,出现诸如“The Jetpack server was unable to communicate with your site XXX [HTTP 403]…” 的报错。再次查看log,
grep xmlrpc /var/log/apache2/access.log
应该可以看到 Jetpack 的请求被拒绝了:
XXX.XXX.XXX.XXX - - [09/Apr/2017:09:43:43 -0400] "POST /xmlrpc.php?for=jetpack HTTP/1.1" 403 470 "http://XXX/xmlrpc.php?for=jetpack" "Jetpack by WordPress.com"
由此说明修改生效,所有 XML-RPC 都会被阻止。
4. 副作用
由于阻止了所有的 XML-RPC,一些依赖 XML-RPC 的插件和功能也会无法正常工作,如上面的 Jetpack,但至少可以一劳永逸地远离 XML-RPC 攻击了。