记一次网关项目Actuator未授权访问漏洞的修复方案

2023-10-27

前言

公司项目在做等保测评的时候发现网关项目存在Actuator未授权访问漏洞,在 Actuator 启用的情况下,如果没有做好相关权限控制,非法用户可通过访问默认的执行器端点(endpoints)来获取应用系统中的监控信息,从而导致信息泄露甚至服务器被接管的事件发生。默认配置会出现接口未授权访问,部分接口会泄露网站流量信息和内存信息等,使用Jolokia库特性甚至可以远程执行任意代码,获取服务器权限。

漏洞效果

直接通过访问接口 http://服务器ip:程序端口/actuator/env,就返回了服务器的一些重要信息。
在这里插入图片描述

漏洞解决

1. 网上解决方案

网上解决方案大概就两种:
① 直接为了等保测评将Actuator监控直接关掉,等测评通过后再打开。

management:
  endpoints:
    enabled: false

这个就完全是为了应付等保测评了,方案不可取
②引入security

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

开启Security,配置访问权限

spring:
  security:
    user:
      username: security账号
      password: security密码

management:
  security:
    enabled: true

再次访问 http://服务器ip:程序端口/actuator/env
在这里插入图片描述
发现需要登录了,这个方案在一般的项目都是可取的,也能起到权限拦截的作用,但是由于我们这个是网关项目,项目内的接口都是对外暴露的,项目内有自己的一套安全认证机制,包括权限认证,接口转发,统一响应等等,如果引入security,项目启动之后,外部访问项目接口都会最先走security的认证机制,就不会走网关项目认证机制,直接返404或其他错误,所以这种方案对于网关项目是不可取的。

2. 我的解决方案

由于security的安全方案不可取,干脆我自己弄一个权限认证机制,对于访问路径是以/actuator开头的,统统需要账号密码进行权限认证:



import cn.hutool.core.collection.CollectionUtil;
import com.sztech.gateway.plugin.api.result.GatewayResultWarp;
import com.sztech.gateway.plugin.api.util.WebFluxResultUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
import sun.misc.BASE64Decoder;

import java.util.List;

/**
 * 用于处理Actuator未授权访问漏洞的过滤器
 *
 * @author wenchao
 */
@Component
@Slf4j
public class ActuatorFilter implements WebFilter {

    @Value("${com.sztech.prometheus.username}")
    public String userName;

    @Value("${com.sztech.prometheus.password}")
    public String password;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        log.info("into ActuatorFilter ...");
        ServerHttpRequest request = exchange.getRequest();
        String url = request.getPath().toString();
        log.info("url:  {}", url);
        //只拦截actuator相关的接口 如果项目接口有前缀需自行添加进行判断
        if (url.startsWith("/actuator")){
            List<String> authList = request.getHeaders().get("Authorization");
            if (CollectionUtil.isEmpty(authList)){
                Object error = GatewayResultWarp.error("401", "未授权", null);
                return WebFluxResultUtils.result(exchange, error);
            }
            String auth = authList.get(0);
            if (StringUtils.isBlank(auth)){
                Object error = GatewayResultWarp.error("401", "未授权", null);
                return WebFluxResultUtils.result(exchange, error);
            }
            auth = getFromBASE64(auth.substring(6));
            log.info("auth: {}", auth);
            try {
                String[] authArray = auth.split(":");
                if (authArray[0].equals(userName) && authArray[1].equals(password)){
                    return chain.filter(exchange);
                }else {
                    Object error = GatewayResultWarp.error("401", "认证失败", null);
                    return WebFluxResultUtils.result(exchange, error);
                }
            }catch (Exception e){
                e.printStackTrace();
                Object error = GatewayResultWarp.error("401", "认证失败", null);
                return WebFluxResultUtils.result(exchange, error);
            }
        }
        return chain.filter(exchange);
    }


    private String getFromBASE64(String s) {
        if (s == null) {
            return null;
        }
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            byte[] b = decoder.decodeBuffer(s);
            return new String(b);
        } catch (Exception e) {
            return null;
        }
    }


}

配置文件同步配置一下账号密码:

com:
  sztech:
    prometheus:
      username: 账号
      password: 密码

重启项目之后重新访问接口

在这里插入图片描述
由于我们项目是借助于prometheus对actuator监控信息进行收集和展示,所以prometheus的配置文件也需要修改一下,将账号密码配置一下,再重启prometheus即可。

 basic_auth:
   username: 账号
   password: 密码

下面看一下监控效果
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一次网关项目Actuator未授权访问漏洞的修复方案 的相关文章

