保护 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 攻击了。