當你作為一個獨立開發(fā)者的時候總要面臨這樣那樣的問題淑蔚,以前認為的小概率事件也總是某個時間點蜂擁而至考驗?zāi)愕哪托奶婢茫耙魂囮噭倓偨?jīng)歷了一次木馬驚魂 (參見文章獵豹清理大師值得我們信任么? )坡椒,這次又遇到了服務(wù)器被黑拓巧。
部署服務(wù)器及一般的服務(wù)配置管理對于一個寫代碼的人自然不在話下环壤,但是相對專業(yè)的運維人員程序員確少的卻是一個安全意識涯保,總以為服務(wù)器被攻擊是一個小概率的事件诉濒。以前是這么考慮的“互聯(lián)網(wǎng)上的主機那么多偏偏你的主機被駭客盯上? 這不跟重大獎一樣么夕春,我有那么幸運么未荒?”雖然前一段時間自己的產(chǎn)品被當成木馬已經(jīng)是中了一次大獎了。所以心存僥幸心理及志,能省事就省事片排,先把服務(wù)部署起來能用就行寨腔,這也倒是符合我的極簡主義行事風格。只有經(jīng)歷才能成長率寡,這句話說的一點沒錯迫卢,感謝這個不太聰明的駭客給我上了一課,從此在做任何服務(wù)器部署和管理的時候我的腦袋里也多了一根弦兒“安全意識"冶共。 事情是這樣的 乾蛤。。捅僵。
前幾日像往常一樣家卖,訪問我的產(chǎn)品網(wǎng)站 http://www.xbext.com , 突然頁面出現(xiàn)了404頁面未找到。奇怪庙楚,怎么會這樣上荡?我有檢查了一下輸入的域名,沒錯確實是自己的網(wǎng)站馒闷。這時我心理突然一驚酪捡,倒吸一口冷氣,莫非是因為前幾天發(fā)布了一篇文章紀念我要廢棄的產(chǎn)品功能-一鍵翻墻 這么快就被GFW注意到了纳账? 給我來了一個DNS劫持沛善? 為了驗證這一想法我馬上打開了電腦的VPN程序,通過VPN再次訪問我的網(wǎng)站(這樣可以避免GFW的DNS劫持) 塞祈。網(wǎng)頁呈現(xiàn)出來的依然是“404頁面未找到”,這說明不是DNS劫持的問題帅涂,GFW并沒有注意到我议薪。這時候我不知道是喜還是憂,但是這究竟是什么原因造成的呢媳友?為了查找真相我立刻登錄了自己的服務(wù)器斯议。
首先我進入到了webserver根目錄查看,果然看到網(wǎng)站文件被刪掉了醇锚。還好我的程序有備份哼御,這點損失我還是能夠承受的,關(guān)鍵駭客的意圖是什么呢焊唬?篡改主頁恋昼?沒有道理啊,對于我這個一沒有知名度二沒有影響力的小站點沒有意義啊赶促。好吧液肌,不猜測原因了,這個哥們動作那么大我反而要慶幸鸥滨,否則就憑我那點兒安全意識被當成肉雞肯定毫無察覺嗦哆。這時候我趕緊看看都有誰登錄了服務(wù)器
$ 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地址來源, 處理了北京網(wǎng)通的IP另外一個不同的IP來著臺灣粥喜。很顯然駭客已經(jīng)攻破了我的root密碼然后為了掩人耳目使用我的用戶名進行線上操作,但是更讓人驚愕的是此時這哥們竟然正在線上橘券。
chengkai pts/4 192.154.200.61 Mon May 18 12:39 still logged in
尼瑪這真是大姑娘出嫁頭一遭啊额湘,這是要現(xiàn)場對決啊。第一閃念我要先把這下家伙給踢下去约郁,可是又一想不行缩挑,這家伙已經(jīng)拿到了我的root權(quán)限,被我踢下去很可能會氣急敗壞的重新登錄破壞系統(tǒng)鬓梅,還是先修改root密碼及看看有沒有留下什么后門再說,先看看對方有沒有啟動什么特殊的服務(wù)進程供置。
$ 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進程坊罢,我猜想應(yīng)該是passenger 轉(zhuǎn)發(fā)http請求到rails的監(jiān)聽端口,為了證明我的猜想我停掉了nginx服務(wù)续担,果然ruby進程占用的端口號沒有了。
排除了駭客監(jiān)聽端口的嫌疑后活孩,接下來看看會不會拿我的服務(wù)器當"肉雞"使用物遇,檢測這一問題的最好辦法就是查看外面的流量出口,這時候我想到了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
在這里面询兴,并沒有發(fā)現(xiàn)什么異常的流量和往外的出口連接,又進行了一些常規(guī)檢查起趾,也沒有發(fā)現(xiàn)特別異常的問題诗舰。
# 查看有無異常進程
$ ps aux
......
# 查看系統(tǒng)資源占用有無異常
$ top
......
# 有沒有新增異常用戶
$ cat /etc/passwd
......
#查看了root用戶的命令歷史記錄,當然這個對稍有經(jīng)驗家伙是沒有意義的,拿到了root權(quán)限后可以清理任何痕跡
# history
......
我知道接下來需呀做的兩件事情训裆,修改root及我當前用戶的用戶名密碼及把入侵者踢下去眶根。在修改了服務(wù)器的密碼后,我在終端上輸入了下面兩個命令.
$ write chengkai pts/4
what are you fucking about
#結(jié)束消息
ctrl+d
# 踢掉在線終端
$ pkill -kill -t pts/4
第一個命令是向入侵者發(fā)送一條信息“what are you fucking about”边琉,而第二條命令緊接著把入侵者踢了下去属百。這時候不免有了一絲滿足感,可以想象對方收到消息并被我踢下終端時的表情变姨,當然我想他可能不會這么容易善罷甘休诸老。(其實我知道這種挑釁是蠻危險的,對方曾經(jīng)拿到了root用戶權(quán)限,如果在某個地方設(shè)置了一些后門會非常難以發(fā)現(xiàn),系統(tǒng)很容易會被再次攻破)别伏。 我打開了認證日志靜靜等待對方的再次破解登錄蹄衷,果然對方很快就來了,而且是發(fā)動了不同的主機進行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
到此巩检,我能想到的檢測及阻止對方的手段已經(jīng)差不多了厚骗,是時候?qū)σ粋€最起碼的安全意識做個總結(jié)了。
- 設(shè)置用戶名密碼一定要大小寫字母數(shù)字及一些特殊符號的組合兢哭,增加暴力破解的難度,有可能的話可以定期更換密碼领舰。
- 禁止ssh root 登錄
- 定期維護hosts.deny文件,可以選擇安裝一些第三方的工具自動根據(jù)一些規(guī)則維護hosts.deny 比如 "DenyHosts"
- 為了避免駭客掃描已知服務(wù)器程序端口漏洞迟螺,修改服務(wù)程序的默認端口好冲秽,比如ssh服務(wù)不使用22端口
- 設(shè)置 iptables 開啟一些通用的防火墻規(guī)則,ubuntu系統(tǒng)可以使用 ufw
以下為一些網(wǎng)友建議及補充:
- 禁止密碼登陸矩父,同樣修改 sshd_config 設(shè)置屬性“PasswordAuthentication no” 锉桑,然后公鑰和私鑰的方式進行登陸。
- 使用fail2ban 窍株,fail2ban可以監(jiān)視你的系統(tǒng)日志民轴,然后匹配日志的錯誤信息(正則式匹配)執(zhí)行相應(yīng)的屏蔽動作(一般情況下是調(diào)用防火墻屏蔽),如:當有人在試探你的SSH球订、SMTP后裸、FTP密碼,只要達到你預(yù)設(shè)的次數(shù)辙售,fail2ban就會調(diào)用防火墻屏蔽這個IP,而且可以發(fā)送e-mail通知系統(tǒng)管理員飞涂,是一款很實用旦部、很強大的軟件!
還好這次事件也沒有給我造成太大的影響和損失较店,反而讓我加強了一些安全意識士八,對于菜鳥級的駭客還是能夠抵擋一陣子的。歡迎跟帖討論梁呈,你了解的一些入侵監(jiān)測手段和防范方法婚度,謝謝。