當你作為一個獨立開發者的時候總要面臨這樣那樣的問題,以前認為的小概率事件也總是某個時間點蜂擁而至考驗你的耐心,前一陣陣剛剛經歷了一次木馬驚魂 (參見文章獵豹清理大師值得我們信任麼? ),這次又遇到了伺服器被黑。
部署伺服器及一般的服務配置管理對於一個寫程式碼的人自然不在話下,但是相對專業的運維人員程式設計師確少的卻是一個安全意識,總以為伺服器被攻擊是一個小概率的事件。以前是這麼考慮的“網際網路上的主機那麼多偏偏你的主機被駭客盯上? 這不跟重大獎一樣麼,我有那麼幸運麼?”雖然前一段時間自己的產品被當成木馬已經是中了一次大獎了。所以心存僥倖心理,能省事就省事,先把服務部署起來能用就行,這也倒是符合我的極簡主義行事風格。只有經歷才能成長,這句話說的一點沒錯,感謝這個不太聰明的駭客給我上了一課,從此在做任何伺服器部署和管理的時候我的腦袋裡也多了一根弦兒“安全意識"。 事情是這樣的。
前幾日像往常一樣,訪問我的產品網站http://xbrowser.me , 突然頁面出現了404頁面未找到。奇怪,怎麼會這樣?我有檢查了一下輸入的域名,沒錯確實是自己的網站。這時我心理突然一驚,倒吸一口冷氣,莫非是因為前幾天釋出了一篇文章紀念我要廢棄的產品功能-一鍵翻 牆 這麼快就被GFW注意到了? 給我來了一個DNS劫持? 為了驗證這一想法我馬上開啟了電腦的VPN程式,通過VPN再次訪問我的網站(這樣可以避免GFW的DNS劫持) 。網頁呈現出來的依然是“404頁面未找到”,這說明不是DNS劫持的問題,GFW並沒有注意到我。這時候我不知道是喜還是憂,但是這究竟是什麼原因造成的呢?為了查詢真相我立刻登入了自己的伺服器。
首先我進入到了webserver根目錄檢視,果然看到網站檔案被刪掉了。還好我的程式有備份,這點損失我還是能夠承受的,關鍵駭客的意圖是什麼呢?篡改主頁?沒有道理啊,對於我這個一沒有知名度二沒有影響力的小站點沒有意義啊。好吧,不猜測原因了,這個哥們動作那麼大我反而要慶幸,否則就憑我那點兒安全意識被當成肉雞肯定毫無察覺。這時候我趕緊看看都有誰登入了伺服器。
$ last | more
chengkai pts/0 111.199.208.96 Mon May 18 14:41 still logged in
chengkai pts/4 192.154.200.61 Mon May 18 12:39 still logged in
chengkai pts/4 111.199.208.96 Sun May 10 02:40 - 14:39 (1+11:59)
chengkai pts/4 111.199.208.96 Sat May 9 14:02 - 14:03 (00:00)
chengkai pts/9 111.199.208.96 Sat May 9 00:15 - 02:31 (02:15)
從日誌上看,都是我自己的使用者名稱,但是很明顯有一個不一樣的IP地址來源,我趕緊查了一下ip地址來源, 處理了北京網通的IP另外一個不同的IP來著臺灣。很顯然駭客已經攻破了我的root密碼然後為了掩人耳目使用我的使用者名稱進行線上操作,但是更讓人驚愕的是此時這哥們竟然正線上上。
chengkai pts/4 192.154.200.61 Mon May 18 12:39 still logged in
尼瑪這真是大姑娘出嫁頭一遭啊,這是要現場對決啊。第一閃念我要先把這下傢伙給踢下去,可是又一想不行,這傢伙已經拿到了我的root許可權,被我踢下去很可能會氣急敗壞的重新登入破壞系統,還是先修改root密碼及看看有沒有留下什麼後門再說,先看看對方有沒有啟動什麼特殊的服務程式。
$ netstat -nl
80、22、1723 這些埠是我知道的webserver,ssh和vpn。剩下的幾個大埠號尤其值得懷疑。
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:48988 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:52732 0.0.0.0:* LISTEN
那麼接下來我用"lsof" 命令來看看這幾個大的埠號是什麼程式啟動的?
lsof -i :48988
ruby 13727 chengkai 9u IPv4 98307068 0t0 TCP localhost:58185 (LISTEN)
lsof -i :52732
ruby 18258 chengkai 9u IPv4 97802878 0t0 TCP localhost:52732 (LISTEN)
還好都是ruby程式,我猜想應該是passenger 轉發http請求到rails的監聽埠,為了證明我的猜想我停掉了nginx服務,果然ruby程式佔用的埠號沒有了。
排除了駭客監聽埠的嫌疑後,接下來看看會不會拿我的伺服器當"肉雞"使用,檢測這一問題的最好辦法就是檢視外面的流量出口,這時候我想到了iftop命令。
$ sudo iftop -np
195kb 391kb 586kb 781kb 977kb
└──────────────────────────────────┴───────────────────────────────────┴──────────────────────────────────┴───────────────────────────────────┴───────────────────────────────────
96.126.127.11:7000 => 101.219.21.98:50726 30.1kb 6.03kb 1.51kb
<= 1.12kb 230b 57b
96.126.127.11:ssh => 111.199.216.183:63446 5.09kb 5.91kb 6.13kb
<= 416b 291b 250b
96.126.127.11:7000 => 101.219.21.98:54488 25.3kb 5.06kb 1.27kb
<= 1.12kb 230b 58b
96.126.127.11:7000 => 101.219.21.98:36312 24.3kb 4.87kb 1.22kb
<= 1.12kb 230b 58b
96.126.127.11:ssh => 222.186.21.250:56628 5.20kb 2.61kb 668b
<= 3.14kb 1.44kb 368b
96.126.127.11 => 187.184.246.118 8.39kb 3.65kb 3.65kb
<= 0b 0b 0b
96.126.127.11:7000 => 101.219.21.98:34993 15.8kb 3.17kb 811b
<= 1.13kb 231b 58b
96.126.127.11:7000 => 103.254.203.177:58825 8.54kb 1.71kb 437b
在這裡面,並沒有發現什麼異常的流量和往外的出口連線,又進行了一些常規檢查,也沒有發現特別異常的問題。
# 檢視有無異常程式
$ ps aux
......
# 檢視系統資源佔用有無異常
$ top
......
# 有沒有新增異常使用者
$ cat /etc/passwd
......
#檢視了root使用者的命令歷史記錄,當然這個對稍有經驗傢伙是沒有意義的,拿到了root許可權後可以清理任何痕跡
# history
......
我知道接下來需呀做的兩件事情,修改root及我當前使用者的使用者名稱密碼及把入侵者踢下去。在修改了伺服器的密碼後,我在終端上輸入了下面兩個命令。
$ write chengkai pts/4
what are you fuc king about
#結束訊息
ctrl+d
# 踢掉線上終端
$ pkill -kill -t pts/4
第一個命令是向入侵者傳送一條資訊“what are you fuc king about”,而第二條命令緊接著把入侵者踢了下去。這時候不免有了一絲滿足感,可以想象對方收到訊息並被我踢下終端時的表情,當然我想他可能不會這麼容易善罷甘休。(其實我知道這種挑釁是蠻危險的,對方曾經拿到了root使用者許可權,如果在某個地方設定了一些後門會非常難以發現,系統很容易會被再次攻破)。 我開啟了認證日誌靜靜等待對方的再次破解登入,果然對方很快就來了,而且是發動了不同的主機進行ssh暴力破解。
$ sudo tail -f /var/log/auth.log
Received disconnect from 222.186.21.243: 11: [preauth]
May 18 14:36:52 localhost sshd[16428]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243 user=root
May 18 14:36:54 localhost sshd[16432]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243 user=root
May 18 14:36:56 localhost sshd[16432]: Failed password for root from 222.186.21.243 port 56722 ssh2
May 18 14:37:01 localhost sshd[16432]: message repeated 2 times: [ Failed password for root from 222.186.21.243 port 56722 ssh2]
May 18 14:37:01 localhost sshd[16432]: Received disconnect from 222.186.21.243: 11: [preauth]
May 18 14:37:01 localhost sshd[16432]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243 user=root
May 18 14:37:03 localhost sshd[16438]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243 user=root
May 18 14:37:05 localhost sshd[16438]: Failed password for root from 222.186.21.243 port 45780 ssh2
May 18 14::42:26 localhost sshd[18573]: Received disconnect from 222.186.21.244: 11: [preauth]
May 18 14::42:26 localhost sshd[18573]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244 user=root
May 18 14::42:29 localhost sshd[18579]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244 user=root
May 18 14::42:30 localhost sshd[18579]: Failed password for root from 222.186.21.244 port 38062 ssh2
May 18 14::42:35 localhost sshd[18579]: message repeated 2 times: [ Failed password for root from 222.186.21.244 port 38062 ssh2]
May 18 14::42:35 localhost sshd[18579]: Received disconnect from 222.186.21.244: 11: [preauth]
May 18 14::42:35 localhost sshd[18579]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244 user=root
May 18 14::42:39 localhost sshd[18585]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244 user=root
May 18 14::42:41 localhost sshd[18585]: Failed password for root from 222.186.21.244 port 50864 ssh2
May 18 14::42:47 localhost sshd[18585]
某種意義上來講這是好事,因為這說明對方並還沒有來得及安置後門程式,只能採取暴力破解的方式。那麼接下來我要做的事情就是把對方IP加入到 "hosts.deny"
$ sudo vi /etc/hosts.deny
ALL:110.164.67.47
ALL:222.89.166.12
ALL:221.229.166.30
ALL:58.218.205.69
ALL:58.218.204.239
ALL:58.218.211.155
ALL:222.186.21.236
ALL:58.218.204.225
ALL:58.218.204.241
.......
由於暴力破解駭客首先會嘗試root 使用者,所以還要禁止root ssh登入,修改sshd_conf檔案。
$ sudo vi /etc/ssh/sshd_config
#把PermitRootLogin 屬性 yes 改為 no
PermitRootLogin no
到此,我能想到的檢測及阻止對方的手段已經差不多了,是時候對一個最起碼的安全意識做個總結了。
- 設定使用者名稱密碼一定要大小寫字母數字及一些特殊符號的組合,增加暴力破解的難度,有可能的話可以定期更換密碼。
- 禁止ssh root 登入
- 定期維護hosts.deny檔案,可以選擇安裝一些第三方的工具自動根據一些規則維護hosts.deny 比如 "DenyHosts"
- 為了避免駭客掃描已知伺服器程式埠漏洞,修改服務程式的預設埠好,比如ssh服務不使用22埠
- 設定 iptables 開啟一些通用的防火牆規則,ubuntu系統可以使用 ufw
以下為一些網友建議及補充:
- 止密碼登陸,同樣修改 sshd_config 設定屬性“PasswordAuthentication no” ,然後公鑰和私鑰的方式進行登陸。
- 使用fail2ban ,fail2ban可以監視你的系統日誌,然後匹配日誌的錯誤資訊(正則式匹配)執行相應的遮蔽動作(一般情況下是呼叫防火牆遮蔽),如:當有人在試探你的SSH、SMTP、FTP密碼,只要達到你預設的次數,fail2ban就會呼叫防火牆遮蔽這個IP,而且可以傳送e-mail通知系統管理員,是一款很實用、很強大的軟體!
還好這次事件也沒有給我造成太大的影響和損失,反而讓我加強了一些安全意識,對於菜鳥級的駭客還是能夠抵擋一陣子的。歡迎跟帖討論,你瞭解的一些入侵監測手段和防範方法,謝謝。