目录
防火墙安全应急
实验内容:
1.通过SSH远程登录失败多次,通过防火墙将其屏蔽,并发送通知
一、如何判断SSH远程登录失败?
基本思路
通过查看SSH的操作日志文件:/var/log/secure 来提取登录失败的特征进行判断:Failed password , 如果发现日志文件中出现多次,则可以判定为非法登录(暴力破解)。在通过日志文件中的客户端IP地址,将其提取出来,传递给 firewall-cmd 命令进行阻止
首先我们发现只要登录失败一次在文件 /var/log/secure 中就会有一次记录,就像下面图中的情况
然后我们又如何在命令行中知道到底统计到了多少这个 Failed password ,可以使用命令
grep Failed\ password /var/log/secure| wc -l
或
grep "Failed password" /var/log/secure| wc -l
来计算统计到的次数
二、脚本实现
第一步:
判断如果密码输错了3次
sshcount=$(grep "Failed password" /var/log/secure | wc -l) if[ $sshcount -gt 3 ]; then echo "密码输错3次" fi
第二步:
获取ip地址
将以下内容添加进脚本 grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | uniq #获取ip地址 grep "Failed password for root" /var/log/secure | awk '{print $11}' | uniq #获取用户名
脚本内容: sshcount=$(grep "Failed password" /var/log/secure | wc -l) if [ $sshcount -gt 3 ]; then echo "密码输入错误三次" ip1=$(grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | uniq)#这个是针对外界用户 ip2=$(grep "Failed password for root" /var/log/secure | awk '{print $11}' | uniq)#这个是针对本地用户 fi
三、设定防火墙富规则,同时开启防火墙
使用防火墙富规则禁止某个ip访问
富规则形式如下: firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.230.1 drop' 判断防火墙开关命令如下: openordown=firewall-cmd --state if [ $openordown!=running ]; then systemctl start firewalld fi
但是由于脚本中的 firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.230.1 drop'
$IP 这个由于是在 ``之间,因此不会进行运算和变量的替换,所以这样就会报错
所以在这里我们需要将他的形式修改一下
富规则形式如下: firewall-cmd --add-rich-rule "rule family=ipv4 source address=$ip drop"
完整代码为: sshcount=$(grep "Failed password" /var/log/secure | wc -l) if [ $sshcount -gt 3 ]; then echo "密码输入错误三次" ip1=$(grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | uniq) ip2=$(grep "Failed password for root" /var/log/secure | awk '{print $11}' | uniq) if [ $ip1 = $ip2 ]; then firewall-cmd --add-rich-rule "rule family=ipv4 source address=$ip1 drop" echo "防火墙已经阻止该$ip1的访问" else firewall-cmd --add-rich-rule "rule family=ipv4 source address=$ip1 drop" echo "防火墙已经阻止该$ip1的访问" firewall-cmd --add-rich-rule "rule family=ipv4 source address=$ip2 drop" echo "防火墙已经阻止该$ip2的访问" fi fi
这样才算将这个问题解决了
现在就根本连不上了
四、在三的基础上阻止在阻止之前已经连接的存在
我们知道,使用 who 命令可以查看登录的用户,通过 grep 和 awk 可以单独得出用户的代号
补充知识:
通常情况下我们是使用的 kill pid
来阻止进程的,那我们要是需要使用进程名来阻止呢,需要怎么做 ?
使用 pkill 进程名
这样可以通过进程名来阻止进程
当然, pkill 还可以结束远程登录到 linux本台服务器的设备
[root@mycentos opt]# who root tty1 2023-09-11 00:23 root pts/0 2023-10-21 10:57 (192.168.230.1) root pts/1 2023-10-21 11:45 (192.168.230.1) root pts/2 2023-10-21 16:25 (192.168.230.1) #who 可以查看是谁登录进了我 使用 pkill -kill -t pts/0 强制踢掉 pts/0 的登录
五、日志很多,需要将已经处理过的日志排除掉
可以选择将已经搜索过得 Failed password 替换掉 password 就好了(使用sed替换),替换后的结果自己随机制定
六、如果同时找出了多条终端,该如何将他们全部终止
七、如果同时找出了多条ip地址改如何处理
上面两个问题的解决办法是一样的
方法一:
将查询到的多条结果重定向到一个文件中,可以使用 wc -l
的方式获取文件行数,然后使用while循环按行读取文件的方式来解决
方法二:
使用 awk 的 NR 可以获得文件的总行数
awk 'END{print NR}' filename