开源WAF--Safeline(雷池)测试手册

news2024/11/18 7:48:40

长亭科技—雷池(SafeLine)社区版

在这里插入图片描述

官方网站:长亭雷池 WAF 社区版 (chaitin.cn)

WAF 工作在应用层,对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果,使其免于受到黑客的攻击

在这里插入图片描述

1.1 雷池的搭建

1.1.1 配置需求
  • 操作系统:Linux

  • 指令架构:x86_64

    `查询命令:
    uname -m 
    
  • 软件依赖:Docker 20.10.14 版本以上

    `查询命令:
    docker --version 
    
  • 软件依赖:Docker Compose 2.0.0 版本以上

    `查询命令:
    docker-compose version
    
  • 最小化环境:1 核 CPU / 1 GB 内存 / 5 GB 磁盘

    `查询命令:
    cat /proc/cpuinfo        # 查看 CPU 信息
    cat /proc/meminfo        # 查看内存信息
    df -h                    # 查看磁盘信息
    
1.1.2 安装方式
  1. 在线安装

    bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
    

在这里插入图片描述

  1. 离线安装

    如果你的服务器无法连接互联网环境,或连接 Docker Hub 网络不稳,可以使用镜像包安装方式

    这里忽略 Docker 安装的过程

    首先,下载 雷池社区版镜像包 并传输到需要安装雷池的服务器上,执行以下命令加载镜像

    cat image.tar.gz | gzip -d | docker load
    

    执行以下命令创建并进入雷池安装目录

    mkdir -p safeline        # 创建 safeline 目录
    cd safeline              # 进入 safeline 目录
    

    下载 编排脚本 并传输到 safeline 目录中

    `编排脚本:
    networks:
      safeline-ce:
        name: safeline-ce # 定义该子网名称
        driver: bridge # 定义该子网为桥接模式
        ipam:
          driver: default
          config:
          - gateway: ${SUBNET_PREFIX:?SUBNET_PREFIX required}.1 #定义网关为SUBNET_PREFIX.1,若按上文设置,此处为172.22.222.1
         subnet: ${SUBNET_PREFIX}.0/24
        driver_opts:
       com.docker.network.bridge.name: safeline-ce
    
    services:
      postgres:
        container_name: safeline-postgres # 容器名称
        restart: always # #容器启动失败或崩溃时自动重启
        image: postgres:15.2 # 镜像名称
        volumes: #开启的映射文件夹
        - ${SAFELINE_DIR}/resources/postgres/data:/var/lib/postgresql/data
        - /etc/localtime:/etc/localtime:ro
        environment: #设置容器启动时的环境变量
        - POSTGRES_USER=safeline-ce
        - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?postgres password required}
        networks: # 容器网络
          safeline-ce:3
            ipv4_address: ${SUBNET_PREFIX}.2 
        cap_drop: # 去除容器中某些不需要的能力
        - net_raw
        command: [postgres, -c, max_connections=200] #设置 postgres 的最大连接数
      redis:
        container_name: safeline-redis
        restart: always
        image: redis:7.0.10
        volumes:
          - ${SAFELINE_DIR}/resources/redis/data:/data
          - /etc/localtime:/etc/localtime:ro
        command: redis-server --appendonly yes --requirepass  ${REDIS_PASSWORD}
        networks:
          safeline-ce:
            ipv4_address: ${SUBNET_PREFIX}.3
        cap_drop:
          - net_raw
        sysctls:
          net.core.somaxconn: "511" # 设置内核参数
      management:
        container_name: safeline-mgt-api
        restart: always
        image: chaitin/safeline-mgt-api:${IMAGE_TAG:?image tag required}
        volumes:
        - ${SAFELINE_DIR?safeline dir required}/resources/management:/resources/management
        - ${SAFELINE_DIR}/resources/nginx:/resources/nginx
        - ${SAFELINE_DIR}/logs:/logs
        - /etc/localtime:/etc/localtime:ro
        ports: # 将容器内部端口映射到宿主机上的端口
        - ${MGT_PORT:-9443}:1443 # 使用环境变量$MGT_PORT的值作为宿主机的端口,如果`MGT_PORT`未设置或为空,则默认使用9443
        environment:
        - MANAGEMENT_RESOURCES_DIR=/resources/management
        - NGINX_RESOURCES_DIR=/resources/nginx
        - DATABASE_URL=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline-postgres/safeline-ce
        - MARIO_URL=http://safeline-mario:3335
        - DETECTOR_URL=http://safeline-detector:8001
        - REDIS_URL=redis://:${REDIS_PASSWORD}@safeline-redis:6379/0
        - MANAGEMENT_LOGS_DIR=/logs/management
        dns:   # 设置DNS地址
          - 119.29.29.29
          - 223.5.5.5
          - 180.76.76.76
          - 1.2.4.8
          - 114.114.114.114
          - 8.8.8.8
        networks:
          safeline-ce:
            ipv4_address: ${SUBNET_PREFIX}.4
        cap_drop:
        - net_raw
      detector:
        container_name: safeline-detector
        restart: always
        image: chaitin/safeline-detector:${IMAGE_TAG}
        volumes:
        - ${SAFELINE_DIR}/resources/detector:/resources/detector
        - ${SAFELINE_DIR}/logs/detector:/logs/detector
        - /etc/localtime:/etc/localtime:ro
        environment:
        - LOG_DIR=/logs/detector
        networks:
          safeline-ce:
            ipv4_address: ${SUBNET_PREFIX}.5
        cap_drop:
        - net_raw
      mario:
        container_name: safeline-mario
        restart: always
        image: chaitin/safeline-mario:${IMAGE_TAG}
        volumes:
        - ${SAFELINE_DIR}/resources/mario:/resources/mario
        - ${SAFELINE_DIR}/logs/mario:/logs/mario
        - /etc/localtime:/etc/localtime:ro
        environment:
        - LOG_DIR=/logs/mario
        - GOGC=100
        - DATABASE_URL=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline-postgres/safeline-ce
        - REDIS_URL=redis://:${REDIS_PASSWORD}@safeline-redis:6379/0
        networks:
          safeline-ce:
            ipv4_address: ${SUBNET_PREFIX}.6
        cap_drop:
        - net_raw
      tengine:
        container_name: safeline-tengine
        restart: always
        image: chaitin/safeline-tengine:${IMAGE_TAG}
        volumes:
        - ${SAFELINE_DIR}/resources/nginx:/etc/nginx
        - ${SAFELINE_DIR}/resources/management:/resources/management
        - ${SAFELINE_DIR}/resources/detector:/resources/detector
        - ${SAFELINE_DIR}/logs/nginx:/var/log/nginx
        - /etc/localtime:/etc/localtime:ro
        - ${SAFELINE_DIR}/resources/cache:/usr/local/nginx/cache
        - /etc/resolv.conf:/etc/resolv.conf
        environment:
        - REDIS_URL=redis://:${REDIS_PASSWORD}@${SUBNET_PREFIX}.3:6379/0 
        - MGT_ADDR=${SUBNET_PREFIX}.4:9002 #配置 mgt-api 的 grpc 服务器地址,用于与 mgt-api 容器通信
        ulimits:
          nofile: 131072
        network_mode: host #Tengine 直接使用宿主机网络   ```
    
    
    
    执行以下命令,生成雷池运行所需的相关环境变量
    
    ```shell
    echo "SAFELINE_DIR=$(pwd)" >> .env  # 设置当前路径为雷池社区版本的根路径
    echo "IMAGE_TAG=latest" >> .env # 设置镜像的tag
    echo "MGT_PORT=9443" >> .env # 管理容器服务使用的端口
    echo "POSTGRES_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c 32)" >> .env 
    # /dev/urandom是一个很长的随机数文本,tr -dc命令用于删除非字母,非数字的字符,用于生成随机的postgres密码
    echo "REDIS_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c 32)" >> .env
    # 同上,用于生成随机的reis密码
    echo "SUBNET_PREFIX=172.22.222" >> .env
    # 定义docker 虚拟网卡的子网前缀
    

    执行以下命令启动雷池

    docker compose up -d 
    
1.1.3 雷池结构和启动配置

1.容器介绍

名称定义详情
safeline-mgt-api管理容器接收管理后台行为,向其他服务或容器推送消息
safeline-detector检测容器执行检测的容器,从 Tengine 进入的流量会转发到该节点检测
safeline-mario日志容器记录与统计恶意行为的节点
safeline-tengine网关转发网关,有简单的过滤功能
safeline-postgres关系型数据库存储攻击日志、保护站点、黑白名单配置的数据库
safeline-redis缓存数据库-

2.容器间的通信如下

在这里插入图片描述

对于后台管理人员(admin),可以与safeline-mgt-api直接通信,从而管理服务.该节点负责

  1. 向Tengine网关容器推送自定义配置并利用Nginx命令进行热部署
  2. 自定义检测规则(黑名单等)并向检测引擎safeline-detector推送
  3. 直接读取postgres数据库,向后台管理员返回日志,统计和当前配置等

safeline-detector引擎会将safeline-mgt-api节点中定好的规则进行接收

对于用户(User),访问目标域名(解析到waf的IP和端口上,反向代理到服务器),请求会达到safeline-tengine中进行简单的过滤,然后将请求转到safeline-detector上进行日志检测,查看是否符合条件.如果通过限制,就会将请求转到后端服务器上,然后接收响应返回给用户.如果不符合条件,就会将日志输送给safeline-mario,记录与统计恶意行为的节点

在这里插入图片描述

1.2 雷池的使用

1.2.1 雷池的登录

在这里插入图片描述

​ 浏览器打开后台管理页面 https://<waf-ip>:9443。根据界面提示,使用 支持 TOTP 的认证软件或者小程序 扫描二维码,然后输入动态口令登录:

在这里插入图片描述

在这里插入图片描述

1.2.2 雷池配置的两种方式
1.在单独设备上部署雷池

提供一台独立设备部署雷池

  1. 将网站所有流量指向雷池.例如将域名解析到雷池
  2. 禁止网站服务器上,除了雷池之外的访问,例如配置防火墙或者将网站服务器放置内网

在这里插入图片描述

`实验环境:
192.168.65.8  --- www.waf.ct
192.168.65.4  --- www.server.ct

