当前位置:   article > 正文

shell脚本实战案例---安全脚本

shell脚本实战案例---安全脚本

例题:自动化禁止恶意IP访问
        应用场景:防止恶意IP尝试ssh登录。---暴力破解密码
        脚本说明:将密码输入错误超过4次的IP地址通过iptables防火墙阻止访问。

目录

1.脚本分析:

【1】首先ssh登录之后,产生的日志文件是哪个,模拟暴力破解密码会有什么提示,我们约定输错密码超过4次算暴力破解

【2】我们如何容日志中取出暴力破解密码的客户端IP

【3】在生产环境中我们经常使用iptables,所以我们使用iptables封堵IP

2.脚本:

3.多次执行脚本之后,通过查看iptables列表,发现V1版本有bug:相同的IP和端口多次封堵

4..如何获取已经封堵IP

【1】从iptables -L -n 命令行入手

【2】从防火墙保存文件/etc/sysconfig/iptables入手

 5.改进脚本

【1】利用临时文件解决bug

【2】使用临时变量来解决bug

【3】使用临时数组来解决bug

6.测试结果:


1.脚本分析:

【1】首先ssh登录之后,产生的日志文件是哪个,模拟暴力破解密码会有什么提示,我们约定输错密码超过4次算暴力破解

  1. [root@node11 ~]# mkdir -p /server/scripts
  2. [root@node11 scripts]# tail /var/log/secure
  3. Nov 12 02:12:10 node11 sshd[1504]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
  4. Nov 12 02:12:12 node11 sshd[1504]: Failed password for root from 192.168.111.13 port 38136 ssh2
  5. Nov 12 02:12:13 node11 sshd[1499]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
  6. Nov 12 02:12:14 node11 sshd[1499]: Failed password for root from 192.168.111.12 port 52866 ssh2

由代码可知,产生日志的文件是/var/log/secure,提示为Failed password

【2】我们如何容日志中取出暴力破解密码的客户端IP

  1. 1.这是我们取出登录过这台服务器的客户端IP
  2. [root@node11 scripts]# awk '/Failed password/ {IP[$(NF-3)]++} END {for (k in IP) print IP[k],k }' /var/log/secure
  3. 5 192.168.111.21
  4. 6 192.168.111.12
  5. 6 192.168.111.13
  6. 1 192.168.111.50
  7. 2.这是我们取出输错密码超过4次的客户端IP
  8. [root@node11 scripts]# awk '/Failed password/ {IP[$(NF-3)]++} END {for (k in IP) if (IP[k]>4) print k }' /var/log/secure
  9. 192.168.111.21
  10. 192.168.111.12
  11. 192.168.111.13

【3】在生产环境中我们经常使用iptables,所以我们使用iptables封堵IP

准备:

  1. [root@node11 scripts]# yum whatprovides iptables # 查看iptables命令是由哪个软件包提供
  2. [root@node11 scripts]# yum install -y iptables-services
  3. [root@node11 scripts]# systemctl start iptables.service # 启动之后,会出现默认规则
  4. [root@node11 scripts]# iptables -L -n # 列出当前iptables防火墙规则中的所有规则
  5. Chain INPUT (policy ACCEPT)
  6. target prot opt source destination
  7. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
  8. ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
  9. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  10. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
  11. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-
  12. ...
  13. [root@node11 scripts]# iptables -F # 清除iptables防火墙规则中的所有规则
  14. [root@node11 scripts]# iptables -L -n # 再次进行查看
  15. Chain INPUT (policy ACCEPT)
  16. target prot opt source destination
  17. Chain FORWARD (policy ACCEPT)
  18. target prot opt source destination
  19. Chain OUTPUT (policy ACCEPT)
  20. target prot opt source destination

iptables封堵IP:

  1. [root@node11 scripts]# iptables -I INPUT -s 192.168.111.13 -p tcp --dport 22 -j DROP
  2. [root@node11 scripts]# service iptables save # 保存规则
  3. [root@node11 scripts]# iptables -L -n # 再次查看,看看是否保存
  4. Chain INPUT (policy ACCEPT)
  5. target prot opt source destination
  6. DROP tcp -- 192.168.111.13 0.0.0.0/0 tcp dpt:22
  7. ......
  8. [root@node11 scripts]# more /etc/sysconfig/iptables # 也可以查看文件
  9. # Generated by iptables-save v1.4.21 on Sun Nov 12 02:55:39 2023
  10. *filter
  11. :INPUT ACCEPT [266:16148]
  12. :FORWARD ACCEPT [0:0]
  13. :OUTPUT ACCEPT [156:12788]
  14. -A INPUT -s 192.168.111.13/32 -p tcp -m tcp --dport 22 -j DROP
  15. COMMIT
  16. # Completed on Sun Nov 12 02:55:39 2023

因为要不断的测试脚本,所以我们每操作完一项,就可以清除iptables防火墙规则中的所有规则,方便我们下次进行测试。

