故事开始java
4 月 14 日,星期天,天气很差,呆在家玩 LOL,正 Happy 的时候同事打电话给我,说 Confluence 看文档的时候挂了,报错:502。apache
一寻思,不就挂了吗,小意思,重启呗,因而切出游戏,远程上服务器重服务后继续玩游戏。安全
结果没几分钟,又发消息过来,Confluence 再次挂掉。我 X,这就有点 B 了狗了。bash
故障排除服务器
故障发生之时的第一感受就是 Confluence 资源不够?但仔细一想,也没有两我的在使用啊。因而查看了一下进程:app
Confluence 本该只有两个进程运行,如今只剩下一个自己的,而 Confluence 的用户却运行了一堆乱七八糟的进程。curl
使用 top 命令查看系统资源占用:maven
有一个进程巨特么占用 CPU,可是 COMMAND 却没有。经过 PID 能够看出,这个进程就是以前的 /boot/vmlinuz网站
网上去搜索相关进程的信息,说什么内核进程。当时想,难道内核出 BUG 了?这可咋整,不会须要升级内核吧。编码
出于懒,先将应用启动起来,让别人先用着吧。可就在这时,神奇的一幕发生了,我 X,服务竟然启动不起来了。
再次经过 ps 查看进程,发现又出现了一些奇怪的进程正在执行:
一个 curl 一个 wget,而特么的操做都是去一个 51 的 IP 下载文件,百度这个 IP:
眉头一皱,渐渐的意识到这件事情并不这么简单,这是在搞事情啊。
出于本能,第一步要作的事情,就是找出这些文件,先删除,而且不让他再去下载。
因而我将 curl 和 wget 改成只有 root 用户可以使用。
chmod 700 /usr/bin/wget chmod 700 /usr/bin/curl
而后即是查定时任务,由于以前有过被攻击的经验,这些 B 都喜欢在你机器上面添加定时任务。
su - confluence
crontab -l
果真,在定时任务里面有一条 curl 操做,每隔 5 分钟搞一次,还用了 base64 编码。
把这些都删除,顺便去下载了那个脚本,发现他在 /tmp 目录下存放了不少文件,直接所有给他先删除。
而后满心欢喜的启动 Confluence。成功跑起来了。内心还有点小得意。
本觉得故事到这里就应该告一段落了,然鹅,这才刚刚开始。
在接下来的一天里,Confluence 一直处于不稳定状态,时不时就挂掉。有时十几分钟,有时半个小时,问题来了,会不会是这台机器的缘由?
那还能咋整,迁移呗。因而在一台新的机器上重启部署好服务,将数据从新导入,一且顺顺利利。但没过多久,服务器再度出现上面的症状。
这时内心一万头草泥马奔涌而过。用以前的方法处理,但又一个新的问题诞生了。同时,一个新的域名出如今了个人世界。
pastebin.com
通过一番了解,这是一个能够用户匿名发布纯文本的网站,发布完成之后,文件能够生成一个连接~~~~
因而,接下来的战斗都围绕着相似于这样的地址作斗争:
打开网站,将文件里面 base64 部分解密:
而最终斗争方法包括但不限于修改 curl,wget 权限,修改 DNS 解析等等等等。
127.0.0.1 pastebin.com
结果一番折腾,并无什么卵用,Confluence 仍是隔一段时间就挂掉。为此还专门写了个定时任务让他检测重启。
#!/bin/bash ################################################################# # 做者:Dylan <1214966109@qq.com> # 日期:2019-04-15 # 做用:Confluence 状态检测 ################################################################# ################################################################# # Confluence 状态检查 ################################################################# SERVICE_STATUS=$(ps aux | grep "/opt/atlassian/confluence/confluence-6.9" | grep -v grep | wc -l) if [[ ${SERVICE_STATUS} -ne 2 ]]; then echo "$(date '+%Y-%m-%d %H:%M:%S') confluence is not running!\n" >>/tmp/confluence_restart.log echo "$(date '+%Y-%m-%d %H:%M:%S') confluence restart!\n" >>/tmp/confluence_restart.log /etc/init.d/confluence restart & fi
日志里面彷佛也没啥实质性的东西。全是相似于如下错误,这说明是从程序内部发起的,这可咋整:
org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'https://pastebin.com/raw/B5BTS5fm' ......................... java.lang.RuntimeException: org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe .........................
我把这些地址都让他不能使用了,总不会出乱子吧,不能访问就不能访问呗。
再后来,经过 JAVA 同事点醒,说的是这样的请求失败会形成程序阻塞。我 X,难道这就是方向了?
因而百度关键词,最终在两篇文章中看到了相似的问题。
一篇是漏洞说明:
一篇是问题解决:
最终办法
widgetconnector-xxx.jar 3.1.4 以前的版本存在该漏洞,因此咱们能够换成官网新的:
删除旧版本的 jar 包,换成新版本,具体目录:
confluence安装目录/confluence/WEB-INF/atlassian-bundled-plugins/
而后重启 confluence,为了更安全,咱们能够配合以前的修改 curl 和 wget 权限,修改 DNS 解析使用。
事件小结
这一次故障解决过程其实至关漫长 2- 3 天,在发现问题上面会走不少弯路。因此但愿可以帮到有心人。