我的编程空间,编程开发者的网络收藏夹
学习永远不晚

修复SpringBoot Actuator未授权访问遇到的问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

修复SpringBoot Actuator未授权访问遇到的问题

原由:风险检测扫出漏洞

访问http://xxx.xx.x/actuator 会直接获取到系统监控信息,存在安全问题,禁用actuator

1.禁用/env接口

缺点:谁都不可以访问不够灵活

会展示部分信息,漏扫严格的话建议替换其他方法

management:  endpoint:    env:      enabled: false

2.直接屏蔽所有端口

缺点:谁都不可以访问不够灵活

management:  endpoints:    web:      exposure:        include: "*"    enabled-by-default: false

3.引入spring-boot-starter-security依赖,增加登录认证

    org.springframework.boot    spring-boot-starter-security

配置文件增加

spring:  security:    user:      name: admin      password: adminmanagement:  server:    port: 8099  endpoints:    web:      exposure:        include: "*"

 4.添加全局过滤拦截类,增加登录认证

在项目目录新建config文件夹,新建下面两个文件

1. ActuatorFilter

import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.Base64;import java.util.Enumeration;public class ActuatorFilter implements Filter {    public static final Logger logger = LoggerFactory.getLogger(ActuatorFilter.class);    public static final String ACTUATOR_SESSION = "ActuatorBasicAuthSession";    private String userName;    private String password;    @Override    public void init(FilterConfig filterConfig) throws ServletException {        Enumeration enumeration = filterConfig.getInitParameterNames();        if (enumeration.hasMoreElements()) {            this.userName = filterConfig.getInitParameter("actuatorUserName");            this.password = filterConfig.getInitParameter("actuatorPassword");        }        logger.info("ActuatorFilter init success");    }    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        HttpServletRequest request = (HttpServletRequest) servletRequest;        HttpServletResponse response = (HttpServletResponse) servletResponse;        String path = request.getRequestURI();        //可以把所有暴露出来的端点路径放在一个集合里面进行判断        if (path.startsWith("/actuator")) {            Object actuatorSessionValue = request.getSession().getAttribute(ACTUATOR_SESSION);            if (actuatorSessionValue == null || !userName.equals(actuatorSessionValue)) {                String auth = request.getHeader("Authorization");                if (auth != null && !"".equals(auth)) {                    //解析认证参数                    String userAndPass = this.decodeBase64(auth.substring(6));                    String[] upArr = userAndPass.split(":");                    if (upArr.length != 2) {                        this.writeForbiddenCode(response);                        return;                    }                    String iptUser = upArr[0];                    String iptPass = upArr[1];                    if (iptUser.equals(this.userName) && iptPass.equals(this.password)) {                        request.getSession().setAttribute(ACTUATOR_SESSION, this.userName);                        filterChain.doFilter(request, response);                        return;                    }                    this.writeForbiddenCode(response);                    return;                } else {                    this.writeForbiddenCode(response);                    return;                }            }        }        filterChain.doFilter(request, response);    }        private void writeForbiddenCode(HttpServletResponse httpServletResponse) throws IOException {        httpServletResponse.setStatus(401);        httpServletResponse.setHeader("WWW-Authenticate", "Basic realm=\"input Actuator Basic userName & password \"");        httpServletResponse.getWriter().write("没有权限访问当前资源");    }    private String decodeBase64(String source) {        String decodeStr = null;        if (source != null) {            try {                byte[] bytes = Base64.getDecoder().decode(source);                decodeStr = new String(bytes);            } catch (Exception var4) {                this.logger.error(var4.getMessage(), var4);            }        }        return decodeStr;    }}

2. WebMvcConfig

import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class WebMvcConfig implements WebMvcConfigurer {    @Bean    public FilterRegistrationBean actuatorFilter () {        FilterRegistrationBean registrationBean = new FilterRegistrationBean();        registrationBean.setFilter(new ActuatorFilter());        registrationBean.setName("actuator");        registrationBean.addUrlPatterns("/*");        registrationBean.setOrder(Integer.MAX_VALUE);        //用户名密码可以配置在配置文件中或者配置中心        registrationBean.addInitParameter("actuatorUserName", "admin");        registrationBean.addInitParameter("actuatorPassword", "123456");        return  registrationBean;    }}

配置文件增加

management:  endpoints:    web:      exposure:        include: "*"  endpoint:    health:      show-details: always
  1. never:不展示详细信息,up或者down的状态,默认配置
  2. when-authorized:详细信息将会展示给通过认证的用户。授权的角色可以通过management.endpoint.health.roles配置
  3. always:对所有用户暴露详细信息

建议用方法3增加security的认证

来源地址:https://blog.csdn.net/weixin_45393972/article/details/129860984

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

修复SpringBoot Actuator未授权访问遇到的问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Nacos未授权访问修复方案

1. 漏洞简介 Nacos 是 SpringCloud Alibaba 微服务架构中的一个组件,主要作用是服务注册和发现以及分布式配置管理,通常情况下 Nacos 中存储着 MySQL、Redis 等数据库的账号和密码。当前使用的版本存在用
2023-08-21

揭秘 HTTP 401 未授权:PHP 开发中的访问限制问题

http 401 未授权错误表明服务器无法接受未经验证的请求。为了解决此问题,可以遵循以下步骤:启用 http 基本身份验证以提示用户输入凭据。验证提供的凭据,仅允许授权用户访问。揭秘 HTTP 401 未授权:PHP 开发中的访问限制问题
揭秘 HTTP 401 未授权:PHP 开发中的访问限制问题
2024-04-09

关于Redis未授权访问漏洞利用的介绍与修复建议

前言 本文主要给大家介绍了关于Redis未授权访问漏洞利用的相关内容,文中对该漏洞进行了详细,并给出了相对应的修复/安全建议,下面话不多说了,来一起看看详细的介绍吧。 一、漏洞介绍Redis 默认情况下,会绑定在 0.0.0.0:6379,
2022-06-04

SQLServer 错误 8601 内部查询处理器错误:查询处理器未能获得对所需接口的访问权限。 故障 处理 修复 支持远程

详细信息 Attribute 值 产品名称 SQL Server 事件 ID 8601 事件源 MSSQLSERVER 组件 SQLEngine 符号名称 INVALID_INTERFACE_ERR 消息正文 ...
SQLServer 错误 8601 内部查询处理器错误:查询处理器未能获得对所需接口的访问权限。 故障 处理 修复 支持远程
2023-11-05

SQLServer 错误 3181 还原此备份的尝试可能会遇到存储空间问题。 后续消息将提供详细信息。 故障 处理 修复 支持远程

详细信息 Attribute 值 产品名称 SQL Server 事件 ID 3181 事件源 MSSQLSERVER 组件 SQLEngine 符号名称 LDDB_STORAGE_VERIFY 消息正文 ...
SQLServer 错误 3181 还原此备份的尝试可能会遇到存储空间问题。 后续消息将提供详细信息。 故障 处理 修复 支持远程
2023-11-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录