AWK +iptables+shell实战脚本案例

目录

一、在Centos下安装httpd

 查看安装是否成功

 重启httpd

查看80端口是否开放

在主机上查询

查看防火墙

在浏览器中查询主机IP地址

查看日志是否生成

二、AWK +iptables+shell实战脚本案例

1、封堵扫描器

(1) 开始扫描器

特别注意:在Vim中尽量不要使用空格,否则会容易报错

 给deny_scan.sh文件夹访问权限

 查看脚本功能是否执行正常

 (2) 结束扫描器

(3)过滤单位时间内访问量最高的ip,并把它写入到一个文件中

在apache访问界面中任意请求几次,生成temp文件

 原因:时间不匹配

(4)防火墙防御扫描器shell脚本

补充知识点:

第一种执行方式:括号()

第二种执行方式:反引号 ``

2、防御SSH爆破脚本

脚本规定:当ssh登录次数超过三次,脚本直接封堵

(1) 测试代码功能是否完善

(2) 使用Windows自带命令窗口进行登录失败次数测试

(3) 基线检查shell脚本


一、在Centos下安装httpd

[root@localhost centos]# yum install httpd -y

 查看安装是否成功

 重启httpd

[root@localhost httpd]# service restart httpd
[root@localhost httpd]# systemctl restart httpd.service

查看80端口是否开放

在主机上查询

 [root@localhost httpd]# curl httpd://localhost

 由此可见在主机上访问成功

查看防火墙

[root@localhost httpd]# iptables -nvxL INPUT

在浏览器中查询主机IP地址

 由此可见httpd安装成功

查看日志是否生成

[root@localhost httpd]# cd /var/log/httpd
[root@localhost httpd]# ls -al
total 12
drwx------.  2 root root   41 Aug 11 19:59 .
drwxr-xr-x. 21 root root 4096 Aug 11 19:43 ..
-rw-r--r--.  1 root root 2037 Aug 11 20:06 access_log
-rw-r--r--.  1 root root 1307 Aug 11 20:06 error_log
[root@localhost httpd]# vim access_log

二、AWK +iptables+shell实战脚本案例

1、封堵扫描器

(1) 开始扫描器

#!/bin/bash
#找到你的日志路径

log=/var/log/httpd

#找出一分钟之内的日志,找出ip最高的十个IP

#开始时间的一分钟之前
last_minutes=1

start_time=$(date -d"$last_minutes minutes ago" +"%d/%m/%Y:%H:%M:%S")
echo $start_time

特别注意:在Vim中尽量不要使用空格,否则会容易报错

 给deny_scan.sh文件夹访问权限

[root@localhost httpd]# chmod +x deny_scan.sh

脚本执行成功

此时是2023年8月12日1:27分钟,是脚本中的一分钟前

 查看脚本功能是否执行正常

[root@localhost centos]# echo $(date -d"$1 minutes ago" +"%d/%m/%Y:%H:%M:%S")//一分钟之前
12/08/2023:01:29:28
[root@localhost centos]# echo $(date -d"$5 minutes ago" +"%d/%m/%Y:%H:%M:%S")//五分钟之前
12/08/2023:01:29:38

 (2) 结束扫描器

#!/bin/bash
#找到你的日志路径

log=/var/log/httpd

#找出一分钟之内的日志,找出ip最高的十个IP

#开始时间的一分钟之前
last_minutes=1

start_time=$(date -d"$last_minutes minutes ago" +"%d/%m/%Y:%H:%M:%S")
echo $start_time

#结束时间
end_time=$(date +"%d/%m/%Y:%H:%M:%S")
echo $end_time

~   

 执行成功:

(3)过滤单位时间内访问量最高的ip,并把它写入到一个文件中

#!/bin/bash
#找到你的日志路径

logfile=/var/log/httpd/

#找出一分钟之内的日志,找出ip最高的十个IP

#开始时间的一分钟之前
last_minutes=1

start_time=$(date -d"$last_minutes minutes ago" +"%d/%b/%Y:%H:%M:%S")
echo $start_time

#结束时间
end_time=$(date +"%d/%b/%Y:%H:%M:%S") 
echo $end_time


