Spring Boot Actuator未授权访问漏洞 【原理扫描】修复

一、背景

漏洞名称 :Spring Boot Actuator未授权访问漏洞 【原理扫描】
风险等级:中

详细描述

Actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块,借助于 Actuator 开发者可以很方便地对应用系统某些监控指标进行查看、统计等。在 Actuator 启用的情况下,如果没有做好相关权限控制,非法用户可通过访问默认的执行器端点(endpoints)来获取应用系统中的监控信息。


二、问题分析与复现

部署的微服务项目中,访问 http://ip:port/actuator 时,未受到任何权限控制,直接暴露了 Actuator 的接口信息。应用在生产环境中暴露了潜在的敏感信息,存在较大的安全隐患。

通过浏览器或命令行工具(如 curl)可以访问下面的端点:

  • /actuator/health
  • /actuator/env
  • /actuator/info
  • ...

这些端点中,envhealth(开启详细信息时)可能泄露系统环境变量、配置属性、数据库连接信息等敏感数据。


三、解决方法

1. 更改初始配置的 3 种方式

漏洞扫描时项目初始配置如下:

yaml 复制代码
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

浏览器访问或使用 curl -i http://ip:port/actuator请求,会返回敏感数据。

1.1 开放指定端点,显示简略信息

然后调整到下面这样:

yaml 复制代码
management:
  endpoints:
    web:
      exposure:
        # 我用的springboot版本是2.3,actuator接口还是会返回200,但是子接口模禁掉了。
        #exclude: '*'
        include: "health,info"
  endpoint:
    health:
      show-details: never

改成这个后浏览器可以直接访问,访问结果如图所示。


敏感的环境信息没有返回,/actuator 返回的是导航菜单,/actuator/health 返回服务是否存活,所以基本可以确认安全了。

show-details 控制接口内容返回详细程度,有三个可选值:

可选值 含义 返回内容 安全性 适用场景
NEVER (默认值) "从不显示细节" 访问时只告诉你"UP"还是"DOWN",不解释原因。 {"status": "UP"} 🟢 (最安全) 生产环境推荐。 给 K8s 或负载均衡做存活检查用。
WHEN_AUTHORIZED "认证后显示" 游客看简略信息,登录后的管理员看详细信息。 未登录: {"status": "UP"} 已登录: 显示磁盘、DB 等详情 🟡 (需配置 Security) 既需要监控又需要安全的场景。 前提: 必须集成了 Spring Security 并配置了角色。
ALWAYS "总是显示" 只要能访问接口,就可以查看详细内容。 {"status": "UP", "components": {"db": {...}, "diskSpace": {...}}} 🔴 (危险) 仅限开发/测试环境

虽然人工确认安全,但是安全扫描工具还是判定为漏洞,这时有两种解决方式,一种是变更默认路径,一种是彻底关闭Actuator。

1.2 修改默认访问路径

运维时需要检查项目的健康状况等信息,不适合关闭Actuator,所以只能修改默认访问路径,记得用到Actuator 的配置或路径也需要同步修改。漏洞工具只会扫描默认路径,这也是另外一种规避,但需要自己配置正确,不要返回敏感信息。

yaml 复制代码
management:
  endpoints:
    web:
      exposure:
        include: "health,info"
      base-path: /checkactuator
      # 这个配置在某些springboot版本不一定有效,作用是关掉 /actuator 接口。
      #discovery:
        #enabled: false
  endpoint:
    health:
      show-details: never

重启服务后访问,,访问原默认路径:

访问修改后路径:

好了,扫描通过。

1.3 彻底关闭

如果确定不使用了,可以选择彻底禁用 Actuator 模块,防止任何端点在生产环境中暴露。

yaml 复制代码
management:
  server:
    port: -1

这个配置直接关闭了 Actuator 的服务端口,使其完全不可访问,验证结果如下:

  • /actuator/health → 404
  • /actuator/env → 404
  • /actuator/info → 404

通过 curl、浏览器等方式均无法访问,说明已彻底关闭。


2. Spring Security 配置(未尝试)

官方建议使用 Spring Security 对 Actuator 接口添加认证控制,例如:

yaml 复制代码
spring:
  security:
    user:
      name: admin
      password: xxx

这个配置会影响整个应用的安全机制,导致所有接口均需登录认证。避免影响正常业务调用,没有调试这个。

还有通过自定义 SecurityConfig 类,对 /actuator/** 接口设置认证规则,项目由客户维护,改代码重测有点麻烦,没用它。

3. Nginx 拦截

使用 Nginx 拒绝所有 /actuator 开头的请求:

nginx 复制代码
location ^~ /actuator {
  deny all;
  return 403;
}

有用。


四、总结

Spring Boot Actuator 提供了丰富的监控能力,但在未做好权限控制的情况下存在严重的安全风险。尤其是在微服务架构中,Actuator 常被用于服务发现与健康检查,其默认暴露行为容易被忽视,成为安全薄弱点。

本次修复过程的关键经验总结如下:

  • 配置项需精确匹配版本:部分配置项在不同 Spring Boot 版本中行为存在差异,需结合版本文档验证。
  • 默认配置不可依赖:不要假设 Actuator 默认是安全的,必须手动限制暴露的端点。
  • 彻底关闭是最保险的措施:如果线上无必要使用 Actuator,建议直接关闭,避免漏洞根源。
相关推荐
Alex Gram2 分钟前
双机热备软件哪个好
java·系统架构·c#·keepalived·高可用·双机热备·双机热备软件
纳兰青华8 分钟前
拼图大师:从“暴力尝试“到“动态规划“的拆字艺术
java·算法·动态规划
蓝斯4979 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加贝塞尔曲线,上、下、左、右连接点
java·c#·流程图
前端工作日常9 小时前
我学习到的Java 的 Service 分层:itf 和 impl 到底是什么?
java·后端
都叫我大帅哥10 小时前
Spring @Transactional 注解完全指南
java·spring
Java成神之路-10 小时前
G1 垃圾回收器 :SATB + TAMS核心机制深度解析
java·jvm
前端工作日常10 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端
带刺的坐椅10 小时前
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎
java·solon·jetty·undertow·mcp-server·htttp
犀利豆11 小时前
Claude Code Tools 研究系列(三)ExitPlanMode
人工智能·后端