在这里插入图片描述

`编辑雷池端Nginx配置文件
upstream backend_monitor_servers {
    server  192.168.65.4:80;
}
server{
    listen 81;
    server_name www.waf.ct;
    location / {
        limit_req zone=five burst=10;
        proxy_pass http://backend_monitor_servers ;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host    $host;
        proxy_set_header Host $host;
        add_header Strict-Transport-Security "max-age=31536000";
   }
   access_log /data/log/nginx/access.log;
   error_log /data/log/nginx/error.log;
}

在这里插入图片描述

攻击测试:
curl -v "http://www.waf.ct?id=1'union select * from dps"

在这里插入图片描述

在这里插入图片描述

如果是有域名且具备SSL证书的情况下

在这里插入图片描述

2.直接在网站服务器上部署雷池

不推荐这样部署,这样部署单机负载更高,设备宕机概率更大.非纯净环境下还会提高安装失败的概率,故障排查比较困难

如果能接受这些风险,雷池也可以直接部署在网站服务器上。你需要:

  1. 将原本监听 80 或 443/ssl 端口的网站服务改到其他端口,让雷池监听设备的 80 或 443/ssl 端口
  2. 使网站服务仅允许本机访问。例如配置系统防火墙、Iptables

在这里插入图片描述

例如:

`1.网站登录服务监听端口为8080