#通过awk进行top10的ip筛选
tac $logfile/access_log | awk -v st="$start_time" -v et="$end_time" '{t=substr($4,2);if(t>=st&&t<=et){print $1}}' | sort | uniq -c |sort -nr | head -n 10 > $logfile/log-ip-top10

 查看日志

在apache访问界面中任意请求几次,生成temp文件

 脚本执行成功

top10文件已生成  

查看top10 文件 

[root@localhost httpd]# vim log-ip-top10

发现top10 中没有内容

 原因:时间不匹配

[root@localhost centos]# cat /var/log/httpd/access_log | head -n 1

 查看帮助文档

[root@localhost centos]# date --help

 解决方法:将月份修改成如下格式:

 再次运行,此时时间ip基本吻合

 再次执行代码,在浏览器提交任意信息,然后查看top10

 由此可见,此时log-ip-top10内已经写入文件

查看log-ip-top10文件夹

[root@localhost centos]# cat /var/log/httpd/log-ip-top10

(4)防火墙防御扫描器shell脚本

#找到你的日志路径

logfile=/var/log/httpd/

#找出一分钟之内的日志,找出ip最高的十个IP

#开始时间的一分钟之前
last_minutes=1

start_time=$(date -d"$last_minutes minutes ago" +"%d/%b/%Y:%H:%M:%S")
echo $start_time

#结束时间
end_time=$(date +"%d/%b/%Y:%H:%M:%S")
echo $end_time


#通过awk进行top10的ip筛选
tac $logfile/access_log | awk -v st="$start_time" -v et="$end_time" '{t=substr($4,2);if(t>=st&&t<=et){print $1}}' | sort | uniq -c |sort -nr | head -n 10 > $logfile/log-ip-top10


#log-ip-top10————10geip
#单位时间内,只允许10次访问

ips=`cat `$logfile/log-ip-top10 | awk '{if($1 > 5)print $2}'
#由于Ip筛选了10个,因此需要循环处理
for ip in $ips
do
echo $ip >> $logfile/getip.txt
echo $ip
iptables -t filter -I INPUT -p tcp  -m multiport --dport 80,443 -s $ip -j DROP
done

主要功能:防御恶意扫描器扫描并封堵

 [root@localhost centos]# cd /var/log/httpd
[root@localhost httpd]# cat log-ip-top10
     35 192.168.17.1
[root@localhost httpd]# cat log-ip-top10 | awk '{if($1 > 10)print $2}'
192.168.17.1

 执行成功

 查看/var/log/httpd/有无getip

此时getip已经写入

再次刷新apache网页,会发现此时网页无法正常刷新,此时防火墙将恶意扫描器给封堵住

 查看防火墙状态

[root@localhost httpd]# iptables -nvvxL INPUT --line-numbers

 由此可见此时防火墙打开并防御住恶意扫描器

补充知识点:


第一种执行方式:括号()

举例:

[root@localhost httpd]# echo $(date)

 [root@localhost httpd]# echo $(id)

第二种执行方式:反引号 ``

举例

[root@localhost httpd]# echo $`date`

 [root@localhost httpd]# echo $`id`

2、防御SSH爆破脚本

 SSH爆破文件日志放在secure文件夹中

脚本规定:当ssh登录次数超过三次,脚本直接封堵

#!/bin/bash
logfile=/var/log/secure

#第一步,扫描取出IP
IP=$(awk '/Failed password/{arr[$(NF-3)++]}END{for(i in arr){if(arr[i]>=3)print i}}' $logfile)


for ip in $ips
do
#-L -n :筛选IP;tr -s:转换格式   作用:筛选曾经被封堵过的IP
tmpIP=`iptables -L -n | tr -s " " | awk '/^DROP/ && /22$/{print $4}'`

#{tmpIP[@]:shell标准语法,`@`和`*`是数组的特殊索引,表示返回数组的所有成员。
echo $ {tmpIP[@]} | grep -qw $ip
#$?——上次执行命令结果   前一次结果执行正确,输出0,否则输出1
if [ $? -ne 0]

then
iptables -t filter -I INPUT -P tcp --DPORT 22 -J DROP
fi
done
unset tmpIP


