分享:linux基础防猜密码的脚本
时间:2010-04-02 18:49 作者:iamshiyu 来源:bitsCN原创 字体:[  ]
【bitsCN.com 独家特稿】redhat linux as3系统(4也可以),原理上是通过分析/var/log /secure文件,找出那些试图进行密码猜测的IP地址,并用iptables程序将其禁止。secure文件记录的范例如下:
Nov 11 11:28:31 localhost sshd[2357]: Server listening on 0.0.0.0 port 22.
Nov 11 11:28:57 localhost sshd[2459]: Accepted password for root from 123.120.15
7.29 port 18495 ssh2
Nov 11 11:29:13 localhost sshd[2565]: Failed password for root from 194.213.8.76
port 45528 ssh2
Nov 11 13:22:26 localhost sshd[24642]: Failed password for root from 202.41.93.1
35 port 34098 ssh2
Nov 11 13:22:29 localhost sshd[24756]: Illegal user fluffy from 202.41.93.135
Nov 11 13:22:31 localhost sshd[24756]: Failed password for illegal user fluffy f
rom 202.41.93.135 port 34352 ssh2
Nov 11 13:22:34 localhost sshd[24787]: Illegal user admin from 202.41.93.135
Nov 11 13:22:37 localhost sshd[24787]: Failed password for illegal user admin fr
om 202.41.93.135 port 34582 ssh2
我们将“Failed password”,“Illegal user ”和“Failed password for illegal user”作为3个关键字,进行识别,并提取造成这3种错误的IP地址,然后禁止这个IP地址访问服务器
设计脚本名称为basickdefencehack.sh,把这个脚本放在crond中运行,可以通过修改/etc/crontab文件,设定每分钟运行一次该脚本,crontab文件需要在结尾处添加如下内容:
* * * * * root sh /root/managetools/basicdefencehack/basicprotect.sh
因为我的这个脚本放在/root/managetools/basicdefencehack/目录下了。
确认crond服务处于运行状态中:
# service crond status
crond (pid 5974) running……
如果crond服务没有在运行,运行service crond start命令,并设定开机启动该服务
# chkconfig --level 3 crond on
如果根本没安装crond服务……我也不知道该怎么讲了,不会装就重装系统吧……
basickdefencehack.sh脚本内容及明细如下。
#!/bin/bash                                                                      //定义脚本执行器为bash
#Basic defence hack script                                                 //描述脚本作用,防御攻击
WORKDIR=/root/managetools/basicdefencehack                   //设定脚本工作目录
#Get suspect record from log in nearest 1 min.
LOGFILE=/var/log/secure                                                    //从/var/log/secure日志中提取错误日志
LOGFILE2=/root/managetools/basicdefencehack/temp/TMPsecure    //放到本地脚本中减少资源损耗
ACTION=`env LC_TIME=en date +%e" "%H":"%M":" -d -1min`      //设置时间为当前时间的前1分钟
#sshd keywords
word1="Failed password"                                                   //提取错误日志的关键字1
word2="Illegal user"                                                          //提取错误日志的关键字2
word3="Failed password for illegal user"                              //提取错误日志的关键字3
grep "$ACTION" $LOGFILE |grep -E "$word1|$word2" > $LOGFILE2    
//上面这步将含有关键字1和2的记录放在交换文件中,下面四句作用是提取错误日志中含有关键字的记录中的IP,也就是猜你密码的那些IP地址。然后把这些IP进行排序和计数,方便后面继续进行判断。
grep "$word1" $LOGFILE2 |grep -v "$word3"|awk '{print $11}' > iplist1    
grep "$word2" $LOGFILE2 |grep -v "$word3"|awk '{print $NF}' >> iplist1
grep "$word3" $LOGFILE2 |awk '{print $13}' >> iplist1
//grep -v $word3的原因是关键字1和关键字2往往在同一条记录中,导致IP地址所处的位置发生了变化,所以需要将这些记录区分开,具体的位置可以自己研究。另外如果有其他的错误关键字,你也可以自己添加word4或者word5.
scanner=`cat iplist1|sort|uniq -c|awk '{print $1"="$2}'`
//设计一个循环,区分哪些IP是可疑IP,初步设定为一分钟内出现了5次密码错误或错误用户的IP,可以自己改。
for i in $scanner
do
//定义一个变量NUM,以“=”作为分隔符,NUM将获取这个IP一分钟内出现的次数,变量IP将记录对应的IP地址。
declare -i NUM
NUM=`echo $i|awk -F= '{print $1}'`
IP=`echo $i|awk -F= '{print $2}'`
//判断,如果NUM变量大于5次,同时iptables的INPUT链中,没有出现过这个IP,则直接用iptables丢弃所有来自这个IP地址发送的请求。同时把这个丢弃该IP的时间,以及这个IP在这个时间段内被记录的次数进行登记。
if [ $NUM -gt 5 ] && [ -z "`iptables -vnL INPUT|grep $IP`" ] ;then
/sbin/iptables -I INPUT -s $IP -m state --state NEW,RELATED,ESTABLISHED -j DROP
      echo "`date`" >> $WORKDIR/scanner.log
      echo "$IP"="$NUM" >> $WORKDIR/scanner.log
      echo "$IP" >> $WORKDIR/oldrecord.log
else
echo "`date`" >> $WORKDIR/suspect.log
echo "$NUM"="$IP" >> $WORKDIR/suspect.log
fi
done