随机推荐

  • Feign远程调用丢失请求头问题

    在业务中 需要使用A B两个模块 这些模块使用了SpringSession共享Session数据 在B模块中的业务需要用户登录后才能操作 当A调用B的业务时 在B模块中获取不到用户的Session信息 导致B模块判定该请求用户没有登录导致A
  • java基础错题总结

    1 解析 首先乘法的优先级高于加法 所以先进行y z 然后在这里 是连接符 因为头一个是字符串所以系统就认为是连接符 就成 10202 0 输出这个字符串 但如果第一个不是字符串类型的 就像 10 20 a 这个会输出 30 a 2 解析
  • gis中的加权求和工具在哪里_因果推理初探(5)——干预工具(上)

    本节将延续上一节学习的干预的有关概念 开始深入介绍几种干预的工具 后门调整 前门调整 逆概率加权等 本节将有大量公式来袭 请准备草稿纸或提前绕道 在上一节最后 我们推导出有关干预的重要公式 调整公式 它的形式如下 这个公式让我们可以通过观测
  • 为什么使用代理后不能上网了?

    在使用完代理服务器之后 有的用户可能会遇到这样的问题 明明网络正常 为什么我的浏览器不能打开网页了 今天就给大家说下具体解决方法 这里我们以IE浏览器为例 1 先打开浏览器 点击右上角的 工具 图标 然后点击下拉中的 Internet选项
  • elasticsearch中文分词器插件elasticsearch-analysis-ik远程自定义词典热更新

    IK简介 IK分词器基于词库进行分词 analysis ik内置了一些词典 主词典main dic 姓氏词典surname dic 量词词典quantifier dic 后缀词典suffix dic 介词词典preposition dic
  • vue项目创建

    默认3 默认2 自定义配置 js语法编辑器 ts 渐进式web应用程序 路由 状态管理器 css处理器 代码检查 单元测试 端对端测试 选择版本 路由是否选择历史模式 选择css预处理器 配置放在哪里 保存这个项目作为一个模版使用 npm
  • 【网络】Linux网络问题汇总(一)

    网卡设置了静态获取 仍然获取动态IP的解决方法 问题展示 网卡配置静态方式获取 仍然通过dhcp获取到了ip 且每次分配的ip都一样 root senlian cat etc sysconfig network scripts ifcfg
  • OAUTH之 钉钉第三方授权登录

    文章目录 OAUTH之钉钉第三方授权登录 前期用到的工具 获取access token 请求地址 请求方法 响应 扫码 使用账号密码 获取 临时 code 参数重要说明 直接访问 扫码登录 使用账号密码登录第三方网站 根据 sns 临时授权
  • 性能测试度量指标

    1 响应时间 响应时间指从用户或事务在客户端发起一个请求开始 到客户端接收到从服务器端返回的响应结束 这整个过程所消耗的时间 在性能测试实践中 为了使响应时间更具代表性 响应时间通常是指事务的平均响应时间ART 在实践中要注意 不同行业 不
  • node+koa2+mongodb搭建RESTful API风格后台

    RESTful API风格 在开发之前先回顾一下 RESTful API 是什么 RESTful 是一种 API 设计风格 并不是一种强制规范和标准 它的特点在于请求和响应都简洁清晰 可读性强 不管 API 属于哪种风格 只要能够满足需要
  • Unity之URP开启PostProcessing后使用RenderTexture渲染模型背景为不透明

    项目需要在UI界面显示角色模型 使用一个模型相机投射到RT上然后放在Raw Image上 现在这个模型相机需要开启后处理Post Processing 只针对模型添加了后处理效果 问题是开启后 Raw Image背景变了 把UI背景图遮住了
  • TensorFlow找不到cudart64_110.dll not found的解决方案

    问题描述 当我写了两句小程序准备开启我的TensorFlow之路时候 import tensorflow as tf hello tf constant hello tensorflow print Hello python sess tf
  • 安防监控视频云存储平台EasyNVR对接EasyNVS时,一直不上线该如何解决?

    视频安防监控平台EasyNVR可支持设备通过RTSP Onvif协议接入 并能对接入的视频流进行处理与多端分发 包括RTSP RTMP HTTP FLV WS FLV HLS WebRTC等多种格式 近期有用户在使用安防视频平台EasyNV
  • STLvector源码——实现框架、具体实现的详细分段剖析(重点是insert_aux在指定位置插入元素和在指定位置插入n个元素的源码)、vector实现的基本函数总结

    VS2010的源码真的让人放弃 还是安安稳稳看侯捷老师的SGI 源码 SGI vector 实现框架 include
  • Vue语言基础——ECMAScript 6.0

    ECMAScript 1ES6基础 1 1ES6简介 1 2let命令 1 3const命令 2 变量的结构赋值 2 1数组的解构赋值 2 2对象的解构赋值 2 3解构赋值的主要用途 3 箭头函数 3 1箭头函数的定义 3 2箭头函数与解构
  • Feign的使用及原理剖析

    feign使用及原理剖析 一 简介 Feign是一个http请求调用的轻量级框架 可以以Java接口注解的方式调用Http请求 Feign通过处理注解 将请求模板化 当实际调用的时候 传入参数 根据参数再应用到请求上 进而转化成真正的请求
  • MAC下配置PHPMyAdmin

    最近需要用到MySQL 用到了客户端的管理工具 PHPMyAdmin 一 配置Apache 在 Mac OS中PHP apache 环境是自带的 不需要单独下载安装包 只需要简单配置一下即可 首先打开终端输入命令 sudo vim etc
  • 使用Mac终端给文件夹加密压缩

    首先进入文件目录cd Desktop 否则的话 压缩出来的文件会包含长长的文件路径 就像下面这样 zip er zip file name file name zip file name 是即将要生成的zip包的名字 当前路径下是不存在的
  • ubuntu16.04配置以太坊环境

    没有guo审 放了图片 我尽力了 希望大家都能够不走弯路
  • 记一次网关项目Actuator未授权访问漏洞的修复方案

    前言 公司项目在做等保测评的时候发现网关项目存在Actuator未授权访问漏洞 在 Actuator 启用的情况下 如果没有做好相关权限控制 非法用户可通过访问默认的执行器端点 endpoints 来获取应用系统中的监控信息 从而导致信息泄