#以下可省略
# #查看防火墙是否安装
# rpm -q iptables-services & > /dev/null
# #如果没有安装,则安装防火墙,并将其添加到开机自启动
# if [ $? -ne 0]
# yum -y install iptables-services & > /dev/null
# systemctl enable --now iptables.service & > /dev/null

# fi
# #将配置保存到/etc/sysconfig/
# iptables-save > /etc/sysconfig/iptables
# #删除临时IP
# unset tmpIP
 

(1) 测试代码功能是否完善

 直接打印测试,此时打印六次,正确

[root@localhost log]# awk '/Failed password/{arr[$(NF-3)]++}END{for(i in arr){print i, arr[i]}}' secure

 for循环后直接打印测试:循环打印六次,正确

[root@localhost log]# awk '/Failed password/{arr[$(NF-3)]++}END{for(i in arr){if(arr[i]>=4)}}' secure

 执行判断条件arr[i]>=4后打印 i 测试:因为此时循环已超过三次,所以结果只打印一次

查看以下代码筛选结果,查看有无曾经封堵的IP:其中头部是DROP的则是封堵ip的关键字

[root@localhost centos]# iptables -L -n | tr -s " " 

 通过awk继续筛选DROP

[root@localhost centos]# iptables -L -n | tr -s " " awk '/^DROP/ && /22$/{print $4}'

#$?——上次执行命令结果   前一次结果执行正确,输出0,执行错误输出1
if [ $? -ne 0]

如果前一个结果输出为1,说明未曾封堵过IP,如果输出为0,说明曾封堵过IP

 `[ integer1 -ne integer2 ]`:如果`integer1`不等于`integer2`,则为`true`。

如果不是0,接下来调用iptables进行封堵

then
iptables -t filter -I INPUT -P TCP --DPORT 22 -J DROP

删除测试secure目录下保存的数据

[root@localhost centos]# echo "" > /var/log/secure

(2) 使用Windows自带命令窗口进行登录失败次数测试

当第三次输入命令出错时,ssh登录过程自动结束

查看secure保存数据时可以发现三条登录失败的数据 

 给 deny_ssh_scan.sh提权

 [root@localhost centos]# chmod +x deny_ssh_scan.sh

 [root@localhost centos]# ./deny_ssh_scan.sh

此时可以看到ssh登录已经被限制  

(3) 基线检查shell脚本

基线检查规定:

#! /bin/bash
fail=0
pass=0
manual=0
separator="------------------------------------------------------"
check_pass(){
echo -e "\033[42;30m [++]PASS \033[0m"          #成功打印绿底黑字
let pass++
}

check_fail(){
echo -e "\033[41;37m [++]FAIL \033[0m"   #失败打印红底白字
let fail++
}

check_manual(){
echo -e "\033[43;30m [++]请手动检测该项或依据实际情况判断!! \033[0m"               #未检测到文件或须手动确认打印黄底黑字
let manual++
}

echo "NO.1-检查是否设置口令生存周期"
pass_max_day=`cat /etc/login.defs | grep PASS_MAX_DAYS | grep -v ^# | awk '{print $2}'`

if [ "$pass_max_day" -lt "90" ]; then
        check_pass
elif [ "$pass_max_day" -gt "90" ]; then
    echo "口令生存周期:$pass_max_day"
        check_fail
else
        check_manual
fi
echo $separator

echo "NO.2-检查是否设置口令最小长度"
pass_min_len=`cat /etc/login.defs | grep PASS_MIN_LEN | grep -v ^# | awk '{print $2}'`
if test -n "$pass_min_len"; then
        if [ "$pass_min_len" -lt "8" ]; then
        echo "口令最小长度:$pass_min_len"
                check_fail
        elif [ "$pass_min_len" -ge "8" ]; then
                check_pass
        else 
                check_manual
        fi
else 
        check_manual
fi
echo $separator

echo "NO.3-检查是否配置口令过期提醒"
pass_warn_age=`cat /etc/login.defs | grep PASS_WARN_AGE | grep -v ^# | awk '{print $2}'`
if test -n "$pass_warn_age"; then
        if [ "$pass_warn_age" -lt 30 ]; then
        echo "口令过期提醒天数:$pass_warn_age"
                check_fail
        elif [ "$pass_warn_age" -ge "30" ]; then
                check_pass
        else
                check_manual
        fi
else
        check_manual
fi 
echo $separator

echo "NO.4-检查是否存在空口令账户"
empty_user=`cat /etc/shadow | awk -F : 'length($2)==0 {print $1}'`
if test -z "$empty_user"; then
        check_pass

elif test -n "$empty_user"; then
        echo "请检查空口令账户:$empty_user"
        check_fail
else
        check_manual
fi
echo $separator

echo "NO.5-检查是否存在特权账户"
root_account=`cat /etc/passwd | awk -F : '($3==0){print $1}'`
if [ $root_account=="root" ]; then
        check_pass

else
    echo "请检查uid为0的账户: $root_account"
        check_fail
fi
echo $separator


echo "NO.6-检查错误登录是否记录到日志"
FailLogin_log=`cat /etc/login.defs | grep FAILLOG_ENAB | grep -v ^# | awk '{print $2}'`
if [ $FailLogin_log=="yes" ]; then
        check_pass
elif [ $FailLogin_log=="no" ]; then
        check_fail
else
        check_manual
fi
echo $separator

echo "NO.7-检查口令复杂度"
min_class=`cat /etc/security/pwquality.conf | grep minclass | grep -v ^# | awk '{print $3}'`
if [ "$min_class" -lt "3" ]; then
    echo "口令类型少于3种!"
    check_fail
elif [ "$min_class" -ge "3" ]; then
    check_pass
else
check_manual
fi
echo $separator

echo "NO.8-检查重要文件的权限"
for i in /etc/shadow /etc/gshadow
do
    tmppe=`stat -c %a ${i}`
    if [ "$tmppe" -gt 400 ]; then
        echo "${i} 权限为$tmppe"
        check_fail
    elif [ "$tmppe" -le 400  ]; then
        echo "${i} 权限为$tmppe"
        check_pass
    else
        check_manual
    fi
done

for i in /etc/passwd /etc/group /etc/services /etc/profile
do
        tmppe=`stat -c %a ${i}`

        if [ "$tmppe" -gt 644 ]; then
                echo "${i} 权限为$tmppe" 
                check_fail
        elif [ "$tmppe" -le 644  ]; then
        echo "${i} 权限为$tmppe"
                check_pass
        else
                check_manual
        fi
done

tmppe=`stat -c %a /tmp`

if [ "$tmppe" -gt 750 ]; then
    echo "/tmp目录的权限为$tmppe"
    check_fail
elif [ "$tmppe" -le 750 ]; then
    check_pass
else
    check_manual
fi
echo $separator

echo "NO.9-检查日志服务状态"
service_status=`systemctl status rsyslog | grep Active | awk '{print $2}'`
if [ $service_status == "inactive" ]; then
    echo "日志rsyslog服务状态为:$service_status"
    check_fail
elif [ $service_status == "active" ]; then
    check_pass
else
    check_manual
fi
echo $separator

echo "NO.10-检查常见日志文件是否非任意用户读写,建议非同组用户不可写"
for f in /var/log/cron /var/log/secure /var/log/httpd /var/log/auth.log /var/log/btmp
do
    if [ -a ${f} ]; then
        log_per=`stat -c %a ${f}`
        if [ "$log_per" -ge 770 ]; then
            echo "${f} 的权限为$log_per"
            check_fail
        else
            echo "${f}的权限为$log_per"
            check_pass
        fi
    else
        echo "${f}文件不存在!"
        check_manual
    fi
done

echo $separator

echo "NO.11-检查FTP是否允许匿名登录"
ps_tmp=`ps -ef | grep ftp | grep -v grep`
if [ -z "$ps_tmp" ]; then
    echo "ftp服务未开启"
    check_pass
else
    an_login=`cat /etc/vsftpd/vsftpd.conf | grep "anonymous_enable=NO" | grep -v ^#`
    if [ -z "$an_login" ]; then
        check_fail
    else
        echo "匿名登录:$an_login"
        check_pass
    fi
fi
echo $separator

echo "NO.12-检查history命令显示的条数,建议设置5条"
echo "历史命令显示条数:`cat /etc/profile | grep "HISTSIZE" | awk -F "=" '{print $2}'`"
check_manual
echo $separator
echo " 共检测项:$((pass+fail+manual))"
echo -e "\033[32m 通过项:$pass \033[0m"
echo -e "\033[31m 失败项:$fail \033[0m"
echo -e "\033[33m 手动检查项:$manual \033[0m"
echo "已完成Linux安全基线检查"

在centos下对这个脚本进行测试

[root@localhost centos]# vim linux_base_security.sh

 给linux_base_security.sh提权

[root@localhost centos]# chmod +x linux_base_security.sh

执行该脚本

自动检查以下内容

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

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

相关文章

YOLOv8目标检测算法

YOLOv8目标检测算法相较于前几代YOLO系列算法具有如下的几点优势&#xff1a; 更友好的安装/运行方式速度更快、准确率更高新的backbone&#xff0c;将YOLOv5中的C3更换为C2FYOLO系列第一次尝试使用anchor-free新的损失函数 YOLOv8简介 YOLOv8 是 Ultralytics 公司继 YOLOv5…

【UniApp开发小程序】小程序首页(展示商品、商品搜索、商品分类搜索)【后端基于若依管理系统开发】

文章目录 界面效果界面实现工具js页面首页让文字只显示两行路由跳转传递对象将商品分为两列显示使用中划线划掉原价 后端商品controllerservicemappersql 界面效果 【说明】 界面中商品的图片来源于闲鱼&#xff0c;若侵权请联系删除关于商品分类页面的实现&#xff0c;请在我…

c++QT文件操作

1 介绍 QT的文件操作来源于其抽象基类QIODevice&#xff0c;中用于处理输入输出设备。提供了统一的接口来处理不同类型的数据源&#xff0c;如文件、套接字、缓冲区等。QIODevice 主要用于读取和写入数据&#xff0c;无论数据来自何种源头&#xff0c;都可以通过 QIODevice 统一…

vue.draggable浅尝

介绍 Vue.Draggable是一款基于Sortable.js实现的vue拖拽插件。支持移动设备、拖拽和选择文本、智能滚动&#xff0c;可以在不同列表间拖拽、不依赖jQuery为基础、vue 2过渡动画兼容、支持撤销操作&#xff0c;总之是一款非常优秀的vue拖拽组件。本篇将介绍如何搭建环境及简单的…

推荐工具!使终端便于 DevOps 和 Kubernetes 使用

如果你熟悉 DevOps 和 Kubernetes 的使用&#xff0c;就会知道命令行界面&#xff08;CLI&#xff09;对于管理任务有多么重要。好在现在市面上有一些工具可以让终端在这些环境中更容易使用。在本文中&#xff0c;我们将探讨可以让工作流程简化的优秀工具&#xff0c;帮助你在 …

「并发编程 」

一、 为什么会有线程安全问题 1&#xff09;程序和CPU间的协作关系 CPU组成 寄存器 存储了从内存加载的数据&#xff08;从内存中将数据加载到 L1&#xff0c;L2&#xff0c;L3 缓存&#xff0c;再到寄存器&#xff09; &#xff1b;寄存器的运行速度比内存快好多个级别&…

中小企业选择CRM系统需要有哪些功能?

对于中小企业来说&#xff0c;选择一个合适的CRM系统是非常重要的&#xff0c;一款好用的CRM可以帮助企业提高业务效率&#xff0c;获得更多收益。那么&#xff0c;中小企业CRM系统的主要特点有哪些呢&#xff1f;下面我们从四个方面来说说。 1、功能&#xff1a; 功能是指CR…

试岗第一天问题

1、公司的一个项目拉下来 &#xff0c;npm i 不管用显示 后面百度 使用了一个方法 虽然解决 但是在增加别的依赖不行&#xff0c;后面发现是node版本过高&#xff0c;更换node版本解决。 2、使用插件动态的使数字从0到100&#xff08;vue-animate-number插件&#xff09; 第一…

日常BUG——git提交代码报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 git 在提交代码时报错&#xff1a; Committing is not possible because you have unmerge…

