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,建议直接关闭,避免漏洞根源。
相关推荐
1candobetter2 小时前
JAVA后端开发——Spring Boot 多环境配置与实践
java·开发语言·spring boot
沛沛老爹2 小时前
Web开发者实战:多模态Agent技能开发——语音交互与合成技能集成指南
java·开发语言·前端·人工智能·交互·skills
Wpa.wk2 小时前
Docke-compose 搭建 testLink环境
java·经验分享·测试工具·容器·testlink
小北方城市网2 小时前
Spring Boot Actuator+Prometheus+Grafana 生产级监控体系搭建
java·spring boot·python·rabbitmq·java-rabbitmq·grafana·prometheus
shehuiyuelaiyuehao2 小时前
图书管理系统
java·服务器·前端
IUGEI4 小时前
从原理到落地:DAG在大数据SLA中的应用
java·大数据·数据结构·后端·算法
Whisper_Sy10 小时前
Flutter for OpenHarmony移动数据使用监管助手App实战 - 网络状态实现
android·java·开发语言·javascript·网络·flutter·php
乂爻yiyao10 小时前
1.1 JVM 内存区域划分
java·jvm
Bony-11 小时前
Go语言垃圾回收机制详解与图解
开发语言·后端·golang