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,建议直接关闭,避免漏洞根源。
相关推荐
不能放弃治疗1 小时前
上下文压缩机制
后端
QQ_21696290961 小时前
【项目编号:project95315】SpringBoot公共自习室管理系统:座位预约、房间管理、签到核销、公告规则完整实战
java·spring boot·后端
凤山老林1 小时前
高可用服务容错架构:Spring Boot 集成 Resilience4j 实战指南
spring boot·后端·架构·resilience4j
手握风云-1 小时前
Spring Cloud:分布式系统的“粘合剂”(五)
后端·spring·spring cloud
早点睡9751 小时前
Python 上下文管理器深度剖析:从 with 语法糖到 CPython 底层协议
后端·面试
嵌入式阿蔡1 小时前
面试高频考点 01:volatile / 中断 / 堆栈 八股精讲
java·面试·职场和发展·嵌入式实时数据库
Cache技术分享1 小时前
503. Java 反射 - 编写 ServiceFactory 类
前端·后端
高频因子挖掘机1 小时前
QuantDash 成交量单位统一实战:从“手”到“股”的跨市场量化数据清洗全流程
后端·算法·github
码农看码1 小时前
Spring Boot 启动到响应:一个 HTTP 请求是怎么走到 Controller 的?
后端
秋饼2 小时前
LangChain4j + Java 实现企业级 Text-to-SQL 智能问数系统:从自然语言到安全可控的数据洞察
java·ai·技术分享·后端开发