思路是查找/var/log/secure中验证失败且出现的次数较多的ip,对其进行封IP处理。具体方法如下:

vi /usr/local/bin/secure.sh

#输入以下脚本

#! /bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.list
for i in `cat /usr/local/bin/black.list`
do
IP=`echo $i |awk -F= '{print $1}'`
NUM=`echo $i|awk -F= '{print $2}'`
#if [ ${#NUM} -gt 1 ]; then ##失败次数>10,可读性太差,调整为如下:
if [ $NUM -gt 10 ]; then
grep $IP /etc/hosts.deny > /dev/null ##检索IP是否已存在于hosts.deny
if [ $? -gt 0 ];then ##$?上一条命令的执行结果,0有正常输出,其他异常
echo "sshd:$IP:deny" >> /etc/hosts.deny ##增加屏蔽登录失败的IP
fi
fi
done
 
chmod +x /usr/local/bin/secure.sh
然后将secure_ssh.sh加入到cron计划任务中即可。
vi /var/spool/cron/root
#增加以下命令,一分钟执行一次
*/1 * * * * sh /usr/local/bin/secure.sh

避免增加系统负担,调整为十分钟执行一次

*/10 * * * * sh /usr/local/bin/secure.sh

初次执行过后,为减轻系统压力,可清掉相应日志,清理之前最好备份

cp /var/log/secure /var/log/secure.20180314 && >/var/log/secure

也可考虑对此日志进行定期备份、清理

hosts.deny两个文件中的相关记录。

 

PS:

&& 前个命令执行成功再执行后一个命令

|| 前个命令执行失败再执行后一个命令

另一种解决办法思路:

1、排查日志,将可疑IP加入防火墙拒绝列表;

2、一定时间后解除防火墙拒绝对应列表;

3、如果再次触发告警,再次加入拒绝,时间翻倍;