如何辨別你的Linux服務(wù)器已中了招?
譯文【51CTO.com快譯】本文中所謂的服務(wù)器被入侵或者被黑是指,未經(jīng)授權(quán)的人或機(jī)器人程序(bot)登錄到服務(wù)器上,企圖用服務(wù)器牟取私利,通常不懷好意。
免責(zé)聲明:如果你的服務(wù)器已被像NSA這樣的政府組織或嚴(yán)密的犯罪團(tuán)伙入侵,那么你不會(huì)注意到任何問(wèn)題,下面介紹的這些技術(shù)意識(shí)不到它們的存在。
然而,中招的服務(wù)器大多是由機(jī)器人程序(即自動(dòng)攻擊程序)、缺乏經(jīng)驗(yàn)的攻擊者(比如“腳本小子”)或低級(jí)的犯罪分子實(shí)施攻擊的。
一旦這類(lèi)攻擊者有權(quán)訪問(wèn)服務(wù)器,就會(huì)想方設(shè)法濫用服務(wù)器資源,而且很少采取防范措施來(lái)掩藏行蹤。
一、服務(wù)器中招的癥狀
服務(wù)器被缺乏經(jīng)驗(yàn)的攻擊者或自動(dòng)攻擊程序入侵后,它們通常會(huì)消耗100%的資源。這個(gè)資源通常是CPU(用于開(kāi)采加密貨幣或發(fā)送垃圾郵件之類(lèi)的活動(dòng)),也可能是帶寬(用于發(fā)動(dòng)拒絕服務(wù)攻擊)。
這意味著,出現(xiàn)問(wèn)題的第一個(gè)跡象是服務(wù)器 “變慢了”。這可能表現(xiàn)為網(wǎng)站頁(yè)面打開(kāi)慢得多,或者電子郵件花好長(zhǎng)時(shí)間才能投遞或發(fā)送。
那么你應(yīng)該查看那些東西呢?
檢查第1步:目前誰(shuí)登錄進(jìn)去?
你先要查看目前都有誰(shuí)登錄到服務(wù)器上。發(fā)現(xiàn)攻擊者居然登錄到服務(wù)器上進(jìn)行操作并不罕見(jiàn)。
這方面的對(duì)應(yīng)命令是 w。運(yùn)行w會(huì)得到下列輸出:
- 08:32:55 up 98 days, 5:43, 2 users, load average: 0.05, 0.03, 0.00
- USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
- root pts/0 113.174.161.1 08:26 0.00s 0.03s 0.02s ssh root@coopeaa12
- root pts/1 78.31.109.1 08:26 0.00s 0.01s 0.00s w
其中一個(gè)IP是英國(guó) IP,第二個(gè)IP是越南IP。這恐怕不是好事。
停下來(lái)深呼吸, 不用慌張,只要終止其SSH連接。除非你能阻止他們?cè)俅芜M(jìn)入服務(wù)器,否則他們會(huì)很快再次進(jìn)入服務(wù)器,很可能會(huì)踢走你,阻止你重新進(jìn)入。
如果你確實(shí)發(fā)現(xiàn)了已中招的跡象,請(qǐng)參閱本文末尾的“如果我已中招了該怎么辦”這個(gè)部分。
whois命令可以針對(duì)IP 地址來(lái)運(yùn)行,然后顯示注冊(cè)該IP的那家組織的所有信息,包括所在國(guó)家。
檢查第2步:誰(shuí)已登錄進(jìn)去?
Linux服務(wù)器記錄下哪些用戶(hù)從哪個(gè)IP登錄、何時(shí)登錄、登錄多久等信息??墒褂胠ast命令來(lái)查看這些信息。
輸出類(lèi)似這樣:
- root pts/1 78.31.109.1 Thu Nov 30 08:26 still logged in
- root pts/0 113.174.161.1 Thu Nov 30 08:26 still logged in
- root pts/1 78.31.109.1 Thu Nov 30 08:24 - 08:26 (00:01)
- root pts/0 113.174.161.1 Wed Nov 29 12:34 - 12:52 (00:18)
- root pts/0 14.176.196.1 Mon Nov 27 13:32 - 13:53 (00:21)
這里出現(xiàn)了我的英國(guó)IP和幾個(gè)越南IP,最上面兩個(gè)IP仍處于登錄狀態(tài)。如果你看到任何未經(jīng)授權(quán)的 IP,請(qǐng)參閱本文最后部分。
登錄歷史記錄包含在~/.bash_history下的一個(gè)文本文件中,因此很容易被刪除。攻擊者常常會(huì)直接刪掉該文件,企圖掩蓋其行蹤。因此,如果你運(yùn)行l(wèi)ast,只看見(jiàn)你的當(dāng)前登錄,這是不妙的信號(hào)。
如果沒(méi)有登錄歷史,要抱著非常懷疑的態(tài)度,繼續(xù)留意攻擊的其他跡象。
檢查第3步:回顧命令歷史
這類(lèi)層次的攻擊者經(jīng)常不會(huì)采取任何防范措施來(lái)掩蓋命令歷史記錄,所以運(yùn)行history 命令可顯示他們?cè)诟闶裁疵?。?wù)必要留意有沒(méi)有使用wget或curl命令來(lái)下載代碼庫(kù)外面的軟件,比如垃圾郵件機(jī)器人程序或加密貨幣開(kāi)采工具。
命令歷史存儲(chǔ)在~/.bash_history 文件中,所以一些攻擊者會(huì)刪除該文件,以掩蓋其行蹤。就跟登錄歷史一樣,如果你運(yùn)行history,但沒(méi)有看到任何輸出結(jié)果,那表明歷史文件被刪除了。這同樣是個(gè)不妙的信號(hào),你需要很小心地檢查服務(wù)器。
檢查第4步:誰(shuí)在耗用全部CPU?
你會(huì)遇到的那類(lèi)攻擊者通常不會(huì)采取太多的防范措施來(lái)掩藏其行蹤。所以,他們會(huì)運(yùn)行耗用全部CPU的進(jìn)程,因此很容易發(fā)現(xiàn)他們。只要運(yùn)行top,然后看看耗用CPU最多的那個(gè)進(jìn)程就行。
這還能顯示那些未登錄進(jìn)來(lái),但鉆你服務(wù)器空子的攻擊者。比如說(shuō),可能有人在使用未受保護(hù)的表單-郵件腳本來(lái)轉(zhuǎn)發(fā)垃圾郵件。
如果你不認(rèn)識(shí)耗用CPU最多的那個(gè)進(jìn)程,可以上網(wǎng)搜索進(jìn)程名稱(chēng),或者借助losf和strace分析它在搞什么名堂。
想使用這些工具,先用top拷貝其PID,然后運(yùn)行:
- strace -p PID
這會(huì)顯示該進(jìn)程做出的所有系統(tǒng)調(diào)用。這方面有大量信息,但細(xì)細(xì)查看一遍會(huì)讓你清楚當(dāng)前狀況。
- lsof -p PID
這個(gè)程序會(huì)列出該進(jìn)程擁有的已打開(kāi)文件。只要查看它在訪問(wèn)哪些文件,你就清楚它在搞什么名堂。
檢查第5步:檢查所有的系統(tǒng)進(jìn)程
如果某個(gè)未經(jīng)授權(quán)的進(jìn)程沒(méi)有耗用足夠的CPU,因而沒(méi)有在top的輸出結(jié)果中列出來(lái),可以借助ps在完整進(jìn)程列表中將它列出來(lái)。我建議使用的命令是ps auxf,它清楚地顯示了最詳細(xì)的信息。
你應(yīng)該檢查不認(rèn)識(shí)的任何進(jìn)程。你在服務(wù)器上越經(jīng)常運(yùn)行ps(這是個(gè)好習(xí)慣),某個(gè)奇怪的進(jìn)程就會(huì)越暴露無(wú)遺。
檢查第6步:檢查各進(jìn)程的網(wǎng)絡(luò)使用情況
命令iftop的功能類(lèi)似top,顯示一份經(jīng)過(guò)排序的列表,列出了發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù)的進(jìn)程及其源地址和目的地址。像拒絕服務(wù)攻擊或垃圾郵件機(jī)器人程序這樣的進(jìn)程會(huì)立即顯示在列表的頂端。
檢查第7步:哪些進(jìn)程在監(jiān)聽(tīng)網(wǎng)絡(luò)連接?
攻擊者常常會(huì)安裝一個(gè)程序,專(zhuān)門(mén)監(jiān)聽(tīng)網(wǎng)絡(luò)端口以接受指令。它在等待期間并不消耗CPU和帶寬,所以可能會(huì)被top之類(lèi)的命令所忽視。
lsof和netstat這兩個(gè)命令都可列出所有的網(wǎng)絡(luò)進(jìn)程。我使用這些命令時(shí)附上下列選項(xiàng):
- lsof -i
- netstat -plunt
你應(yīng)該留意那些被列為處于LISTEN或ESTABLISHED狀態(tài)的進(jìn)程,因?yàn)檫@些進(jìn)程要么在等待連接(LISTEN),要么已建立了連接(ESTABLISHED)。如果你不認(rèn)識(shí)這些進(jìn)程,使用strace或lsof看看它們?cè)诟闶裁疵谩?/p>
二、我中招后該怎么辦?
首先不要慌張,攻擊者目前已登錄時(shí)尤其不要慌張。你需要在攻擊者察覺(jué)到你有所發(fā)覺(jué)之前奪回系統(tǒng)的控制權(quán)。如果他認(rèn)識(shí)到你已有所發(fā)覺(jué),很可能會(huì)將你鎖在服務(wù)器外面,然后出于惡意開(kāi)始破壞任何資產(chǎn)。
如果你技術(shù)不太好,只要關(guān)閉服務(wù)器。直接從服務(wù)器上運(yùn)行shutdown -h now或systemctl poweroff。也可以登錄進(jìn)入到主機(jī)服務(wù)提供商的控制面板,關(guān)閉服務(wù)器。關(guān)機(jī)后,你就可以慢慢改動(dòng)所需的防火墻規(guī)則,咨詢(xún)提供商的意見(jiàn)。
如果你對(duì)自己頗有自信,主機(jī)服務(wù)提供商又有上游防火墻,那么你可以按這個(gè)順序創(chuàng)建并啟用下面兩條規(guī)則:
- 只允許來(lái)自你的 IP地址的SSH流量。
- 阻擋除此之外的任何流量,不僅僅是SSH,還包括每個(gè)端口上的每個(gè)協(xié)議。
這會(huì)立即終止攻擊者的SSH會(huì)話,只允許你訪問(wèn)服務(wù)器。
如果你無(wú)法訪問(wèn)上游防火墻,那么就要在服務(wù)器本身上創(chuàng)建并啟用這些防火墻規(guī)則,然后防火墻規(guī)則生效后,使用kill命令終止攻擊者的SSH會(huì)話。
最后一種方法是,通過(guò)諸如串行控制臺(tái)之類(lèi)的帶外連接登錄進(jìn)入到服務(wù)器,然后使用 systemctl stop network.service終止網(wǎng)絡(luò)功能。這將完全關(guān)閉任何網(wǎng)絡(luò)連接,然后你就可以慢慢啟用防火墻規(guī)則了。
一旦你重新控制了服務(wù),別以為可以信任這臺(tái)服務(wù)器了。
別試圖修復(fù)問(wèn)題后繼續(xù)使用該服務(wù)器。你永遠(yuǎn)不知道攻擊者干了什么,所以永遠(yuǎn)不知道這臺(tái)服務(wù)器還是安全的。
唯一合理的辦法就是拷貝出你需要的所有數(shù)據(jù),開(kāi)始重新安裝。
原文標(biāo)題:How To Tell If Your Linux Server Has Been Compromised
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】