Skip to content

四火的唠叨

一个纯正程序员的啰嗦

Menu
  • 所有文章
  • About Me
  • 关于四火
  • 旅行映像
  • 独立游戏
  • 资源链接
Menu

Blog 安全问题小记

Posted on 11/21/201707/03/2022 by 四火

xmlrpc

最近 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 改名,改成一个预料不到的名字。

其它的问题:

1. 发现有人尝试登陆主机,在/var/log/secure 里面可以找得到很多尝试的记录。一般情况下把个别几个可疑的 IP 过滤掉就好:

iptables -I INPUT -s $actual_ip_address -p tcp --dport ssh -j REJECT

2. 发现有人尝试从 web 后台登陆管理员账号,默认的 path 是 wp-login.php,之前使用过验证码,但是最终我还是把这个 path 改掉了,避免居心叵测的人反复尝试。

[Update 2019-5-26] 其实密码鉴权登陆可以关闭,只允许 SSH 使用秘钥的方式登陆,这样可以彻底断绝尝试密码登陆的那些人。
客户端将私钥保存到~/.ssh/id_rsa,并且赋予 0600 的权限:

chmod 0600 ~/.ssh/id_rsa

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

PubkeyAuthentication yes
PasswordAuthentication no

接着把公钥写到文件/${user}/.ssh/authorized_keys 中。
最后重启 sshd 生效:

service sshd restart

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

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

~/.ssh/id_rsa

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

mklink /D home c:\cygwin64\home

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

ssh root@ip -i ~/.ssh/id_rsa

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

×Scan to share with WeChat

你可能也喜欢看:

  1. HTTPS 升级
  2. 关于接口设计,还有 Fluent Interface,这种有趣的接口设计风格
  3. 如何思考面向对象
  4. Blog 被黑记录
  5. VPS 迁移和网站备案

3 thoughts on “Blog 安全问题小记”

  1. owenliang says:
    11/21/2017 at 9:18 AM

    我的 VPS 有几十万次的登录失败,真担心哪天被破解。

    Reply
    1. Anonymous says:
      11/22/2017 at 2:16 AM

      设置超过 x 次登录失败就是 block ip

      Reply
      1. owenliang says:
        11/22/2017 at 5:26 PM

        我试试去

        Reply

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

订阅·联系

四火,啰嗦的程序员一枚,现居西雅图

Amazon Google Groovy Hadoop Haskell Java JavaScript LeetCode Oracle Spark 互联网 亚马逊 前端 华为 历史 同步 团队 图解笔记 基础设施 工作 工作流 工具 工程师 应用系统 异步 微博 思考 技术 数据库 曼联 测试 生活 眼界 程序员 管理 系统设计 缓存 编程范型 美股 英语 西雅图 设计 问题 面向对象 面试

分类

  • Algorithm and Data Structure (30)
  • Concurrency and Asynchronization (6)
  • System Architecture and Design (43)
  • Distributed System (18)
  • Tools Frameworks and Libs (13)
  • Storage and Data Access (8)
  • Front-end Development (33)
  • Programming Languages and Paradigms (55)
  • Testing and Quality Assurance (4)
  • Network and Communication (6)
  • Authentication and Authorization (6)
  • Automation and Operation Excellence (13)
  • Machine Learning and Artificial Intelligence (6)
  • Product Design (7)
  • Hiring and Interviews (14)
  • Project and Team Management (14)
  • Engineering Culture (17)
  • Critical Thinking (25)
  • Career Growth (57)
  • Life Experience and Thoughts (45)

推荐文章

  • 聊一聊分布式系统中的时间
  • 谈谈分布式锁
  • 常见分布式系统设计图解(汇总)
  • 系统设计中的快速估算技巧
  • 从链表存在环的问题说起
  • 技术面试中,什么样的问题才是好问题?
  • 从物理时钟到逻辑时钟
  • 近期面试观摩的一些思考
  • RSA 背后的算法
  • 谈谈 Ops(汇总 + 最终篇):工具和实践
  • 不要让业务牵着鼻子走
  • 倔强的程序员
  • 谈谈微信的信息流
  • 评审的艺术——谈谈现实中的代码评审
  • Blog 安全问题小记
  • 求第 K 个数的问题
  • 一些前端框架的比较(下)——Ember.js 和 React
  • 一些前端框架的比较(上)——GWT、AngularJS 和 Backbone.js
  • 工作流系统的设计
  • Spark 的性能调优
  • “残酷” 的事实
  • 七年工作,几个故事
  • 从 Java 和 JavaScript 来学习 Haskell 和 Groovy(汇总)
  • 一道随机数题目的求解
  • 层次
  • Dynamo 的实现技术和去中心化
  • 也谈谈全栈工程师
  • 多重继承的演变
  • 编程范型:工具的选择
  • GWT 初体验
  • java.util.concurrent 并发包诸类概览
  • 从 DCL 的对象安全发布谈起
  • 不同团队的困惑
  • 不适合 Hadoop 解决的问题
  • 留心那些潜在的系统设计问题
  • 再谈大楼扔鸡蛋的问题
  • 几种华丽无比的开发方式
  • 我眼中的工程师文化
  • 观点的碰撞
  • 谈谈盗版软件问题
  • 对几个软件开发传统观点的质疑和反驳
  • MVC 框架的映射和解耦
  • 编程的未来
  • DAO 的演进
  • 致那些自嘲码农的苦逼程序员
  • Java 多线程发展简史
  • 珍爱生命,远离微博
  • 网站性能优化的三重境界
  • OSCache 框架源码解析
  • “ 你不适合做程序员”
  • 画圆画方的故事

近期评论

  • Ticket: TRANSACTION 1.922915 BTC. Go to withdrawal >> https://yandex.com/poll/enter/BXidu5Ewa8hnAFoFznqSi9?hs=20bd550f65c6e03103876b28cabc4da6& on 倔强的程序员
  • panshenlian.com on 初涉 ML Workflow 系统:Kubeflow Pipelines、Flyte 和 Metaflow
  • panzhixiang on 关于近期求职的近况和思考
  • Anonymous on 闲聊投资:亲自体验和护城河
  • 四火 on 关于近期求职的近况和思考
  • YC on 关于近期求职的近况和思考
  • mafulong on 常见分布式基础设施系统设计图解(四):分布式工作流系统
  • 四火 on 常见分布式基础设施系统设计图解(八):分布式键值存储系统
  • Anonymous on 我裸辞了
  • https://umlcn.com on 资源链接
© 2025 四火的唠叨 | Powered by Minimalist Blog WordPress Theme