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次算暴力破解

[root@node11 ~]# mkdir -p /server/scripts
[root@node11 scripts]# tail /var/log/secure
Nov 12 02:12:10 node11 sshd[1504]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Nov 12 02:12:12 node11 sshd[1504]: Failed password for root from 192.168.111.13 port 38136 ssh2
Nov 12 02:12:13 node11 sshd[1499]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
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.这是我们取出登录过这台服务器的客户端IP
[root@node11 scripts]# awk '/Failed password/ {IP[$(NF-3)]++} END {for (k in IP) print IP[k],k }' /var/log/secure 
5 192.168.111.21
6 192.168.111.12
6 192.168.111.13
1 192.168.111.502.这是我们取出输错密码超过4次的客户端IP
[root@node11 scripts]# awk '/Failed password/ {IP[$(NF-3)]++} END {for (k in IP) if (IP[k]>4) print k }' /var/log/secure 
192.168.111.21
192.168.111.12
192.168.111.13

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

准备:

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

iptables封堵IP:

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

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

2.脚本:

[root@node11 scripts]# vim deny_ip_v1.sh
#!/bin/bashawk '/Failed password/ {IP[$(NF-3)]++} END {for (k in IP) if (IP[k]>4) print k }' /var/log/secure > deny_ipwhile read line
doiptables -I INPUT -s $line -p tcp --dport 22 -j DROP
done < deny_ipservice iptables saverm -rf deny_ip

 进行测试:

[root@node11 scripts]# sh deny_ip_v1.sh 
[root@node11 scripts]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  192.168.111.13       0.0.0.0/0            tcp dpt:22
DROP       tcp  --  192.168.111.12       0.0.0.0/0            tcp dpt:22
DROP       tcp  --  192.168.111.21       0.0.0.0/0            tcp dpt:22
......        
[root@node11 scripts]# sh deny_ip_v1.sh     # 再次执行脚本
[root@node11 scripts]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  192.168.111.13       0.0.0.0/0            tcp dpt:22
DROP       tcp  --  192.168.111.12       0.0.0.0/0            tcp dpt:22
DROP       tcp  --  192.168.111.21       0.0.0.0/0            tcp dpt:22
DROP       tcp  --  192.168.111.13       0.0.0.0/0            tcp dpt:22
DROP       tcp  --  192.168.111.12       0.0.0.0/0            tcp dpt:22
DROP       tcp  --  192.168.111.21       0.0.0.0/0            tcp dpt:22
......

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

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

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

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

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

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

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

 5.改进脚本

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

[root@node11 scripts]# vim deny_ip_v2.sh
#!/bin/bashawk '/Failed password/ {IP[$(NF-3)]++} END {for (k in IP) if (IP[k]>4) print k }' /var/log/secure > deny_ip
iptables -L -n | tr -s " " | awk -F"[ :]" '$1=="DROP" && $NF=22 {print $4}' > block_ipwhile read line
doif ! grep -qw $line block_iptheniptables -I INPUT -s $line -p tcp --dport 22 -j DROPfi
done < deny_ipservice iptables saverm -rf deny_ip block_ip

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

[root@node11 scripts]# vim deny_ip_v3.sh
#!/bin/bashawk '/Failed password/ {IP[$(NF-3)]++} END {for (k in IP) if (IP[k]>4) print k }' /var/log/secure > deny_ip
block_ip=$(iptables -L -n | tr -s " " | awk -F"[ :]" '$1=="DROP" && $NF=22 {print $4}')while read line
doif ! echo $block_ip | grep -qw $linetheniptables -I INPUT -s $line -p tcp --dport 22 -j DROPfi
done < deny_ipservice iptables saverm -rf deny_ip
unset block_ip

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

[root@node11 scripts]# vim deny_ip_v4.sh
#!/bin/bashawk '/Failed password/ {IP[$(NF-3)]++} END {for (k in IP) if (IP[k]>4) print k }' /var/log/secure > deny_ip
block_ip=($(iptables -L -n | tr -s " " | awk -F"[ :]" '$1=="DROP" && $NF=22 {print $4}'))while read line
doif ! echo ${block_ip[@]} | grep -qw $linetheniptables -I INPUT -s $line -p tcp --dport 22 -j DROPfi
done < deny_ipservice iptables saverm -rf deny_ip
unset block_ip