在这里插入图片描述

`2.修改Waf监听端口
# 其中端口为Waf开启的端口,默认为80和443
# 上游服务器为要守护的域名

在这里插入图片描述

`测试:
在客户端执行命令:curl -H "Host: <域名>" http://<雷池 IP>:<雷池监听端口> 
root@WAF:~# curl -H "HOST:192.168.65.8" http://192.168.65.8:80 
# 若能获取到业务网站的响应,并且站点上 “今日访问量” 增加,则代表配置成功

在这里插入图片描述

3.和其他反向代理设备一起部署

​ 雷池作为反代设备,可以在任意位置接入主链路。只要将接入位置的流量指向雷池,并在雷池的 “上游服务器” 处填写请求的下一跳服务器地址即可。例如:

在这里插入图片描述

4.配置后网站无法访问

如果按照上文指引部署雷池、配置了站点,但网站仍无法访问,建议按照以下步骤排查:

  1. 明确 “网站无法访问” 的具体表现:

    • 如果 502 Bad Gateway tengine

      在这里插入图片描述

      大概率是是雷池的上游服务器配置不正确,或者雷池无法访问到上游服务器。请继续按下面步骤排查,重点排查步骤 6、7

    • 如果请求能够返回但是十分缓慢

      • 首先确认服务器负载是否正常

      • 在客户端执行命令,检查雷池服务器与上游服务器的网络:

        curl -H "Host: <SafeLine-IP>" -vv -o /dev/null -s -w 'time_namelookup: %{time_namelookup}\ntime_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n' http://<上游服务器地址>
        
        • 如果 time_namelookup 时间过大,请检查 dns server 配置
        • 如果 time_connect 时间过大,请检查雷池与上游服务器之间的网络状态
        • 如果 time_starttransfer 时间过大,请检查上游服务器状态,是否出现资源过载情况
    • 如果不是以上情况,继续下一步

  2. 在客户端执行 curl -H "Host: <域名>" http://<雷池 IP>:<雷池监听端口> 。正常情况下,应能获取到业务网站的响应,并且站点的 “今日访问量” +1

    • 如果浏览器无法访问,但这一步正常获取到响应,大概率是因为:
      • 测试过程中,网站域名还没有切到雷池,浏览器测试时访问的是 http(s)://<雷池 IP>,恰好业务服务上有 Host 验证,所以拒绝了该请求。这种情况需要修改本机 host,把域名解析到雷池 IP,再访问 http(s)://<域名>,才能准确测试
      • 网站业务做了其他一些特殊处理。例如访问后 301 跳转到了其他地址,需要具体排查网站业务的响应内容
    • 如果不能获取到响应,继续下一步
  3. 在雷池设备上执行 curl -H "Host: <域名>" http://<雷池 IP>:<雷池监听端口>。正常情况下,应能获取到业务网站的响应,并且站点上 “今日访问量” +1

    • 如果步骤 2 失败而这里成功,说明客户端到雷池之间的网络存在问题。请排查网络,保证客户端可访问到雷池
    • 如果不能获取到响应,继续下一步
  4. 在雷池设备上执行 curl -H "Host: <域名>" http://127.0.0.1:<雷池监听端口>。正常情况下,应能获取到业务网站的响应,并且站点的 “今日访问量” +1

    • 如果步骤 3 失败而这里成功,且 telnet <雷池 IP> <雷池监听端口> 返回 Unable to connect to remote host: Connection refused,大概率是被雷池设备上的防火墙拦截了。可能是操作系统本身的防火墙,还有可能是云服务商的防火墙。请根据实际情况逐项排查,开放雷池监听端口的访问
    • 如果不能获取到响应,继续下一步
  5. 在雷池设备上执行 netstat -anp | grep <雷池监听端口> 确认端口监听情况。正常情况下,应该有一个 nginx 进程监听在 0.0.0.0:<雷池监听端口>。没有的话请通过社群或者 Github issue 提交反馈,附上排查过程。有的话继续下一步

  6. 在雷池设备上 curl -H "Host: <域名>" <上游服务器地址>。正常情况下,应能获取到业务网站的响应

    • 如果步骤 4 失败而这里成功,请通过社群或者 Github issue 提交反馈,附上排查过程
    • 如果这步失败,说明雷池和上游服务器之间的网络存在问题。请排查网络,确保雷池可以访问到上游服务器

