故事開始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 天,在發現問題上面會走不少彎路。因此但願可以幫到有心人。