|
本人第一次写脚本,下面这个是边写边查手册写的...(汗.. 看谁敢用). 如有好的建议或改进方法请不蔽指教. 谢谢.
测试环境 RH AS3 U4
- #!/bin/bash
- # 防SSH密码暴力破解脚本
- # 通过分析secure日志文件使用iptables拒绝恶意登入IP
- # by Qlin 2007.01.31
- LOG_FILE='/var/log/secure'; #日志路路径
- SAVE_FILE='belialIP'; #保存iptables拒绝IP文件名
- SAVE_TEMP_FILE=$SAVE_FILE'.temp'; #临时保存拒绝IP文件名,比较用
- IP_REPEAT=6; #允许尝试登入次数
- #二次正则是考虑日志文件过大导致sort排序过慢的问题(这只是我个人猜想并不排除正则比排序更慢的情况... -_-!)
- ip=`sed -n -e '/.*Failed password.*/p' $LOG_FILE | sort | uniq -c | awk -v nnm=$IP_REPEAT '{if($1 > num) print $0;}' | sed -n -e 's/.*Failed password.*from[ ]\(.*\)[ ]port.*/\1/p'`;
- backIFS=$IFS;
- IFS="\n";
- if [ -e $SAVE_FILE ]
- then
- echo $ip > $SAVE_TEMP_FILE;
- differ=`comm -13 $SAVE_FILE $SAVE_TEMP_FILE`;
- tmp=`cat $SAVE_FILE`;
- echo -e $differ"\n"$tmp | uniq | sort > $SAVE_FILE;
- else
- differ=$ip;
- echo $ip > $SAVE_FILE;
- fi
- if [ ${differ} ]
- then
- IFS=$backIFS;
- ips=`echo $differ | tr "\n" ' ' | tr -s ' '`;
- for dip in $ips;
- do
- iptables -A INPUT -s $dip -j DROP
- done;
- fi
复制代码
ps: 写完才发现已有类似这样的脚本了.. 惨念.
新版..
- #!/bin/bash
- LOG_FILE='/var/log/secure'; #日志路径
- REPEAT=3; #允许重试登入次数
- SLEEP_TIME='30m'; #脚本执行间隔时间(分钟)
- BELIAL_IP='';
- BEGIN_ROW=0;
- while(true)
- do
- backIFS=$IFS;
- IFS="\n";
- re=`tail +$BEGIN_ROW $LOG_FILE | nl`;
- numRow=`echo $re | awk 'END{ print $1; }'`;
- let "BEGIN_ROW=$numRow+$BEGIN_ROW";
- re=`echo $re | awk '{ if($0 ~ /Failed password/) print $12; }'`;
- ip=`echo $re | sort | uniq -c | awk -v num=$REPEAT '{if($1 > num) print $2;}' | tr "\n" ' ' | tr -s ' '`;
- IFS=$backIFS;
- for dip in $ip
- do
- if ! echo $BELIAL_IP | grep -q $dip
- then
- iptables -A INPUT -s $dip -j DROP
- BELIAL_IP="$BELIAL_IP $dip";
- fi
- done;
- date >> debug;
- echo -e $BELIAL_IP"\n"$numRow"\n" >> debug;
- sleep $SLEEP_TIME;
- done;
复制代码 |
|