#!/bin/bash
# 统计次数和IP,并逐行读取登陆失败次数和IP
cat /var/log/secure | grep "Failed" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sort | uniq -c | sort -nr | grep -v '^$' | grep -v '^#' | while read TIME_OUT IP

# 循环读取
do
    # 当登录次数超过3次时,将该IP地址写入黑名单
    if [ $TIME_OUT -ge 3 ] ; then
        # 判断超过3次的IP是否存在ssh黑名单目录文件当中,若不存在则写入
        if [[ `grep -c "$IP" /etc/hosts.deny` -eq '0' ]];then
            # 将不存在黑名单文件且超过3次登录失败的IP写入黑名单配置文件
            echo "sshd:$IP:deny" >> /etc/hosts.deny
        fi
    fi
done

# 定时清理系统用登录信息文件,优化读取速度,统计系统用户登录文件行数
number=`grep -n "" /var/log/secure | tail -n1 | gawk -F: '{print $1}'`
# 当该文件行数大于等于1000行则进行清理
if [ $number -ge 1000 ]; then
    # 清空文件内容
    echo "" > /var/log/secure
fi

# 判断黑名单备份文件是否存在
if [ ! -d "/etc/hosts.deny.bak" ]; then
   touch /etc/hosts.deny.bak
fi
# 利用MD5SUM检测文件内容是否变化
A=`md5sum /etc/hosts.deny | awk '{print $1}'`
B=`md5sum /etc/hosts.deny.bak | awk '{print $1}'`
if [ "$A" != "$B" ] ; then
    # 文件不同, 获取当前最新黑名单,并发送更新邮件
    list=`cat /etc/hosts.deny`
    echo -e "黑名单已被更新\n$list" | mail -s "黑名单信息已更新" 1025473445@qq.com
    # 通过覆盖让两份名单同步,cp命令加上反斜杠\即不用Y确认
    \cp /etc/hosts.deny /etc/hosts.deny.bak
fi

KentBryce
29 声望1 粉丝

« 上一篇
系统巡检