為了便于遠程管理Linux服務器,管理員一般都會開啟SSH連接服務,這樣可以很輕松的對Linux服務器進行遠控操作。不過,這也給系統的安全帶來了一些隱患。雖然SSH采用的是加密連接,使用嗅探工具無法偵測。但是如果Root賬戶密碼設置的比較簡單的話,黑客會采取暴力破解的方法來猜測密碼,一旦密碼被破解,黑客就可以毫不費力的控制服務器。為了防止黑客猜解密碼,可以使用相應的安全技術加以防范。這里從屏蔽非法連接的IP的角度出發,來有效狙擊黑客的入侵行為。
Linux中內置NetFilter防火墻組件,使用IPtables來編寫合理的防火墻規則,可保護SSH安全。執行“iptables -A INPUT -p -s xxx.xxx.xxx.xxx -j ACCEPT”命令,可添加一條規則,允許本機IP(此處為“xxx.xxx.xxx.xxx”) 連 接TCP 22端口,因為SSH服務使用該端口。執行“iptables-A INPUT -p TCP -dport 22 -j DROP”命令,添加一條規則,禁止本機外的IP訪問SSH服務。上述方法較簡單,利用IPTables命令,還可創建白名單,只允許指定的IP連接SSH服務,對其他IP可以限制連接次數,如超過預設值,就對其進行屏蔽。
執行“iptables -N SSH_WHITELIST”,“ iptables-A SSH_WHITELIST -s xxx.xxx.xxx.xxx -m recent--remove --name SSH -j ACCEPT”命令,可以創建白名單,只需允許指定的IP連接SSH服務。執行“iptables-A INPUT -p tcp --dport 22 -m state --state NEW-m recent --set --name SSH”,“iptables -A INPUT-p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST”,“iptables-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update--seconds 60 --hitcount 5--rttl --name SSH -j ULOG--ulog-prefix SSH_brute_force”,“iptables -A INPUT -p tcp --dport 22-m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl--name SSH -j DROP”命令,可實現對白名單中的IP放行,對其他IP來說,如其在60秒內連續連接5次以上,就會被防火墻攔截,同時將其連接信息記錄到Linux的日志中,并添加“SSH_brute_force”前綴,便于用戶查詢。
使用以上方法的缺點是必須使用固定IP,如果管理員使用的主機IP不是固定的,就比較麻煩。當然,也可以使用指定域名來替代IP,但黑客可能會使用域名劫持來進行非法連接。也可以執行“vim /etc/hosts.allow”命令,對“hosts.allow”文件進行編輯,在其中添加“sshd:xxx.xxx.xxx.xxx”。執行“vim /etc/hosts.deny”命令,添加“sshd:all”一行。這樣就實現了只允許管理員的IP可以訪問SSH服務,禁止其余IP訪問。
實際上,當黑客對SSH服務進行非法連接時,其行為會被系統日志記錄下來。在“/var/log”目錄下打開“secure”等日志文件,可以看到訪問者的IP以及其試圖連接的賬戶名信息。對于頻繁嘗試連接的來訪者,將其IP提取出來,放置到上述“hosts.deny”文件中,即可對其進行屏蔽。當然,手工操作比較繁瑣,完全可以使用腳本來實現。
例如,可以編寫一個名為 的“sshtables.sh” 的腳本,內容包括“PATH=/sbin:/bin:/usr/sbin:/usr/bin”,“LOGFILE=/var/log/secure”,“KEYWORD='Invalid user'”,“KEYWORD1='Failed password for admin'”,“PERM_LIST=/tmp/bad.user”,“ PERM_LIST2=/tmp/bad.root.pasword”,“LIMIT=3”,“MAIL_TO=root”,“IPT_SAV="$(iptables-save)"”,“grep "$KEYWORD" $LOGFILE| awk '{print $NF}'|cut-d ":" -f 4>$PERM_LIST”,“grep "$KEYWORD1"$LOGFILE | awk '{print$11}'|cut -d ":" -f 4>$PERM_LIST2”,“ BAD_LIST=$( awk -v var=$LIMIT'{a[$i]++}END {for (i in a){if(a[i]>var)print i}}'$PERM_LIST $PERM_LIST2| xargs)”,“do”,“echo"$IPT_SAV" | grep -q "$i-p tcp -m tcp --dport 22-j DROP" || { iptables-I tcp_packets 2 -p tcp-s $i --dport 22 -j DROP}”,“done”等。該腳本其實很簡單,主要作用是對和SSH連接相關的日志進行過濾檢測,來發現試圖破解指定賬戶(這里為“admin”)密碼的連接信息,如果其連續3次輸錯密碼,就視其為非法破解并將其IP提取出來,并使用IPTables編輯防火墻規則,對其進行攔截,禁止其訪問SSH服務。
此外,可以使用“vim /etc/hosts.allow”命令,打開“hosts.allow”文件,在尾部添加“sshd:ALL:spawn(/etc/sshiptables.sh)&:allow”一行,假設將“sshtables.sh”保存在“/etc”目錄下。這樣,如果系統檢測到非法用戶嘗試連接的次數超過預設值,就禁止其進行連接,對于之外的IP,是允許進行連接的。當然,也可以編寫名為“sshdeny.sh”的腳本程序,將日志中的非法用戶的IP提取出來,并將其添加到“hosts.deny”文件中,同樣可以對其屏蔽。打開網址“http://pan.baidu.com/s/1hse3bIs”,可以查看該腳本的具體內容。
黑客的入侵是動態的,因此也可利用Crontab定時運行,讓上述腳本在指定的周期內自動運行。例如執行“crontab -e”命令,打開操作者的Crontab配置文件,在其中添加“0 0 * * * /etc/sshdeny.sh”,就可以在每天零點自動執行“sshdeny.sh”程序。當然,可以自由設定具體執行的時間點。這樣的腳本文件還有很多,例如打開網址“http://www.lasamhna.de/misc/sshblock.sh”,可以得到專用的分析日志文件,來攔截非法連接SSH服務IP的腳本。其功能是對Linux日志進行分析,如果發現在60秒內連接的數量超過5次,就將其其添加到“hosts.deny”文件中,經過3600秒才對其解鎖。
也可以根據實際情況進行修改,其中的“DONTBLOCK”參數可以設置允許連接的域名或IP,默認為“192.168”。其余的IP都在該腳本的監控之下,將該腳本放置到“/usr/local/bin”目錄下,使用“vim /etc/hosts.allow”命令,打開“hosts.allow”文件,在尾部添加“sshd:ALL:spawn (/usr/local/bin/sshblock.sh%a)&”一行,這樣,當訪問者試圖連接SSH服務時,首先會經過Tcp_Wrappers模塊的檢測,其會調用“hosts.allow”文件,來確定允許訪問SSH服務的連接,這樣就會自動執行上述“sshblock.sh”腳本,只有經過腳本檢測的連接才可以順利訪問。當然,這要求開啟了Tcp_Wrappers服務,實際上,Linux都安裝并開啟了該模塊。執行“rpm -qa | grep tcp”命令,可以查看該模塊的安裝信息。
使 用Knock工具,可自動打開SSH端口。將下載 的“knock-0.5-6.i386.rpm”等RPM放置到某個目錄中,在其中執行“rpm -ivh*.RPM”命令即可安裝。執行“vim /etc/knockd.conf”命令,打開Knock配置文件,在“sequence=”欄中顯示需要開放的端口,默認為UDP 2222、TCP 3333、TCP 4444等。這些端口不要在防火墻上屏蔽。可以根據需要對其進行更改,在“tcpflags=”欄中默認值為“syn,ack”,表示客戶端需要向服務器回復數據包,為便于使用,可去除“ack”標記。在“cmd_timeout=”欄中顯示自動關閉SSH服務的時間,如在敲門后,在該時間內沒有執行連接,會自動關閉SSH服務。
如果使用Knock訪問這些端口成功,就可自動打開SSH服務。如果在預設時間內未操作,則自動關閉SSH服務。在服務器上執行“knock -D -V”命令,來激活Knock的守護功能。在客戶端需要使用“knock.exe”程序進行“敲門”,在CMD窗口中執行“knock -v 服務器的域名。在服務器上會顯示接收到了上述敲門動作,并顯示已經打開了SSH服務。執行“iptables -vnL”命令,可以看到已經添加了允許訪問TCP 22端口的防火墻規則。