6.测试结果:

[root@node11 scripts]# sh deny_ip_v2.sh 
[root@node11 scripts]# iptables -L -n 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  192.168.111.13       0.0.0.0/0            tcp dpt:22
DROP       tcp  --  192.168.111.12       0.0.0.0/0            tcp dpt:22
DROP       tcp  --  192.168.111.21       0.0.0.0/0            tcp dpt:22
......       
[root@node11 scripts]# sh deny_ip_v2.sh     # 再次执行
[root@node11 scripts]# iptables -L -n 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  192.168.111.13       0.0.0.0/0            tcp dpt:22
DROP       tcp  --  192.168.111.12       0.0.0.0/0            tcp dpt:22
DROP       tcp  --  192.168.111.21       0.0.0.0/0            tcp dpt:22
......

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/139043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win11专业版安装Docker Desktop,并支持映射主机的gpu

一、Windows环境下安装 Docker 必须满足: 1. 64位Windows 11 Pro(专业版和企业版都可以) 2. Microsoft Hyper-V,Hyper-V是微软的虚拟机,在win11上是自带的,我们只需要启动就可以了 二、下载Docker Desktop安装包 方式一:进入官网下载 https://docs.docker.com/desktop…

图论11-欧拉回路与欧拉路径+Hierholzer算法实现

文章目录 1 欧拉回路的概念2 欧拉回路的算法实现3 Hierholzer算法详解4 Hierholzer算法实现4.1 修改Graph&#xff0c;增加API4.2 Graph.java4.3 联通分量类4.4 欧拉回路类 1 欧拉回路的概念 2 欧拉回路的算法实现 private boolean hasEulerLoop(){CC cc new CC(G);if(cc.cou…

TypeScript: 判断两个数组的内容是否相等

一、直接遍历 // 1.直接遍历 const arr1: any[] ["apple", "banana", NaN]; const arr2: any[] ["apple", NaN, "banana"];function fn1(arr1: any[], arr2: any[]) {// Array.some(): 有一项不满足&#xff0c;返回falseif (arr1.…

【已验证-直接用】微信小程序wx.request请求服务器json数据并渲染到页面

微信小程序的数据总不能写死吧&#xff0c;肯定是要结合数据库来做数据更新&#xff0c;而小程序数据主要是json数据格式&#xff0c;所以我们可以利用php操作数据库&#xff0c;把数据以json格式数据输出即可。 现在给大家讲一下微信小程序的wx.request请求服务器获取数据的用…

大数据毕业设计选题推荐-生产大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

junit写搜索树测试

