应用场景:防止恶意IP尝试ssh登录
脚本说明:将密码输入错误超过四次得ip地址通过iptable防火墙访问。
分析:
- 首先,需要知道ssh远程访问记录在哪一个文件中 /var/log/secure
- 其次,模拟远程访问输错密码,查看日志文件
- 再次,通过日志可以看到关键信息“Failed password”表示错误密码有可能事手误引起得,所以设定几次错误为恶意试探密码,建议设置为4;还有需要将恶意试探密码主机得ip提取出来,对提取得ip地址进行统计计数
- 最后,需要明确怎么在脚本中通过iptables策略设置阻止恶意ip访问策略添加到哪里合适;防火墙2配置文件等。
模拟远程访问,查看日志
发现每一次错误密码后,显示主机ip时前都有 Failed password
所以我还可以借助Failed password字段来获取 恶意访问ip。二ip在倒数第三个字段(以空格为分隔符)
awk '/Failed password/ {print $(NF-3)}' /var/log/secure
设定4次错误为恶意试探密码,并提取得ip地址进行统计计数
首先我没需要将恶意IP地址进行统计
[root@cotenos ~]# awk '/Failed password/ {IP[$(NF-3)]++} END{for (i in IP) print i,IP[i]}' /var/log/secure
对超过4次的错误的ip进行选取
[root@cotenos ~]# awk '/Failed password/ {IP[$(NF-3)]++} END{for (i in IP) {if ($IP[i] >= 4) print i,IP[i]}}' /var/log/secure
或者
[root@cotenos ~]# awk '/Failed password/ {print $(NF-3)}' /var/log/secure | sort | uniq -c | awk '$1>=4 {print $2}'
最后将获取的ip遍历,使用firewalld-cmd命令对ip进行阻隔
总代码
#!/bin/bash
bath=/var/log/secure
ip=`awk '/Failed password/ {IP[$(NF-3)]++} END{for (i in IP) {if ($IP[i] >= 4) print i}}' $bath`
for i in $ip
do
firewall-cmd --add-rich-rule="rule family=ipv4 source address=$i/32 service name=ssh dorp"
done