您的位置:首页 > 运维架构 > Linux

linux帐号防暴力破解脚本

2016-04-03 18:30 344 查看

问题起始

最近弄了一个做学习用的服务器,忽然有一天发现有人在暴力破解root账户。最简单的想法就是把ssh的root登录禁用,但是不甚爽,于是想到是不是可以做一个脚本自动可以把那些局心不良的ip查出来给封了(虽然我真没有什么可以被偷的),算是做个shell的综合练习吧。

解决思路

考虑到这种暴力破解手段都是靠远程ssh登录来进行暴力试错,必然有大量失败登录,那么首先必须找到这些ip。于是找出登录失败的ip是一个重点。经过百度之,知道这个命令是lastb。这是一个需要root权限的命令。执行之可以发现得到如下的东东:



第一行是登录的帐号,如果非法帐号就是unkown ,第二列是方式,终端登录是tty,远程是ssh,第三列是ip,接着是时间。对于我们,最想知道的信息是这几个,一个是ip,一个是时间。因为判定攻击ip的条件就是其短时间内大量的失败登录。于是需要使用文本处理出相应的信息。具体的判断是获取离当前时间一个时间段内(如15分钟的ip),进行分类统计。登录次数大于一定数量的如(5次)拉黑。这里涉及到几个知识点,如找出ssh为行选,使用grep比较合适,出现ip为列选,可以用cut或awk,因为需要分类统计,所以awk可以更加灵活地实现这一目标。还有就是时间处理,这里可以用到date命令计算对应时间戳。具体实现我还是偷了个懒,只是统计最近100个符合时间条件的ip,这样遇到一些狡猾的attacker也许会漏掉,比如有多个机器交替攻击的情况。但是,一,小服务器还不值得如此大费周张吧,二,缩短检测时间也是可以解决这个问题的。那么接下的问题是怎么拉黑呢?有iptable的方法,好像挺复杂,也有直接去写hosts文件的方法。可以写两个一个hosts.allow一个hosts.deny.把你查处来的坏ip写到里面就是相当于写死亡笔记啦,写谁死谁。好了,万事具备,还有最后一个定时工具。可以使用crontab这么个强大的工具,帮助你每隔一段时间执行这个脚本。好了,有了这些,让我们编写脚本吧。

脚本

#!/bin/bash

#find failed

HEAD=$(lastb|grep ssh|head -n 100|tail -n 1|awk '{print $5" "$6" "$7}')
echo $HEAD
TIME=$(($(date +%s)-$(date +%s -d "$HEAD")))
echo $TIME
if [ $TIME -gt 3600 ]; then
exit
fi

#input last 100
echo "get ip config......"
lastb|grep ssh|head -n 100| \
awk '{ip[$3]++}END{ for(key in ip){ if(ip[key]>5){print key}}}'>antiip.txt

touch antiip_n.txt
#write host.deny
cat antiip.txt|while read line
do
DENY_ALREADY=$(echo $line|awk '{print $2}')
if [ "$DENY_ALREADY" != "writed" ];then
echo "sshd:"$line>>/etc/hosts.deny
echo $line>>antiip_n.txt
else
echo $line"  writed">>antiip_n.txt
fi
done

service sshd restart /etc/init.d/sshd restart
mv antiip_n.txt antiip.txt


首先,我们找出最近第100个,假设它发生超过时限,这里定义一个小时,则说明最近一个小时内,没有发生攻击。这里用
$(date +%s)
来定义一个时间戳变量。对于可能发生攻击的情况,使用awk统计
awk '{ip[$3]++}END{ for(key in ip){ if(ip[key]>5){print key}}}
awk支持关联数据类型,因此很容易实现groub by的工作,把大于5的ip添加到一个antiip.txt文件中。然后处理这个文件,先识别前面已经添加黑名单的ip防止重复添加,这个标志是“writed”, 然后将其全部变成加上“writed”添加到一个临时文件antiip_n.txt,重启ssh服务器,最后替换黑名单文件。

然后打开/etc/crontab添加0 * * * * root ./antiip.sh每个小时定时执行任务。/sbin/service crond restart 重启服务。脚本就完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell linux