1.3 雷池的防护规则

# 最强的防护会将Request和Urlib等请求判定为扫描器会进行拦截

在这里插入图片描述

在这里插入图片描述

``这是用Python的threading模块进行cc攻击测试就会将IP进行直接封禁

1.4 配置黑名单

在这里插入图片描述

黑名单可以根据 源IP路径HostHeaderBody 五种匹配目标进行匹配,以下是每种匹配目标的匹配方式

在这里插入图片描述

`1.配置黑名单为Header 正则匹配
curl -A "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36" www.waf.ct

在这里插入图片描述

在这里插入图片描述

1.n 可能会用到的配置

1.n.1 进入某一容器
docker exec -it <container_name> /bin/bash
1.n.2 生成的Nginx配置
`Nginx配置生成的文件在:
docker exec -it safeline-tengine /bin/bash
/etc/nginx/sites-enabled/IF-backend*   #每配置一个保护站点就会生成一个这样的文件
/etc/nginx/sites-enabled/generated    #心跳,健康检查配置
/root/nginx/nginx.conf   #与上述两个文件共同构成了 Tengine 的配置

`Nginx的配置文件在:
/etc/nginx
`Nginx的日志文件默认生成在/var/log/nginx ,且默认不生成access.log日志
1.n.3 查看mgt-api的日志
docker exec -it safeline-mgt-api /bin/bash
#进入容器后
cat /logs/management/nginx.log
cat /logs/management/webserver.log
# 直接docker命令访问mgt日志
docker logs -f safeline-mgt-api
1.n.4 分析safeline下面的日志文件
root@WAF:/data# cd safeline/
root@WAF:/data/safeline# tree logs
logs
├── detector
│   └── snserver.log #检测容器的输出日志 
├── management
│   ├── nginx.log # Tengine 容器中 nginx 日志输出
│   └── webserver.log # safeline-mgt-api 容器的日志输出
├── mario
│   └── mario.log # 流量日志输出
└── nginx
    ├── access.log # nginx 的访问日志
    ├── error.log # nginx 的错误日志
    └── tcd.log # tcd 是 Tengine 用于与 safeline-mgt-api 通信的网络代理进程,该文件存储了两者的通信日志

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

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

