linux服務器ssh防爆破


查看爆破次數記錄

# cat /var/log/secure | awk '/Failed/{print $(NF-3)}' | sort | uniq -c | awk '{print $2" = "$1;}'

 

更改ssh默認端口

修改SSH服務器配置文件

# vim /etc/ssh/sshd_config

 ssh連接時需指定連接端口,如:

ssh -p 2212 root@xxx.xxx.xxx.xxx

如果修改客戶端配置文件 /etc/ssh/config_ssh

把Port改成2212,則連接ssh服務器時默認連接的端口為2212 

 

限制root賬戶登錄

1.修改服務器端配置文件

# vim /etc/ssh/sshd_config

 

 

 

使用DenyHosts  

安裝:略

 配置:

進入denyhosts的主配置目錄
#cd /usr/share/denyhosts    

復制默認配置文件和程序執行文件
#cp denyhosts.cfg-dist denyhosts.cfg
#cp daemon-control-dist daemon-control

修改程序執行文件的操作權限
#chmod 770 daemon-control
# ./daemon-control start

設置開機自啟動

# ln -sf /usr/share/denyhosts/daemon-control /etc/init.d/denyhosts
# chkconfig --add denyhosts
# chkconfig --level 2345 denyhosts on

或者寫入自啟動文件/etc/rc.local

# echo "/usr/share/denyhosts/daemon-control start" >> /etc/rc.local

 

常用配置說明

# vi denyhosts.cfg 

SECURE_LOG = /var/log/secure
#sshd日志文件,它是根據這個文件來判斷的,不同的操作系統,文件名稍有不同。

HOSTS_DENY = /etc/hosts.deny  #阻止用戶登陸的文件

PURGE_DENY = 5m
DAEMON_PURGE = 5m
#過多久后清除已經禁止的IP
如5m(5分鍾)、5h(5小時)、5d(5天)、5w(5周)、1y(一年)

BLOCK_SERVICE = sshd
#禁止的服務名,可以只限制不允許訪問ssh服務,也可以選擇ALL

DENY_THRESHOLD_INVALID = 5  #允許無效用戶失敗的次數
DENY_THRESHOLD_VALID = 10   #允許普通用戶登陸失敗的次數
DENY_THRESHOLD_ROOT = 5     #允許root登陸失敗的次數
HOSTNAME_LOOKUP=NO       #是否做域名反解
ADMIN_EMAIL =            #設置管理員郵件地址 
DAEMON_PURGE = 10m       #該項與PURGE_DENY 設置成一樣,也是清除hosts.deniedssh 用戶的時間。     

 

以后就可以通過/etc/hosts.deny文件查看阻止ip

  

網上的一個防爆破腳本

#!/bin/bash
#Program:
#       Use to monitor the user who try to login.
#       防止SSH用戶暴力破解腳本
#
#Usage:
#       賦予可執行權限並添加到crontab
#       請先修改19行NUM對應的登錄失敗次數(默認100),超過此值則會添加到/etc/hosts.deny並且發送郵件
#       建議使用sendEmail發送郵件(不會被當作垃圾郵件而屏蔽) http://caspian.dotconf.net/menu/Software/SendEmail/
#       sendmail使用qq、163郵箱測試通過,默認的mail客戶端發送qq郵箱會拒收需要添加白名單、163通過
#History:
#2013/10/13         Ver:1.02        By Jack
#
#

PATH=/sbin:/usr/sbin:/bin:/usr/bin:~
export PATH

#定義閥值,超出此值則添加到黑名單並發送郵件
NUM=100

#檢查是否有root權限
[ $UID != 0 ] && echo -e "\e[0;31mSorry,Please run as root!\e[0m" && exit 2

#檢查安全日志文件是否存在且可讀
log=/var/log/secure
[ ! -e $log ] || [ ! -r $log ] && echo -e "\e[0;31mMake sure the file $log exist or can be readable!\e[0m" && exit 3

#登陸失敗的IP地址列表
ssh_list=/root/logs/ssh_list
[ ! -e ${ssh_list} ] && mkdir -p `dirname ${ssh_list}`

#判斷日志中是否存在ssh登錄失敗ip,如果沒有則退出,否則添加至${ssh_list}
cat $log |grep 'Failed' &>/dev/null 
[ $? != 0 ] && exit 4
cat $log|awk '/Failed/{print $(NF-3)}'|uniq -c|sort -nr|awk '{print $2"=>"$1}' > ${ssh_list}


#定義黑名單文件(Tcpwrappers)
deny_file=/etc/hosts.deny

#定義發送的黑名單郵件列表地址
mail_file=/root/logs/mail_file
[ ! -d `dirname ${mail_file}` ] && mkdir -p `dirname ${mail_file}`

#選擇郵件發送端,如果使用sendEmail,請下載后將sendEmail.pl拷貝到/usr/bin並賦予x權限
if [ -e /usr/bin/sendEmail.pl ] && [ -x /usr/bin/sendEmail.pl ]
then
        sendmail="mailA"
elif [ -e /bin/mail ] && [ -x /bin/mail ]
then
        sendmail="mailB"
else
        sendmail="None"
fi


#關於sendEmail設置
send_user='xxxx@qq.com\' #發送者地址
smtp_user='xxxx' #登陸smyp服務器的用戶名
smtp_pass='xxxx' #登陸smtp服務器用戶的密碼
smtp_addr='smtp.qq.com:25' #smtp地址和端口
recv_user='115466xxxx@qq.com jack_blues@163.com\' #接收者郵件地址

send_mailA(){
        /usr/bin/sendEmail.pl -f ${send_user} -t ${recv_user} -s ${smtp_addr} -u "SSHD WARNINGS" -m "`cat ${mail_file}`" -xu ${smtp_user} -xp ${smtp_pass} > /dev/null 2>&1
}

send_mailB(){
        /bin/mail -s "Failed sshd Login Users" ${recv_user} < ${mail_file}
}

#測試網絡
test_network(){
        
#ping 8.8.8.8 -c2 &>/dev/null
RETVAL=$(curl -I -o /dev/null -s -w %{http_code} http://www.baidu.com/)
}


for i in `cat ${ssh_list}`
do
        COUNT=`echo $i|awk -F"=>" '{print $2}'`
        IPADDR=`echo $i|awk -F"=>" '{print $1}'`
        if [ ${COUNT} -ge ${NUM} ];then
           grep $IPADDR ${deny_file} 2>/dev/null
           while [ $? -ne 0 ] 
           do
                echo "sshd:${IPADDR}" >> ${deny_file} 
                echo "<警告>:IP為${IPADDR}的用戶嘗試使用SSH登陸的次數大於限定值$NUM,其嘗試次數為$COUNT">>${mail_file}
           done
        fi
done 

#sleep 1


while [ -e ${mail_file} ] 
do
     test_network
     [ $RETVAL -ne 200 ] && exit 5
     case $sendmail in
            mailA)send_mailA;;
            mailB)send_mailB;;
            None)exit 6
     esac
     rm -f ${mail_file}
done
  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM