脚本目的:自动捕捉锁定恶意链接的ip,将其加入到hosts.deny
思路:运用命令lastb找出近期拒绝的访问,过滤出其ip位,用输出重定向加入到/hosts.deny
设置自动运行。
编写过程发现问题:
1. 使用lastb时会发现lastb的输出会有首行和空白
为将其滤除,所以选择用grep命令只将带有IP段的行过滤出
lastb | grep'[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
发现IP段在第三段,使用cat会发现,cat 只能分割单个空格,而无法分割连续的空格,所以选择awk命令:lastb | grep'[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | awk '{print $3}'
因为一般弱口令攻击会攻击多次,所以同ip会重复出现,这里使用sort �Cu来过滤掉重复显示的ip:lastb | grep'[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | awk '{print $3}' |sort -u
这样我们就锁定了访问失败的ip了,接下来就是写脚本,把这个ip加入到hosts.deny
#! /bin/bash
while [ "1" > "0" ]
do
txt=$(lastb | grep'[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | awk '{print $3}' |sort -u)
file='/etc/hosts.deny'
for ip in $txt
do
echo "sshd: $ip" >> $file
done
sleep 120s
done
这样每两分钟写入一次,可是会造成相同ip多次重复写入的问题,这样又需要有一个查询捕捉的ip是否已经存在于hosts.deny的步骤:
grep $ip $file >> /dev/null
if [ "$?" != "0" ] ; then
echo "sshd: $ip" >> $file
fi
这样整合的脚本为:
#! /bin/bash
while [ "1" > "0" ]
do
txt=$(lastb | grep'[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | awk '{print $3}' |sort -u)
file='txt.txt'
for ip in $txt
do
grep $ip $file >> /dev/null
if [ "$?" !="0" ] ; then
echo "sshd: $ip" >> $file
fi
done
sleep 120s
done
基本可以实现拒绝访问失败的ip继续访问,可是,当管理员误操作登陆失败时也会把管理员禁掉,还有现实使用中,也许黑客用来访问的不是ip而是域名,针对以上问题设计了以下脚本(远鹏出品,嘿嘿)
#!/bin/bash
#Prevent SSH attack
#Author:Li Yuanpeng
#V1.0
#Date:20140806
SLEEPTIME=30
while true
do
lastb -n 500| grep -v "^$" | grep -v "btmp" | awk'{print $3}' | sort | uniq -c | grep -v"172.16.1.51" |sort -nr > attack.log #读取攻击IP 并以攻击次数排序(过滤管理机IP)
while read line
do
IP=`echo $line | awk '{print $2}' `
TIME=`echo $line | awk '{print $1}' `
if ["$TIME" -gt 5 ];then
grep "$IP" /etc/hosts.deny &> /dev/null
if[ "$?" -ne "0" ]; then
echo "sshd: $IP" >> /etc/hosts.deny
fi
fi
done < attack.log
/bin/sleep $SLEEPTIME
done