用腳本簡(jiǎn)化部署DenyHosts防SSH暴力破解
原創(chuàng)【51CTO.com 獨(dú)家特稿】我的Nagios外網(wǎng)監(jiān)控服務(wù)器,剛開(kāi)始測(cè)試時(shí)取的密碼是redhat,放進(jìn)公網(wǎng)一天就被人改了,郁悶死了;另外的幾臺(tái)公網(wǎng)機(jī)器(沒(méi)有硬件防火墻),被人不停的ssh連接,我稍為判斷了一下,其中有個(gè)IP居然連接失敗17000次了;后來(lái)環(huán)境部署成熟以后發(fā)現(xiàn)仍然有不少外網(wǎng)ip在掃描和試探,看來(lái)不用點(diǎn)工具不行??;DenyHosts是用Python2.3寫(xiě)的一個(gè)程序,它會(huì)分析/var/log/secure等日志文件,當(dāng)發(fā)現(xiàn)同一IP在進(jìn)行多次SSH密碼嘗試時(shí)就會(huì)記錄IP到/etc/hosts.deny文件,從而達(dá)到自動(dòng)屏蔽該IP的目的。
DenyHosts官方網(wǎng)站為:http://denyhosts.sourceforge.net
一、檢查安裝條件
1、首先判斷系統(tǒng)安裝的sshd是否支持tcp_wrappers(默認(rèn)都支持)
# ldd /usr/sbin/sshd
libwrap.so.0 => /usr/lib/libwrap.so.0 (0x0046e000)
2、判斷默認(rèn)安裝的Python版本
[root@localhost 03]# python -V
Python 2.4.3
Centos5.5默認(rèn)已安裝了python 2.4.3
二、已安裝Python2.3以上版本的情況
1、安裝DenyHosts
# cd /usr/local/src
# wget http://jaist.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6.tar.gz
# tar zxf DenyHosts-2.6.tar.gz
# cd DenyHosts-2.6
# python setup.py install
程序腳本自動(dòng)安裝到/usr/share/denyhosts
庫(kù)文件自動(dòng)安裝到/usr/lib/python2.3/site-packages/DenyHosts
denyhosts.py自動(dòng)安裝到/usr/bin
#p#
2、設(shè)置啟動(dòng)腳本
# cd /usr/share/denyhosts/
# cp daemon-control-dist daemon-control
# chown root daemon-control
# chmod 700 daemon-control
# grep -v "^#" denyhosts.cfg-dist > denyhosts.cfg
# vi denyhosts.cfg
根據(jù)自己需要進(jìn)行相應(yīng)的修改
----------------denyhosts.cfg------------------------
SECURE_LOG = /var/log/secure
#RedHat/Fedora Core分析該日志文件
#其它版本linux根據(jù)denyhosts.cfg-dist內(nèi)提示選擇。
PURGE_DENY = 30m
#過(guò)多久后清除
DENY_THRESHOLD_INVALID = 1
#允許無(wú)效用戶(/etc/passwd未列出)登錄失敗的次數(shù)
DENY_THRESHOLD_VALID = 5
#允許有效(普通)用戶登錄失敗的次數(shù)
DENY_THRESHOLD_ROOT = 3
#允許root登錄失敗的次數(shù)
HOSTNAME_LOOKUP=NO
#是否做域名反解
----------------denyhosts.cfg------------------------
如果需要DenyHosts隨系統(tǒng)重啟而自動(dòng)啟動(dòng),還需做如下設(shè)置:
# vi /etc/rc.local
加入下面這條命令
/usr/share/denyhosts/daemon-control start
3、啟動(dòng)
# /usr/share/denyhosts/daemon-control start
如果要使DenyHosts每次重起后自動(dòng)啟動(dòng)還需做如下設(shè)置:
# cd /etc/init.d
# ln -s /usr/share/denyhosts/daemon-control denyhosts
# chkconfig --add denyhosts
# chkconfig --level 345 denyhosts on
然后就可以啟動(dòng)了:
service denyhosts start
#p#
DenyHosts配置文件:
vi /etc/denyhosts.cfg
SECURE_LOG = /var/log/secure #ssh 日志文件,它是根據(jù)這個(gè)文件來(lái)判斷的。
HOSTS_DENY = /etc/hosts.deny #控制用戶登陸的文件
PURGE_DENY = 5m#過(guò)多久后清除已經(jīng)禁止的
BLOCK_SERVICE = sshd#禁止的服務(wù)名
DENY_THRESHOLD_INVALID = 1#允許無(wú)效用戶失敗的次數(shù)
DENY_THRESHOLD_VALID = 10#允許普通用戶登陸失敗的次數(shù)
DENY_THRESHOLD_ROOT = 5#允許root登陸失敗的次數(shù)
HOSTNAME_LOOKUP=NO#是否做域名反解
DAEMON_LOG = /var/log/denyhosts#自己的日志文件
ADMIN_EMAIL = yuhongchun027@163.com#管理員郵件地址,它會(huì)給管理員發(fā)郵件
這個(gè)install_denyhosts.sh是全自動(dòng)下載安裝的小腳本,當(dāng)然安裝后還得手動(dòng)調(diào)整配置文件。適合非生產(chǎn)服務(wù)器使用;如果是生產(chǎn)服務(wù)器,建議大家采用我后面的ssh_deny.sh腳本。
本install_denyhosts.sh腳本如下:
#!/bin/bash
cd /usr/local/src
wget http://jaist.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6.tar.gz
tar zxf DenyHosts-2.6.tar.gz
cd DenyHosts-2.6
python setup.py install
cd /usr/share/denyhosts/
cp daemon-control-dist daemon-control
chown root daemon-control
chmod 700 daemon-control
grep -v "^#" denyhosts.cfg-dist > denyhosts.cfg
echo "/usr/share/denyhosts/daemon-control start" >>/etc/rc.local
cd /etc/init.d
ln -s /usr/share/denyhosts/daemon-control denyhosts
chkconfig --add denyhosts
chkconfig --level 345 denyhosts on
service denyhosts start
#p#
下面是hostsdeny的示例:
Connection to 192.168.0.154 closed.
[root@autolemp ~]# ssh 192.168.0.154
root@192.168.0.154's password:
Permission denied, please try again.
root@192.168.0.154's password:
Permission denied, please try again.
root@192.168.0.154's password:
Permission denied (publickey,gssapi-with-mic,password)出現(xiàn)這行表示生效
其實(shí)這段原理也很簡(jiǎn)單, 我稍微解釋一下;它其實(shí)就是收集/var/log/secure的信息,如果root登陸失敗次數(shù)超過(guò)10次,它將其寫(xiě)進(jìn)/etc/hosts.deny文件里;其實(shí)我們完全可以用shell來(lái)做這些事情,腳本控的同學(xué)可以關(guān)注以下腳本,我在線上服務(wù)器已測(cè)試成功。我主要是為了安全著想,不想在線上服務(wù)器去進(jìn)行大的改動(dòng),所以采用shell的方式,有這種需求的同學(xué)也可關(guān)注下。
vim /root/ssh_deny.sh
#! /bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' >/root/black.txt
DEFINE="10"for i in `cat /root/black.txt`
do
IP=`echo $i |awk -F= '{print $1}'`
NUM=`echo $i|awk -F= '{print $2}'`
if [ $NUM -gt $DEFINE ];
then
grep $IP /etc/hosts.deny > /dev/null
if [ $? -gt 0 ];
then
echo "sshd:$IP" >> /etc/hosts.deny
fi
fi
donevim /etc/crontab
* */1 * * * root sh /root/ssh_deny.sh
寫(xiě)此腳本時(shí)我本來(lái)想用時(shí)間收集的問(wèn)題,即隔斷時(shí)間就收集一次/var/log/secure的日志信息,后來(lái)覺(jué)得這個(gè)方法比較復(fù)雜;我稍為解釋一下上面的腳本。它其實(shí)就是放在crontab里,每隔一個(gè)小時(shí)就去讀一下/var/log/secure的日志信息,定義連接root的IP的閥值為10,如果此IP在/etc/hosts.deny里,就什么也不做;如果不在($?值不為0,即非狀態(tài)下),就將其添加進(jìn)/etc/hosts.deny里,此腳本放在線上環(huán)境也有一段時(shí)間了,效果也可以的。
【51CTO.com獨(dú)家特稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載!合作媒體轉(zhuǎn)載請(qǐng)注明原文出處及出處!】
【編輯推薦】