基于firewalld的防爆shell脚本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于firewalld的防爆shell脚本相关的知识,希望对你有一定的参考价值。

统计ssh非法暴破源ip

在维护linux服务器中,当开启sshd服务时,总会有一些不怀好意的访问者要来试探一下弱口令,假若访问失败的日志文件为/var/log/secure,总是手动来翻日志,也是麻烦,服务器数量较多时,也显得力不从心,基于此,我们可以脚本化来自动分析日志,找出这些访问者,直接拉黑。

首先,统计基于ip的问题访问数量。如下:

grep -E "Failed|Invalid" /var/log/secure|sed -re s/.*[ ](([0-9]1,3\\.)3[0-9]1,3)[ ].*/\\1/g|sort|uniq -c|sort -n

      1 38.75.136.182
1 81.68.154.131
3 81.68.188.196
8 150.158.180.66
14 81.68.166.172
26 101.132.119.42
67 118.178.189.178

将源ip加入防火墙屏蔽

接着,将上述恶意源ip统计数据定向至/var/log/failed_login.log

读取统计数据,筛选恶意访问次数>100(可根据需要自行设置)的ip,如果该ip并未加入黑名单,则将其加入防火墙黑名单

cat /var/log/failed_login.log|awk $1 > 100"firewall-cmd --list-all|grep "$2|getline ip;if (ip == "") system("firewall-cmd --add-rich-rule=\\"rule family=\\"ipv4\\" source address=\\""$2"\\" drop \\" --permanent")ENDsystem("firewall-cmd --reload")

或者创建ipset黑名单

firewall-cmd --permanent --new-ipset=black_ips
firewall-cmd --add-rich-rule="rule family="ipv4" source ipset=black_ips log drop" --permanent
tail /var/log/failed_login.log|awk $1 > 100"firewall-cmd --ipset=black_ips --get-entries|grep "$2|getline ip;if (ip == "") system("firewall-cmd --permanent --ipset=black_ips --add-entry="$2)ENDsystem("firewall-cmd --reload")

完整shell脚本

最终得到完整功能的shell脚本,如下:

#!/bin/bash
max=100
statistics_ip()
grep -E "Failed|Invalid" /var/log/secure|sed -re s/.*[ ](([0-9]1,3\\.)3[0-9]1,3)[ ].*/\\1/g|sort|uniq -c|sort -n

add_ips_to_firewalld()
if ! [[ `firewall-cmd --get-ipsets|grep black_ips` ]];then
firewall-cmd --permanent --new-ipset=black_ips
fi
if ! [[ `firewall-cmd --list-all|grep black_ips` ]];then
firewall-cmd --add-rich-rule="rule family="ipv4" source ipset=black_ips log drop" --permanent
fi
statistics_ip|awk -v max=$max $1 > max"firewall-cmd --ipset=black_ips --get-entries|grep "$2|getline ip;if (ip == "") system("firewall-cmd --permanent --ipset=black_ips --add-entry="$2)ENDsystem("firewall-cmd --reload")

add_ips_to_firewalld

自动屏蔽

最后,可将上述脚本加入计划任务,设置每隔一段时间(比如5分钟或者根据需要自行定夺)执行一次。

自动解除屏蔽ip

当某个(些)ip被加入防火墙黑名单后,如果之后的日志统计中没有再出现,如果需要从黑名单中移除,也可以使用shell脚本来完成。

比如:自动删除黑名单中屏蔽的,但是不在后续统计日志中出现次数>100的ip,脚本实现如下:

#!/bin/bash
read -d "" -a ips_tmp< <(firewall-cmd --list-all|grep -w rule|cut -d"\\"" -f4)
read -d "" -a ips < <(awk $1>100print $2 /var/log/failed_login.log)
ips=echo $ips[@]

for ((i=0;i<$#ips_tmp[@];i++))
do
if ! echo $ips|grep -w $ips_tmp[$i];then
firewall-cmd --remove-rich-rule="rule family="ipv4" source address="$ips_tmp[$i]" log drop" --permanent

#用ipset

# firewall-cmd --permanent --ipset=black_ips --remove-entry=$ips_tmp[$i]

fi
done

可将其加入任务计划,周期可以设置稍微长一些,比如一周,一月甚至更长的周期。

注意:

如果用作统计的日志文件/var/log/failed_login.log增长比较快,必要的情况下,要做好日志分割。

以上是关于基于firewalld的防爆shell脚本的主要内容,如果未能解决你的问题,请参考以下文章

shell日常实战防dos攻击

SHELL脚本学习 --- 第八次作业(安全脚本)

炼钢厂管道温度监控项目案例基于NB-IOT电池供电防爆温度传感器

shell脚本实现ssh-copy-id批量自动发送公钥到远程主机

Shell 脚本中基于菜单的选择

基于mysqldump编写自动全备增备的shell脚本