ssh訪問控制,多次失敗登錄即封掉IP,防止暴力破解
一、系統:Centos6.3 64位
二、方法:讀取/var/log/secure,查找關鍵字 Failed,例如(注:文中的IP地址特意做了刪減):
Sep 17 09:08:09 localhost sshd[29087]: Failed password for root from 13.7.3.6 port 44367 ssh2
Sep 17 09:08:20 localhost sshd[29087]: Failed password for root from 13.7.3.6 port 44367 ssh2
Sep 17 09:10:02 localhost sshd[29223]: Failed password for root from 13.7.3.6 port 56482 ssh2
Sep 17 09:10:14 localhost sshd[29223]: Failed password for root from 13.7.3.6 port 56482 ssh2
從這些行中提取IP地址,如果次數達到10次(腳本中判斷次數字符長度是否大於1)則將該IP寫到 /etc/hosts.deny中。
三、步驟:
1、先把始終允許的IP填入 /etc/hosts.allow ,這很重要!比如:
sshd:19.16.18.1:allow
sshd:19.16.18.2:allow
2、腳本 /usr/local/bin/secure_ssh.sh
#! /bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.list for i in `cat /usr/local/bin/black.list` do IP=`echo $i |awk -F= '{print $1}'` NUM=`echo $i|awk -F= '{print $2}'` if [ ${#NUM} -gt 1 ]; then grep $IP /etc/hosts.deny > /dev/null if [ $? -gt 0 ];then echo "sshd:$IP:deny" >> /etc/hosts.deny fi fi done
3、將secure_ssh.sh腳本放入cron計划任務,每1分鍾執行一次。
# crontab -e
*/1 * * * * sh /usr/local/bin/secure_ssh.sh
四、測試:
1、開兩個終端窗口,一個ssh連上服務器,另一個用錯誤的密碼連接服務器幾次。
很快,服務器上黑名單文件里已經有記錄了:
[root@ ~]# $ cat /usr/local/bin/black.txt
13.26.21.27=3
再看看服務器上的hosts.deny
[root@ ~]# cat /etc/hosts.deny
sshd:13.7.3.6:deny
sshd:92.4.0.4:deny
sshd:94.10.4.2:deny
sshd:94.4.1.6:deny
sshd:11.64.11.5:deny
2、從另一個終端窗口繼續“暴力”連接服務器。
看看服務器上的黑名單文件:
[root@ ~]# cat /usr/local/bin/black.txt
13.26.21.27=6
再看看服務器上的hosts.deny
[root@ ~]# cat /etc/hosts.deny
sshd:13.7.3.6:deny
sshd:92.4.0.4:deny
sshd:94.10.4.2:deny
sshd:94.4.1.6:deny
sshd:11.64.11.5:deny
sshd:13.26.21.27:deny
IP 已經被加入到服務器的hosts.deny,再用正確的密碼連接服務器,被拒絕:
$ ssh root@myserver.mydomain.com -p 2333
ssh_exchange_identification: Connection closed by remote host
注:
1.腳本為同事編寫。
2.服務器sshd端口已改為2333,事實證明,改了端口后,暴力破解的ssh連接數銳減,呵呵。