思路借鑒--論壇密碼被盜引起的問題
完美的排錯思路,值得鑒賞。
轉載自:簡單密碼引起的血案 http://sery.blog.51cto.com/10037/1676611
起因:論壇管理員賬號密碼泄露,被人用工具自動發帖,一晚上發了上萬個帖子。費了很多時間才把這些垃圾帖子刪掉。論壇的discuz程序沒有做任何改動,懷疑是被惡意攻擊。論壇不能訪問已經大半天,來不及詳細了解情況,開整。
整個論壇的邏輯拓撲
按這個拓撲結構,逐級進行檢查和排錯,具體步驟為:
(一)負載均衡器進行檢查
1、檢查系統負載、內存使用情況:輸出表明是正常的;
2、檢查磁盤空間使用情況,未發現有分區被塞滿;
3、檢查系統日誌,未發現異常輸出;
4、檢查應用程序運行情況,執行命令 ipvsadmin ,有轉發數而且數字不斷變化,這可以確認應用程序keepalived
由上面幾點可確定負載均衡毫無問題,模擬故障切換,用戶的請求也能自動切換到輔助負載均衡器。
(二)檢查應用服務器
1、查看幾個服務器的負載,load值好幾十,嚴重超標;
2、查看磁盤空間使用情況,未發現使用率大於80%的分區;
3、查看系統日誌,未發現文件系統損壞,內核異常之類的問題;
4、查看內存使用情況,未發現耗盡內存而占用交換分區swap的情況;
5、檢查應用程序php及nginx,nginx無異常,而php偶爾有慢日誌輸出;
初步判斷,是php引起的負載異常。關閉php片刻,系統負載很快降到正常水平。懷疑被人惡意攻擊,通過查看tcp狀態,也無有價值的線索。
用到的命令是:
netstat -anp | grep ":80" | awk ‘{print $5}‘ | awk -F: ‘{print $1}‘ | sort -n | uniq -c |sort -nr |head -20
如果被攻擊,同一個ip的tcp連接數應該可能是很大的一個值。一般的經歷,是上千上萬的水平。嘗試用iptables禁掉幾個連接數多的源ip,效果不明顯,負載還是很高。關掉php,負載降低,再啟動,負載很快又爬升起來。看來,問題還不在這裏。
(三)檢查與應用服務器緊密關聯的文件服務器
論壇程序是以nfs的方式共享給多個應用服務器使用的,這樣的目的在於減少服務器之間的數據同步,假如不以共享的形式,則每個應用服務器都應保存一份完全相同的數據文件。因為一些數據文件隨時間推移會不斷發生變化,那麽為了保證用戶訪問的一致性,就必須實時同步這些更新數據。
1、 檢查系統負載、內存使用情況,發現一切正常;
2、 檢查磁盤空間使用情況,未發現被塞滿的分區;
3、 檢查系統日誌,未發現異常輸出;
4、 檢查nfs相關進程和配置,未發現異常;
以前發生過論壇訪問異常的情況,引起的原因就是共享文件系統(nfs)分區文件系統損壞,導致nfs客戶端(即php應用服務器)不能寫入緩存。為了確認這個猜測,在文件服務器及客戶端,都進行了創建和刪除文件測試,一切正常。
(四)檢查緩存服務器。
數據緩存使用的應用程序是memcached,這種服務器系統,僅僅運行這麽一個應用,因為是內存存儲數據,因此一般情況下,懷疑有故障,只需重啟memcached,讓它再重新緩存就好。
1、 檢查系統負載、內存使用情況,一切正常;
2、 檢查系統日誌,無異常;
3、 檢查網絡狀況,也很正常;
重啟memcached,對應用服務器的負載毫無幫助,看來問題也不在這裏。
(五)檢查數據庫服務器。
僅僅剩下它了,問題很顯然,就與這個相關。吸一口帶霧霾的空氣,登錄主數據庫及從數據庫服務器系統,進行如下常規排查。
1、 檢查系統負載、內存使用情況,一切正常;
2、 檢查磁盤空間使用情況,未發現被塞滿的磁盤分區;
3、 檢查系統日誌,未發現異常輸出;
4、 檢查網絡連接情況,主服務器連接數很少,而從服務器的連接數很多;這至少說明,在系統層面,主數據庫服務器的正常的,從服務器系統,在系統層面看來,也基本認為是正常的。
本集群使用的論壇程序discuz本身支持數據庫讀寫分離,因此主服務器的任務是承擔數據更新的任務,而查詢一類的工作,則由只讀狀態的從服務器(slave)承擔。我們先層主服務器的應用層面進行排查,步驟如下:
(1)、檢查mysql的錯誤日誌及滿查詢日誌,為發現異常輸出;
(2)、檢查mysql進程是否正常,執行mysql –p 登錄一下,能進入mysql客戶端命令行,守護進程正常;
(3)、mysql客戶端執行命令 show full processlist;輸出寥寥幾行,一切在可以接受的範圍;
由此判定,數據庫主服務器無異常。
現在,山窮水盡,水落石出,問題多半就是這個從數據庫服務器的問題了。系統層面的檢查,為發現有用的線索。查mysql錯誤日誌,未見異常;查mysql慢查詢日誌,果然有輸出,而且還不斷有新的輸出。
一條sql語句好長啊,限於篇幅,不打算全副輸出截圖。登錄mysql客戶端,執行show full processlist; 天啦,好半天才輸出完畢,線程數超過1000了(我設定的mysql最大連接數是1000),而輸出的內容,大部分是慢查詢裏邊的東東。用mysql –p –e “show processlist;”>/root/sql_out 把這些sql形成一個文本文件,轉發給程序員。他們看半天,也沒有得出一個結論。有人建議殺掉看是異常的sql語句,但殺掉後,還是不行。大家還是懷疑被攻擊,通過dns處理,把請求先定向到360,起到一定的攻擊過濾作用。從監控見面看,確實有結果cc攻擊被攔截。但對應用服務器的負載降低不起什麽作用,並且論壇還是處於打不開的狀態。
以超級系統管理員的帳號登錄論壇後臺,關閉論壇後,服務器負載立即恢復正常水平;再打開論壇,負載立馬飆升。邪門了啊,居然在技術層面查不出問題所在。折騰了一天,頭都大了。在qq群嚷了幾句:“誰改了程序沒有?誰在後臺做什麽設置沒有啊?…..”,有人冒出來一句:“刪垃圾貼的時候,為了快速刪除,設置了頁面顯示帖子的數量值”。
發現問題,意識到問題的嚴重性:
論壇後臺更改這個設置,幾秒鐘後,應用服務器的負載降下來了,從數據庫的連接數也趨於正常,論壇也可以跟以前一樣,可以瀏覽、發帖……
--------------------------------------完美的排錯分析思路-----------------------------------------
鑒賞一下。
思路借鑒--論壇密碼被盜引起的問題