Firewalld&Journalctl&Shell
Firewalld防火墙是CentOS 7系统默认的防火墙管理工具,取代了之前的iptables防火墙,也是工作在网络层,属于包过滤防火墙。Firewalld和iptables都是用来管理防火墙的工具(属于用户态)来定义防火墙的各种规则功能,内部结构都指向netfiler网络过滤子系统(属于内核态)来实现包过滤防火墙功能。Firewalld提供了支持网络区域所定义的网络连接以及接口安全等级的动态防火墙管理工具支持IPV4、IPV6防火墙设置以及以太网桥(在某些高级服务可能会用到,例如云计算),并且拥有两种配置模式:运行时配置和永久配置。
systemd 提供了一个集中的方式来处理所有来自进程、应用程序等的操作系统日志。所有这些日志事件都由 systemd 的 journald 守护进程来处理。journald 守护进程收集所有来自 Linux 操作系统各处的日志,并将其作为二进制数据存储在文件中。以二进制数据集中记录事件、系统问题的好处有很多。例如,由于系统日志是以二进制而不是文本形式存储的,你可以以文本、JSON 对象等多种方式进行转译,以满足各种需求。另外,由于日志是按顺序存储的,通过对日志的日期/时间操作,超级容易追踪到单个事件。请记住,journald 收集的日志文件数以千行计,而且不断更新每次开机、每个事件。因此,如果你有一个长期运行的 Linux 操作系统,日志的大小应该以 GB 为单位。由于有着数以千计的日志,最好用基本命令进行过滤,以了解更多系统问题。
启动防火墙
┌──(root㉿kali)-[/var/log/journal/e45ca49bf3d64f49bf5d59400f59a22c]
└─# systemctl start firewalld
查看当前防火墙状态
┌──(root㉿kali)-[/var/log/journal/e45ca49bf3d64f49bf5d59400f59a22c]
└─# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/lib/systemd/system/firewalld.service; disabled; preset: disabled)
Active: active (running) since Fri 2024-03-15 17:50:42 CST; 5s ago
Docs: man:firewalld(1)
Main PID: 236350 (firewalld)
Tasks: 2 (limit: 4568)
Memory: 27.2M
CPU: 614ms
CGroup: /system.slice/firewalld.service
└─236350 /usr/bin/python3 /usr/sbin/firewalld --nofork --nopid
Mar 15 17:50:42 kali systemd[1]: Starting firewalld.service - firewalld - dynamic firewall daemon...
Mar 15 17:50:42 kali systemd[1]: Started firewalld.service - firewalld - dynamic firewall daemon.
查看当前SSH服务日志
┌──(root㉿kali)-[/var/log/journal/e45ca49bf3d64f49bf5d59400f59a22c]
└─# journalctl -u ssh.service
Mar 15 16:33:10 kali systemd[1]: Starting ssh.service - OpenBSD Secure Shell server...
Mar 15 16:33:10 kali sshd[197651]: Server listening on 0.0.0.0 port 22.
Mar 15 16:33:10 kali sshd[197651]: Server listening on :: port 22.
//关于Journalctl的具体参数,提供一篇详细文档,可供读者参考
网址
1、基本思路
如何判断SSH远程登录失败,通过查看SSH的操作日志文件:journalctl -u ssh.service(由于本人使用kali作为基础环境,如果是读者使用Centos,可以使用 tail /var/log/secure来查看)来提取登录失败的特征进行判断:Failed password,如果发现日志文件中多次出现,则可以判定为非法登录(暴力破解)。再通过日志文件中的客户端IP地址,将其提取出来,传递给防火墙进行阻止。
2、SHELL脚本(简陋版本)
failcount=$(journalctl -u ssh.service | grep "Failed password" | wc -l)
if [ $failcount -gt 3 ];then
#启动防火墙,防止命令无法写入
#kail默认不安装firewalld,需要手动安装
systemctl start firewalld
journalctl -u ssh.service | grep "Failed password" | awk '{print $11}' | uniq > /mnt/ip.txt
filename="/mnt/ip.txt"
#line=$(journalctl -u ssh.service | grep "Failed password" | awk '{print $11}' | uniq | awk 'END{print NR}')
while read line
do
firewall-cmd --add-rich-rule="rule family=ipv4 source address=$line drop"
echo "登录验证失败,防火墙将封禁此IP:$line"
terminal=$(who | grep $line | awk '{print $2}')
#使用pkill命令强制终止此IP的SSH连接
pkill -kill -t $terminal
echo "已成功断开IP:$line的连接"
done < $filename
fi
3、SHELL脚本(正确版本)
#将可疑IP去从后输出到ip.txt内
touch /mnt/ip.txt
filename="/mnt/ip.txt"
#uniq选项需要使用-d参数,否则相隔行会去重失效
ip=$(journalctl -u ssh.service | grep "Failed password" | awk '{print $11}' | uniq -d > $filename)
#while循环读取每一行的IP地址,对行数进行判断,不冤枉好人
while read line
do
count=$(journalctl -u ssh | grep "192.168.168.20" | egrep '\<Failed\>' | wc -l)
#判断登录尝试超过三次才算攻击者
if [ $count -gt 3 ];then
#此处可进行优化,检查防火墙服务是否被安装
systemctl start firewalld
firewall-cmd --add-rich-rule="rule family=ipv4 source address=$line drop"
if [ $? -eq 0 ];then
echo "登录验证失败,防火墙将封禁此IP:$line"
else
echo "请检查防火墙服务状态"
fi
terminal=$(who | grep $line | awk '{print $2}')
if [ ${#terminal} -gt 0 ];then
#使用pkill命令强制终止此IP的SSH连接
pkill -kill -t $terminal
echo "已成功断开IP:$line的连接"
else
echo "$line并未连接到本地服务器"
fi
fi
done < $filename
思考:如果出现多个终端和多个IP地址应该怎么处理?
芜湖