QT 使用第三方库QtXlsx操作Excel表

1.简介 一直以来&#xff0c;都想学习一下C/C如何操作excel表&#xff0c;在网上调研了一下&#xff0c;觉得使用C/C去操作很麻烦&#xff0c;遂转向QT这边&#xff1b;QT有一个自带的类QAxObject&#xff0c;可以使用他去操作&#xff0c;但随着了解的深入&#xff0c;觉得他…

【力扣周赛】第 358 场周赛

文章目录 竞赛链接Q1&#xff1a;6939. 数组中的最大数对和竞赛时代码—— O ( n 2 ) O(n^2) O(n2)解法2——一次遍历 O ( n ) O(n) O(n)&#xff0c;维护最大数位为 i 的元素的最大值 Q2&#xff1a;6914. 翻倍以链表形式表示的数字竞赛时代码——存入列表再计算解法2——只有…

R语言生存分析算法的简单组合

library(survival) library(randomForestSRC)# 生成模拟数据 set.seed(123) n <- 200 time <- rexp(n, rate 0.1) status <- rbinom(n, size 1, prob 0.7) var1 <- rnorm(n) var2 <- rnorm(n) var3 <- rnorm(n) data1 <- data.frame(time time, statu…

PLL 的 verilog 实现

锁相环&#xff08;PLL&#xff09;是一种常用的频率、相位追踪算法&#xff0c;在信号解调、交流并网等领域有着广泛的应用。本文对全数字锁相环的原理进行介绍&#xff0c;随后给出 verilog 实现及仿真。 PLL 锁相原理 锁相环结构如下图所示&#xff0c;主要由鉴相器、环路滤…

UDP通信实验、广播与组播、本地套接字

文章目录 流程函数应用广播应用 组播&#xff08;多播&#xff09;本地套接字应用 流程 函数 返回值&#xff1a; 成功&#xff0c;返回成功发送的数据长度 失败&#xff0c;-1 返回值&#xff1a; 成功&#xff0c;返回成功接收数据长度 失败&#xff0c;-1 应用 广播 应用 …

【不限于联想Y9000P电脑关盖再打开时黑屏的解决办法】

不限于联想Y9000P电脑关盖再打开时黑屏的解决办法 问题的前言问题的出现问题拟解决 问题的前言 事情发生在昨天&#xff0c;更新了Win11系统后&#xff1a; 最惹人注目的三处地方就是&#xff1a; 1.可以查看时间的秒数了&#xff1b; 2.右键展示的内容变窄了&#xff1b; 3.按…

湖南科技学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

湖南科技学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

20230815在淘宝的代扫描服务【仅供参考】

20230815在淘宝的代扫描服务【仅供参考】 2023/8/15 12:35 https://item.taobao.com/item.htm?spma21n57.1.0.0.3d47523caCFZ3T&id601206116790&ns1&abbucket4#detail e邦生活服务 https://item.taobao.com/item.htm?_ufju3ku42b4&id629900806906 寄书扫描…

奥威BI数据可视化工具:报表就是平台,随时自助分析

别的数据可视化工具&#xff0c;报表就只是报表&#xff0c;而奥威BI数据可视化工具&#xff0c;一张报表就约等于一个平台&#xff0c;可随时展开多维动态自助分析&#xff0c;按需分析&#xff0c;立得数据信息。 奥威BI是一款多维立体分析数据的数据可视化工具。它可以帮助…

JavaFx基础学习【五】:FXML布局文件使用

目录 前言 一、介绍 二、简单体验 三、FXML标签元素 四、fx属性介绍 五、重写initialize&#xff08;名字需要保持一致&#xff09;方法 六、Scene Builder快速布局 前言 如果你还没有看过前面的文章&#xff0c;可以通过以下链接快速前往学习&#xff1a; JavaFx基础学…

Vscode 常用操作教程

一、语言换成中文 这是我们可以直接点击左边栏第四个图标搜索插件 chinese ,也可以直接ctrlshiftp快捷键也会出来如图所示图标&#xff0c;出来chinese 插件之后选择安装install,安装完成之后重新ctrlshiftp会出现如图所示页面 找到我的鼠标在的地方对应的中文&#xff0c;此时…