用法 assertTrue(range.contains("Two")); 2个参数,右边错就打印左边. AbstractSelfBalancingBinarySearchTree abt; AbstractBinarySearchTree.Node node; Before public void setUp() { abt new AbstractSelfBalancingBinarySearchTree() { Override protecte…

Leetcode70 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&#xff1…

深度学习 python opencv 火焰检测识别 火灾检测 计算机竞赛

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

近期的一些思考

1.对于程序员这个职业 &#xff0c;完全没有必要通过打工听人安排而活着&#xff0c;而是反过来通过在公司工作提高自己的技能&#xff0c;让自己可以更为独立和自由地生活。 2.没什么技术含量的工作&#xff0c;就像在学生时代那样交作业就好了。想尽一切方法提高交作业的效率…

Mysql数据库 14.SQL语言 视图

一、视图的概念 视图&#xff1a;就是由数据库中一张或多张表根据特定的条件查询出的数据狗造成的虚拟表 二、视图的作用 安全性&#xff0c;简单性 三、视图的语法 语法 create view 视图表 as select_statement; 代码实现 #创建视图 将查询结果创建称为视图&#x…

百度王颖:百度文库以AI创作能力突破语言边界,促进思想碰撞和文化融通

1月9日&#xff0c;2023年世界互联网大会乌镇峰会“网络传播与文明交流互鉴论坛”召开。百度副总裁、互娱和垂类平台负责人王颖出席并发表“以技术搭建跨文化交流桥梁”主题演讲。她表示&#xff0c;在大模型的加持下&#xff0c;百度各个产品都在重构&#xff0c;通过技术助力…

golang两个坑实录

1. 不可将一个error的具体对象&#xff0c;复制给一个error的interface。同理&#xff0c;不能将一个具体的指针对象&#xff0c;复制给一个interface。因为在interface判断为nil的时候&#xff0c;即使指针其实是nil&#xff0c;但是因为是赋值给interface了。导致interface其…

第24章_mysql性能分析工具的使用

文章目录 1. 数据库服务器的优化步骤2.查看系统性能参数3. 统计SQL的查询成本&#xff1a;last_query_cost4. 定位执行慢的 SQL&#xff1a;慢查询日志4.1 开启慢查询日志参数4.2 查看慢查询数目4.3 测试慢sql语句&#xff0c;查看慢日志4.4 系统变量 log_output&#xff0c; l…

跟着GPT学设计模式之工厂模式

工厂模式&#xff08;Factory Design Pattern&#xff09;分为三种更加细分的类型&#xff1a;简单工厂、工厂方法和抽象工厂。在这三种细分的工厂模式中&#xff0c;简单工厂、工厂方法原理比较简单&#xff0c;在实际的项目中也比较常用。而抽象工厂的原理稍微复杂点&#xf…

【小收获】给定一个自定义的大小关系,然后给出其中两个元素,要求判断它们的大小关系

思路&#xff1a;由于该自定义的大小关系编译器并不知道&#xff0c;所以可以给它们都搞一个下标&#xff0c;从而根据下标的大小关系去判断各个元素之间的大小关系 例如&#xff1a;扑克牌中单张牌的大小关系为&#xff1a;3<4<5<6<7<8<9<X<J<Q<…

k8s篇之underlay网络和overlay区别

k8s中underlay网络和overlay区别 一、网络 1 Overlay网络&#xff1a; Overlay叫叠加网络也叫覆盖网络&#xff0c;指的是在物理网络的基础之上迭代实现新的虚拟网络&#xff0c;即可使网络中的容器可以互相通信。 优点是对物理网络的兼容性比较好&#xff0c;可以实现pod的…

TensorFlow2.0教程3-CNN

` 文章目录 基础CNN网络读取数据卷积层池化层全连接层模型配置模型训练CNN变体网络简单的深度网络添加了其它功能层的深度卷积NIN网络文本卷积基础CNN网络 读取数据 import numpy as np import tensorflow as tf import tensorflow.keras as keras import tensorflow.keras.la…

uniapp中在组件中使用被遮挡或层级显示问题

uniapp中在组件中使用或croll-view标签内使用uni-popup在真机环境下会被scroll-view兄弟元素遮挡&#xff0c;在开发环境下和安卓系统中可以正常显示&#xff0c;但在ios中出现了问题 看了许多文章都没有找到问题的原因&#xff0c;最后看到这一个文章http://t.csdnimg.cn/pvQ…

acwing算法基础之数据结构--STL简介

目录 1 基础知识2 模板3 使用示例3.1 vector3.2 pair3.3 string3.4 queue 1 基础知识 无。 2 模板 vector, 变长数组&#xff0c;倍增的思想size() 返回元素个数empty() 返回是否为空clear() 清空front()/back() 使用时&#xff0c;必须判断向量类容器非空push_back()/po…

C/S架构学习之基于UDP的本地通信(服务器)

基于UDP的本地通信&#xff08;服务器&#xff09;&#xff1a;创建流程&#xff1a;一、创建数据报式套接字&#xff08;socket函数&#xff09;&#xff1a; int sock_fd socket(AF_UNIX,SOCK_DGRAM,0);if(-1 sock_fd){perror("socket error");exit(-1);}二、创建…