作者:四火的唠叨, 原文地址
最近Blog遭遇了几个安全问题,折腾了几个钟头,在此记录一下。
最大的问题是blog访问时不时地出现“502 bad gateway”,即便不出现,latency也能达到接近三十秒。
于是登上vps去看原因,top命令发现CPU都用完了。靠,十个php-fpm居然都在满功率工作。研究了一下,通常php-fpm在没有请求的时候是不应该占用那么多CPU资源的,而且mysql也高,似乎有人在访问网站,但是去access log里面却没找到东西:
top - 02:08:12 up 56 min, 1 user, load average: 10.18, 9.41, 8.68
Tasks: 115 total, 11 running, 104 sleeping, 0 stopped, 0 zombie
Cpu(s): 36.6%us, 10.4%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.1%si, 53.0%st
Mem: 766112k total, 682116k used, 83996k free, 239696k buffers
Swap: 1572860k total, 2664k used, 1570196k free, 125412k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
23854 www 20 0 59952 30m 4688 R 44.5 4.1 3:56.99 php-fpm
24337 www 20 0 60204 32m 4520 R 44.2 4.3 3:53.83 php-fpm
24300 www 20 0 52004 23m 4448 R 42.9 3.2 3:48.47 php-fpm
24287 www 20 0 54324 27m 5140 R 37.6 3.7 3:54.34 php-fpm
23855 www 20 0 54824 26m 4504 R 35.6 3.5 3:57.25 php-fpm
24323 www 20 0 46108 19m 4856 R 35.6 2.6 3:57.73 php-fpm
24274 www 20 0 56356 28m 4548 R 35.2 3.9 3:56.55 php-fpm
24374 www 20 0 55080 26m 4524 R 33.9 3.5 3:52.03 php-fpm
24385 www 20 0 63820 33m 4428 R 33.2 4.5 3:51.53 php-fpm
24394 www 20 0 57900 29m 4444 R 30.6 3.9 3:50.09 php-fpm
24250 mysql 20 0 214m 29m 5860 S 23.9 3.9 1:35.21 mysqld
6 root RT 0 0 0 0 S 1.7 0.0 0:01.31 watchdog/0
216 root 20 0 0 0 0 S 1.0 0.0 0:02.96 kjournald
23850 www 20 0 18624 11m 868 S 0.3 1.6 0:01.89 nginx
23851 www 20 0 18812 12m 876 S 0.3 1.6 0:03.61 nginx
27889 root 20 0 2712 1136 880 R 0.3 0.1 0:00.81 top
在没有太多线索的时候,有位朋友说PHP有一个slow log可以查看。不过在准备为之动手之前,我忽然想到,如果怀疑是外部请求引起的,至少可以先关掉Nginx,来确认这一点——如果是外部请求引起的,关掉Nginx以后CPU应该能够回落。果然,关闭Nginx以后CPU马上回落。
于是修改Nginx来查看日志,日志级别从Critical改成Info:
error_log /home/wwwlogs/nginx_error.log info;
于是发现许许多多这样的日志:
2017/11/20 09:48:09 [info] 14444#0: *27 epoll_wait() reported that client prematurely closed connection, so upstream connection is closed too while sending request to upstream, client: $actual_ip_address, server: www.raychase.net, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/tmp/php-cgi.sock:", host: "raychase.net"
这就清楚许多,似乎这是XML-RPC Attack。这里有介绍:链接。
基本上xmlrpc.php是WordPress里面暴露的一个远程调用服务,一些写日志的工具就是基于这个建立起来的(比如介绍过的这个),通过不断调用这个API可以耗尽系统资源,让网站停止正常服务,是一种普通的DDos攻击方式。
我检查了一下源IP地址,各个地址都有,可见来自于请求来自于肉鸡,或者是某个攻击的集群。我看到这里不觉笑了一下,我的blog就写写技术小文章,发发温和的观点,影响力那么小,居然都有人想要黑我?是不是搞错了……
无论如何,原因清楚就好了。通常解决方法是,在Nginx配置文件的server部分配置:
location = /xmlrpc.php {
allow $xxx;
deny all;
access_log off;
}
其中这个allow部分是配置允许的rpc call的地址,其他都拒绝掉。第一次配置没有生效,原来是后文还有关于location的配置,把这个配置给覆盖掉了,处理好这个问题就好。当然,为了省事,也可以把xmlrpc.php改名,改成一个预料不到的名字。
其它的问题:
- 发现有人尝试登陆主机,在/var/log/secure里面可以找得到很多尝试的记录。一般情况下把个别几个可疑的IP过滤掉就好:
iptables -I INPUT -s $actual_ip_address -p tcp --dport ssh -j REJECT
- 发现有人尝试从web后台登陆管理员账号,默认的path是wp-login.php,之前使用过验证码,但是最终我还是把这个path改掉了,避免居心叵测的人反复尝试。