shell>vim /opt/MyShells/ssh_scan.sh
#!/bin/bash
#CentOS7 使用firewalld,如果开启了seLinux,需要允许策略或关闭
#ssh防猜用户密码
#设置时区,可根据日志文件的时间格式自行决定
export LC_ALL=en_US.utf8
#测试时间格式是否与日志时间格式一致
#FORMAT=$(awk 'BEGIN{print strftime("%b %e %H:%M",systime()-60)}')
#获取前1分钟内的secure记录,统计ssh认证失败的IP和其失败次数,并用Iptables阻止
SCANNER=$(awk 'BEGIN{tm=strftime("%b %e %H:%M",systime()-60)} {if($0 ~ tm&&/Failed password/&&/ssh2/)print $(NF-3)}' /var/log/secure | sort | uniq -c | awk '{print $1"="$2}')
#/usr/bin/logger -t SSHSCAN '进行了SSH Scan' $FORMAT $SCANNER
for i in $SCANNER
do
#取认证失败次数
NUM=`echo $i|awk -F= '{print $1}'`
#取IP地址
IP=`echo $i|awk -F= '{print $2}'`
/usr/bin/logger -t RAIDSCAN '进行了Raid Scan' $i $NUM $IP
#若其在失败次数不超过N次且之前没有被阻断过,那么添加一条策略将其阻断,并记录日志 (-ge 大于等于)
if [ $NUM -ge 3 ]
then
#如果使用firewalld,在cron中调用该脚本,那么不能开启seLinux,原因未知
/usr/bin/firewall-cmd --add-rich-rule='rule family="ipv4" source address='$IP' reject'
fi
done
#END of Script
shell>echo '*/1 * * * * root /opt/MyShells/ssh_scan.sh' >> /etc/crontab
shell>service crond restart