相关文章

【框架源码篇 03】Spring源码手写篇-手写AOP

Spring源码手写篇-手写AOP 手写IoC和DI后已经实现的类图结构。 一、AOP分析 1.AOP是什么? AOP[Aspect Oriented Programming] 面向切面编程&#xff0c;在不改变类的代码的情况下&#xff0c;对类方法进行功能的增强。 2.我们要做什么&#xff1f; 我们需要在前面手写IoC&…

[Spring] SpringBoot2 简介(一)—— 基础配置

目录 一、SpringBoot 简介 1、Spring 的缺点 2、SpringBoot 功能 二、SpringBoot 入门案例 1、实现步骤 2、访问服务器 3、入门小结 4、Idea 快速构建 SpringBoot 工程 5、起步依赖无需版本号 6、主启动类的在项目中的位置&#xff08;*重要*&#xff09; 三、Sprin…

[AUTOSAR][诊断管理][$10] 会话模式控制

文章目录 一、简介二、指令格式请求: 10 SF会话参数记录有P2Server_max(2byte)和P2*Server_max(2byte),高位在前的表示方式。否定相应:7F SID NRC(否定相应码)三、示例代码(1) uds10_session_ctl.c一、简介 $10服务是Diagnostic Session Control诊断会话控制,子功能有01…

机器学习 | Python决策树算法

基本原理 决策树的基本原理是将数据分成不同的子集,使每个子集尽可能纯净。 这意味着子集中的数据属于同一类别或具有相似的属性。 为了做到这一点,决策树会选择一个特征,并根据该特征将数据分成两个子集。 它会选择那个特征,该特征在划分后的子集中具有最好的纯度,通…

Python获取微信公众号文章数据

这是一个通过 Python mitmproxy 库 实现获取某个微信公众号下全部文章数据的解决方案。首先需要创建一个 Python 虚拟环境&#xff0c;并进入虚拟环境下&#xff1a; $ python -m venv venv $ venv/Scripts/activate我们需要使用 mitmproxy 库 来建立一个网络代理&#xff0c;…

设计模式篇---组合模式

文章目录 概念结构实例总结 概念 组合模式&#xff1a;组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。 当我们开发中遇到树形结构的业务时&#xff0c;可以考虑使用组合模式。&#xff08;我也没有想明白为啥…

基于springboot实现财务管理系统项目【项目源码+论文说明】

基于springboot实现财务管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#x…

Ubuntu的EFI分区无法删除

本文解决的问题&#xff1a;双系统装完后需要删除ubuntu的分区&#xff0c;但是EFI系统分区无法删除。 第一步&#xff1a;cmd中输入命令 diskpart 并回车&#xff0c;如图中①&#xff1b; 第二步&#xff1a;在弹出窗口②中依次输入如下命令即可删除EFI分区&#xff1b; /…

基于springboot实现藏区特产销售平台项目【项目源码+论文说明】

基于springboot实现藏区特产销售管理平台演示 摘要 “互联网”的战略实施后&#xff0c;很多行业的信息化水平都有了很大的提升。但是目前很多藏区特产销售信息仍是通过人工管理的方式进行&#xff0c;需要在各个岗位投入大量的人力进行很多重复性工作&#xff0c;使得对人力物…

