前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Blog 安全问题小记

Blog 安全问题小记

作者头像
四火
发布2022-07-19 14:37:51
3860
发布2022-07-19 14:37:51
举报
文章被收录于专栏:四火的唠叨

最近 Blog 遭遇了几个安全问题,折腾了几个钟头,在此记录一下。

最大的问题是 blog 访问时不时地出现 “502 bad gateway”,即便不出现,latency 也能达到接近三十秒。

于是登上 vps 去看原因,top 命令发现 CPU 都用完了。靠,十个 php-fpm 居然都在满功率工作。研究了一下,通常 php-fpm 在没有请求的时候是不应该占用那么多 CPU 资源的,而且 mysql 也高,似乎有人在访问网站,但是去 access log 里面却没找到东西:

代码语言:javascript
复制
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:

代码语言:javascript
复制
error_log  /home/wwwlogs/nginx_error.log  info;

于是发现许许多多这样的日志:

代码语言:javascript
复制
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 部分配置:

代码语言:javascript
复制
location = /xmlrpc.php {
	allow $xxx;
	deny all;
	access_log off;
}

其中这个 allow 部分是配置允许的 rpc call 的地址,其他都拒绝掉。第一次配置没有生效,原来是后文还有关于 location 的配置,把这个配置给覆盖掉了,处理好这个问题就好。当然,为了省事,也可以把 xmlrpc.php 改名,改成一个预料不到的名字。

其它的问题:

  1. 发现有人尝试登陆主机,在/var/log/secure 里面可以找得到很多尝试的记录。一般情况下把个别几个可疑的 IP 过滤掉就好:
代码语言:javascript
复制
iptables -I INPUT -s $actual_ip_address -p tcp --dport ssh -j REJECT
  1. 发现有人尝试从 web 后台登陆管理员账号,默认的 path 是 wp-login.php,之前使用过验证码,但是最终我还是把这个 path 改掉了,避免居心叵测的人反复尝试。

Update 2019-5-26 其实密码鉴权登陆可以关闭,只允许 SSH 使用秘钥的方式登陆,这样可以彻底断绝尝试密码登陆的那些人。

客户端将私钥保存到~/.ssh/id_rsa,并且赋予 0600 的权限:

代码语言:javascript
复制
chmod 0600 ~/.ssh/id_rsa

服务端编辑/etc/ssh/sshd_config:

代码语言:javascript
复制
PubkeyAuthentication yes
PasswordAuthentication no

接着把公钥写到文件/${user}/.ssh/authorized_keys 中。

最后重启 sshd 生效:

代码语言:javascript
复制
service sshd restart

私钥不能丢失。

另外,对于那些重复登陆失败的的,可以考虑使用 fail2ban 把他们加到黑名单一段时间。

Update 2022-7-3 如果使用 Cygwin 从 Windows 使用 private key 去发起 ssh 连接,可能会遇到软件的一个 bug,提示无法找到这个 key 文件(而其实这个文件是存在的)。通常这个 key 文件是:

代码语言:javascript
复制
~/.ssh/id_rsa

规避这个问题的 workaround 是,在 Windows 下建立链接(快捷方式):

代码语言:javascript
复制
mklink /D home c:\cygwin64\home

之后就可以使用 key 来进行无密码 ssh 访问了,但是需要显示指明 key 的路径:

代码语言:javascript
复制
ssh root@ip -i ~/.ssh/id_rsa

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档