2.脚本:

  1. [root@node11 scripts]# vim deny_ip_v1.sh
  2. #!/bin/bash
  3. awk '/Failed password/ {IP[$(NF-3)]++} END {for (k in IP) if (IP[k]>4) print k }' /var/log/secure > deny_ip
  4. while read line
  5. do
  6. iptables -I INPUT -s $line -p tcp --dport 22 -j DROP
  7. done < deny_ip
  8. service iptables save
  9. rm -rf deny_ip

 进行测试:

  1. [root@node11 scripts]# sh deny_ip_v1.sh
  2. [root@node11 scripts]# iptables -L -n
  3. Chain INPUT (policy ACCEPT)
  4. target prot opt source destination
  5. DROP tcp -- 192.168.111.13 0.0.0.0/0 tcp dpt:22
  6. DROP tcp -- 192.168.111.12 0.0.0.0/0 tcp dpt:22
  7. DROP tcp -- 192.168.111.21 0.0.0.0/0 tcp dpt:22
  8. ......
  9. [root@node11 scripts]# sh deny_ip_v1.sh # 再次执行脚本
  10. [root@node11 scripts]# iptables -L -n
  11. Chain INPUT (policy ACCEPT)
  12. target prot opt source destination
  13. DROP tcp -- 192.168.111.13 0.0.0.0/0 tcp dpt:22
  14. DROP tcp -- 192.168.111.12 0.0.0.0/0 tcp dpt:22
  15. DROP tcp -- 192.168.111.21 0.0.0.0/0 tcp dpt:22
  16. DROP tcp -- 192.168.111.13 0.0.0.0/0 tcp dpt:22
  17. DROP tcp -- 192.168.111.12 0.0.0.0/0 tcp dpt:22
  18. DROP tcp -- 192.168.111.21 0.0.0.0/0 tcp dpt:22
  19. ......

3.多次执行脚本之后,通过查看iptables列表,发现V1版本有bug:相同的IP和端口多次封堵

解决思路:让封堵的IP和端口不再封堵

4..如何获取已经封堵IP

【1】从iptables -L -n 命令行入手

  1. [root@node11 scripts]# iptables -L -n | tr -s " " | awk -F"[ :]" '$1=="DROP" && $NF=22 {print $4}'
  2. 192.168.111.13
  3. 192.168.111.12
  4. 192.168.111.21
  5. 192.168.111.13
  6. 192.168.111.12
  7. 192.168.111.21

【2】从防火墙保存文件/etc/sysconfig/iptables入手

  1. [root@node11 scripts]# awk -F"[ /]" '$11=22 && $NF=="DROP" {print $4}' /etc/sysconfig/iptables
  2. 192.168.111.13
  3. 192.168.111.12
  4. 192.168.111.21
  5. 192.168.111.13
  6. 192.168.111.12
  7. 192.168.111.21

 5.改进脚本

【1】利用临时文件解决bug

  1. [root@node11 scripts]# vim deny_ip_v2.sh
  2. #!/bin/bash
  3. awk '/Failed password/ {IP[$(NF-3)]++} END {for (k in IP) if (IP[k]>4) print k }' /var/log/secure > deny_ip
  4. iptables -L -n | tr -s " " | awk -F"[ :]" '$1=="DROP" && $NF=22 {print $4}' > block_ip
  5. while read line
  6. do
  7. if ! grep -qw $line block_ip
  8. then
  9. iptables -I INPUT -s $line -p tcp --dport 22 -j DROP
  10. fi
  11. done < deny_ip
  12. service iptables save
  13. rm -rf deny_ip block_ip

【2】使用临时变量来解决bug

  1. [root@node11 scripts]# vim deny_ip_v3.sh
  2. #!/bin/bash
  3. awk '/Failed password/ {IP[$(NF-3)]++} END {for (k in IP) if (IP[k]>4) print k }' /var/log/secure > deny_ip
  4. block_ip=$(iptables -L -n | tr -s " " | awk -F"[ :]" '$1=="DROP" && $NF=22 {print $4}')
  5. while read line
  6. do
  7. if ! echo $block_ip | grep -qw $line
  8. then
  9. iptables -I INPUT -s $line -p tcp --dport 22 -j DROP
  10. fi
  11. done < deny_ip
  12. service iptables save
  13. rm -rf deny_ip
  14. unset block_ip

【3】使用临时数组来解决bug

  1. [root@node11 scripts]# vim deny_ip_v4.sh
  2. #!/bin/bash
  3. awk '/Failed password/ {IP[$(NF-3)]++} END {for (k in IP) if (IP[k]>4) print k }' /var/log/secure > deny_ip
  4. block_ip=($(iptables -L -n | tr -s " " | awk -F"[ :]" '$1=="DROP" && $NF=22 {print $4}'))
  5. while read line
  6. do
  7. if ! echo ${block_ip[@]} | grep -qw $line
  8. then
  9. iptables -I INPUT -s $line -p tcp --dport 22 -j DROP
  10. fi
  11. done < deny_ip
  12. service iptables save
  13. rm -rf deny_ip
  14. unset block_ip

6.测试结果:

  1. [root@node11 scripts]# sh deny_ip_v2.sh
  2. [root@node11 scripts]# iptables -L -n
  3. Chain INPUT (policy ACCEPT)
  4. target prot opt source destination
  5. DROP tcp -- 192.168.111.13 0.0.0.0/0 tcp dpt:22
  6. DROP tcp -- 192.168.111.12 0.0.0.0/0 tcp dpt:22
  7. DROP tcp -- 192.168.111.21 0.0.0.0/0 tcp dpt:22
  8. ......
  9. [root@node11 scripts]# sh deny_ip_v2.sh # 再次执行
  10. [root@node11 scripts]# iptables -L -n
  11. Chain INPUT (policy ACCEPT)
  12. target prot opt source destination
  13. DROP tcp -- 192.168.111.13 0.0.0.0/0 tcp dpt:22
  14. DROP tcp -- 192.168.111.12 0.0.0.0/0 tcp dpt:22
  15. DROP tcp -- 192.168.111.21 0.0.0.0/0 tcp dpt:22
  16. ......

生产环境中会结合计划任务进行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/266827
推荐阅读
相关标签
  

闽ICP备14008679号