USRP-2944 配件讲解,如何选择对应的配件

USRP-2944 产品图片 产品官网价格信息 查看附件和价格 硬件服务 NI硬件服务计划通过简化物流&#xff0c;延长正常运行时间以及根据业界标准维护数据的可追溯性&#xff0c;帮助您节省系统组装、设置和维护所需的时间和金钱。这些计划涵盖多年期维修服务&#xff0c;同时还提…

Python 循环

Python有两个基本的循环命令&#xff1a; while循环for循环 while循环 使用while循环&#xff0c;我们可以在条件为真的情况下执行一组语句。 示例&#xff0c;打印i&#xff0c;只要i小于6&#xff1a; i 1 while i < 6:print(i)i 1注意&#xff1a;记得增加i的值&a…

微机原理:汇编语言语句类型与格式

文章目录 壹、语句类型1、语句分类2、常用伪代码和运算符2.1数据定义伪指令2.1.1字节定义伪指令DB&#xff08;8位&#xff09;2.1.2字定义伪指令DW&#xff08;16位&#xff09;2.1.3双字节伪指令DD2.1.4 多字节定义DF/DQ/DT&#xff08;了解&#xff09; 2.2 常用运算符2.2.1…

数据结构-- 并查集

0. 引入 并查集是来解决等价问题的数据结构。 离散数学中的二元关系。 等价关系需满足自反性、对称性、传递性。 a ∈ S , a R a a R b & b R a a R b ∩ b R c > a R c a \in S, aRa \\ aRb \& bRa \\ aRb \cap bRc >aRc a∈S,aRaaRb&bRaaRb∩bRc>a…

【MATLAB源码-第53期】m代码基于粒子群算法(PSO)的三维路径规划,显示最优路径和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述&#xff1a; 基本思想&#xff1a; 鸟群在寻找食物时&#xff0c;每只鸟都会…

拦截器以及统一功能的实现

目录 引言 实现一个简单的拦截器 拦截器小结 统一访问前缀 统一异常处理 统一返回参数 ControllerAdvice 引言 HandlerInterceptor是Spring MVC框架提供的一个拦截器接口&#xff0c;它用于对请求进行拦截和处理。在Spring MVC中&#xff0c;拦截器可以用于实现一些通用的功能…

什么是t检验?

t检验&#xff08;t-test&#xff09;是一种统计方法&#xff0c;用于比较两组数据之间的平均值是否存在显著差异。它通常用于分析两组样本的平均值是否具有统计学上的显著性差异。t检验基于正态分布的假设&#xff0c;它计算两组数据之间的t值&#xff0c;然后通过与t分布表进…

YOLO目标检测——人脸口罩佩戴数据集【(含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;公共场所监控场景下的大密度人群检测是否佩戴口罩&#xff0c;以及戴口罩的人证比对&#xff08;安检刷脸不用摘口罩&#xff09;、手机解锁、刷脸考勤等身份认证场景。数据集说明&#xff1a;人脸口罩佩戴检测数据集&#xff0c;真实场景的高质量图片…

reactnative 底部tab页面@react-navigation/bottom-tabs

使用react-navigation/native做的页面导航和tab‘ 官网&#xff1a;https://reactnavigation.org/docs/getting-started 效果图 安装 npm install react-navigation/nativenpm install react-navigation/bottom-tabs封装tabbar.js import { View, StyleSheet, Image } from …

【JavaEE】死锁问题 -- 多线程篇(5)

死锁问题 1. 死锁是什么?2. 如何避免死锁? 1. 死锁是什么? 概念 死锁是这样一种情形: 多个线程同时被阻塞, 它们中的一个或者全部都在等待某个资源被释放, 由于线程被无限期的阻塞, 因此程序不能正常终止。 死锁的三种常见的场景 一个线程, 一把锁, 但是是不可重入锁, 该线程…

新手上路:学会使用SELinux保护你的系统

1 Selinux的介绍 SELinux是为了提高系统安全性的机制。 它对系统的每一个程序、文件都引入了安全上下文。安全上下文标签&#xff0c;用于唯一标识文件、进程和资源。这些标签包括了安全策略的信息&#xff0c;允许SELinux强制执行策略。 1.1 Selinux关闭状态下 getenforce …