如何自動的檔掉,不良的SSH登入的IP

(以下為Fedora 1 Fedora2用的Fedora3略有不同因為syslog紀錄的方式不同需要修改,方法在最後面)

當你開啟了SSH的服務的時候你就會發現有很多人會嘗試登入你的主機 , 常看到用的帳號有root , admin , guest等等

或其他的使用者 , 他們再猜測登入者或密碼的時候,主機會將這個ip及嘗試登入的名稱紀錄到/var/log/secure的檔案內

然後每天會寄一封信給root,訊息如下

 --------------------- SSHD Begin ------------------------
Failed logins from these:
   admin/password from 141.85.0.83: 2 Time(s)
   admin/password from 221.3.131.80: 4 Time(s)
   guest/password from 141.85.0.83: 1 Time(s)
   guest/password from 221.3.131.80: 2 Time(s)
   root/password from 141.85.0.83: 3 Time(s)
   root/password from 221.3.131.80: 6 Time(s)
   test/password from 141.85.0.83: 1 Time(s)
   test/password from 221.3.131.80: 4 Time(s)
   user/password from 141.85.0.83: 1 Time(s)
   user/password from 221.3.131.80: 2 Time(s)

**Unmatched Entries**
Illegal user test from 221.3.131.80
Illegal user guest from 221.3.131.80
Illegal user admin from 221.3.131.80
Illegal user admin from 221.3.131.80
Illegal user user from 221.3.131.80
Illegal user test from 221.3.131.80
Illegal user test from 141.85.0.83
Illegal user guest from 141.85.0.83
Illegal user admin from 141.85.0.83
Illegal user admin from 141.85.0.83
Illegal user user from 141.85.0.83
Illegal user test from 221.3.131.80
Illegal user guest from 221.3.131.80
Illegal user admin from 221.3.131.80
Illegal user admin from 221.3.131.80
Illegal user user from 221.3.131.80
Illegal user test from 221.3.131.80

 ---------------------- SSHD End -------------------------

那麼我們可以手動去檔掉這些ip但是因為不可能每天都這樣,因為 懶 懶 懶 所以想法子分析這個log檔並自動的檔掉不良的ip就是這個shall的目的了

 

1.    #cat /var/log/secure | grep Illegal < - - - 這個就是出現在上面的不良的user

 

2.    cat /var/log/secure | grep Illegal | tr s " "  < - - - 這加上去的選項目的在將多餘的空白變成一個空白,否則以後會有這樣的錯誤出現,

iptables v1.2.7a: host/network `from' not found

Try `iptables -h' or 'iptables --help' for more information.

所以需要加上這個,用來去除空白的部分

 

3.    #cat /var/log/secure | grep Illegal | tr s " " | cut -d" " f10 < - - - 這個就是以空白為分界線並請只列出ip的部分,因為ip是第10個

 

4.    # cat /var/log/secure | grep Illegal | tr s " " | cut -d" " f10 | sort | uniq < - - - sort將 ip排序,uniq去掉相鄰相同的ip這樣可以避免檔掉重複的ip

 

 

5.    # cat /var/log/secure | grep Illegal | tr s " " | cut -d" " f10 | sort | uniq | sed -e 's/^.*$/iptables -A INPUT -i eth0 -p tcp -s & --dport 22 -j DROP/' >> /root/sshbadip.sh < - - - 這個就是重點了,將剛剛篩選出來的ip加到iptables的中間,先這樣說

如果要檔掉一個ip port:22的方法是 #iptables A INPUT I eth0 p tcp s x.x.x.x dport 22 j DROP可是我們篩選出來的

IP可能有很多組所以用sed -e 's/^.*$/iptables -A INPUT -i eth0 -p tcp -s & --dport 22 -j DROP/' >> /root/sshbadip.sh將所有的IP seve成一個shaill,中間的 sed e 's/^.*$/x x x x & x x x x /'我們分析到最後剩下IP這個可以將所有的IP的前後加上我們所需要的指令不過要save成一個檔案並且要保留就的資料所以用 >> 到一個檔案上面

不了的人測試一下這個就可或許有幫助#echo 'Test only' | sed -e 's/^.*$/> & </' 就可以在行首加上 > 行尾巴加上 < 所以用這個方法加入我們要的指令並存成一個 shall

 

6.    再來要考慮的就是,自己也會打錯帳號跟密碼這個是大問題,因為會給他忘忘記或者手發抖打錯都有可能,這樣就會無法登入主機了,有一個方法可以預防的也就是iptables在比對資料的時候是一行一行比對的,所以一定要把信任的ip 先加入這樣如果自己打錯密碼因為在過濾的時候會先看到你先載入的規則,就放你信任的ip通過部會再比對下去所以建立以下的檔案

#!/bin/bash

iptables F ; iptables X ; iptables Z < - - - 清除所有的規則

iptables A INPUT I eth0 p tcp s x.x.x.x j ACCEPT < - - -把自己的防火牆規則寫下並將允許的ip 加入

當然你可以多寫幾行並存檔成你想要的檔名我存成 iptables.sh

6.最後寫一個控制這些的shall內容如下:

#!/bin/bash
cat /var/log/secure | grep Illegal | tr –s " " |cut -d" " -f10 | sort | uniq | sed -e 's/^.*$/iptables -A INPUT -i eth0 -p tcp -s & --dport 22 -j DROP/' >> /root/sshbadip.sh  < - - - 這行前面說過了
cat /root/sshbadip.sh | sort | uniq >> /tmp/.badip < - - - 因為有可能舊的ip跟新的ip重複所以要用這行再把重複的ip 去除並存成一個暫存的檔案
mv /tmp/.badip /root/sshbadip.sh < - - - 這個就是將暫存的檔案copy 回原來的地方
chmod 700 sshbadip.sh  < - - - 將權限改成可以執行
/root/iptables.sh      < - - - 先執行可以允許IP 的 shall

/root/sshbadip.sh      < - - - 在執行檔掉不良IP 的 shall

(以下為Fedora 3的用法,注意…因為紀錄的方式不同所以正規表示法的過濾方法不同)

第一行需要改成以下才可以正確的在Fedora 3下面使用,其他的相同

cat /var/log/secure | grep Invalid | tr -s " " | cut -d":" -f7 | sort | uniq | sed -e 's/^.*$/iptables -A INPUT -i eth0 -p tcp -s & --dport 22 -j DROP/' >> /root/sshbadip.sh