首页 / 资讯动态 / Spring Boot Actuator端点安全暴露管控

Spring Boot Actuator端点安全暴露管控

Spring Boot Actuator 是应用运维的利器,但也是信息泄露的重灾区。很多团队只记得引入依赖,却忘了把门锁上。线上环境直接暴露 /actuator/health 看似无害,但 /actuator/env、/actuator/mappings、/actuator/heapdump 等端点一旦被未授权访问,数据库密码、云服务密钥、内部 API 拓扑、甚至运行时内存数据会全部摊在攻击者面前。这不是危言耸听,Shodan 等搜索引擎上随手一搜就能找到大量敞开的 Actuator 端点。问题核心不在于 Actuator 本身,而在于开发者对“默认配置”的盲目信任。

先搞清楚哪些端点必须关掉

Spring Boot 2.x 默认只通过 Web 暴露 health 和 info 两个端点,这比 1.x 时代安全了不少,但很多项目为了监控需要,会在 application.yml 里直接写成 management.endpoints.web.exposure.include=* ,一把梭开放所有端点。真正该暴露给外部的只有 health、info 以及可能经过定制的 metrics 子集。下面这些端点一旦暴露,风险极高:

env 端点会泄露所有环境变量和配置属性,包括通过配置中心下发的明文密码。configprops 端点展示所有 @ConfigurationProperties 的绑定值,同样可能包含凭证。threaddump 端点暴露线程堆栈,能推断出业务逻辑和中间件版本。heapdump 端点下载整个堆内存快照,攻击者用 VisualVM 或 MAT 分析,能提取出任何在内存中存在的字符串。mappings 端点列出所有请求映射,等于给攻击者画了一张攻击路径地图。gateway 端点如果用了 Spring Cloud Gateway,能列出路由规则,甚至可能触发动态路由操作。这些端点在生产环境必须全部关闭,或者至少做到严格认证。

最小暴露原则的落地配置

不要用 include=*,改用显式列举。在 application-prod.yml 中这样写:

management:
  endpoints:
    web:
      exposure:
        include: health,info

如果监控系统需要拉取 Prometheus 格式的指标,再加一个 prometheus。如果有自定义的只读端点,也按需添加。关键是生产配置必须和开发配置分离,开发环境可以开放更多端点方便调试,但生产配置要用 spring.profiles.active=prod 严格区分。很多团队把通用配置写在 application.yml,生产环境只覆盖数据库连接,却忘了覆盖 Actuator 的暴露范围,这就留下了隐患。

把 Actuator 端口独立出去

更彻底的做法是让 Actuator 监听不同的端口,不和业务接口混在一起。这样可以在网络层做访问控制,只允许内网监控系统访问这个端口:

management:
  server:
    port: 8081
  endpoints:
    web:
      exposure:
        include: health,info,prometheus

业务端口 8080 对外提供 API 服务,管理端口 8081 只绑定内网 IP 或 127.0.0.1。如果应用部署在 Kubernetes,可以把管理端口的 Service 设为 ClusterIP 且不暴露 Ingress,业务端口单独暴露。网络隔离是最可靠的一道防线,即使应用层认证配置失误,攻击者从公网也根本访问不到管理端口。

给 Actuator 加一层认证

如果架构上必须让 Actuator 和业务接口共用端口,那就必须引入认证。Spring Security 是最直接的方案。不要只写个简单的密码就完事,要针对 Actuator 路径单独配置角色和权限:

@Configuration
public class ActuatorSecurityConfig {

    @Bean
    public SecurityFilterChain actuatorFilterChain(HttpSecurity http) throws Exception {
        http.securityMatcher(EndpointRequest.toAnyEndpoint())
            .authorizeHttpRequests(auth -> auth
                .requestMatchers(EndpointRequest.to("health", "info")).permitAll()
                .anyRequest().hasRole("ACTUATOR_ADMIN")
            )
            .httpBasic(Customizer.withDefaults());
        return http.build();
    }
}

health 和 info 通常需要给负载均衡或健康检查使用,可以放行。其余端点一律要求 ACTUATOR_ADMIN 角色,这个角色只分配给运维账号,不和普通用户角色混用。httpBasic 在生产环境最好替换为 OAuth2 或结合 Spring Security 的 JWT 验证,避免基础认证的密码在传输中被截获。

自定义 Actuator 端点时的安全陷阱

很多团队会写自定义端点来暴露业务状态,比如缓存命中率、订单积压量、队列深度等。自定义端点默认继承 AbstractEndpoint,如果不显式标注 @Endpoint 的默认访问权限,很容易因为配置继承而意外暴露。自定义端点一定要用 @Endpoint(id = "customStats", enableByDefault = false) 关闭默认启用,然后通过配置按需打开。更关键的是,自定义端点内部如果拼接了用户输入或从请求参数取值,必须做严格的输入校验,避免通过 Actuator 端点引入注入漏洞。

如果自定义端点需要返回敏感数据,比如当前在线用户列表或交易流水摘要,必须在方法上使用 @RolesAllowed 或方法级安全注解,确保只有授权角色能调用。Actuator 端点本质上是特殊的 Controller,所有 Web 安全最佳实践在这里同样适用。

heapdump 端点的高危风险与替代方案

heapdump 端点在生产环境一旦被访问,攻击者下载到的 .hprof 文件里可能包含数据库连接字符串、Redis 密码、JWT 签名密钥、用户会话令牌等一切在 JVM 堆内存中存在过的字符串。即使你的配置中心做了加密,应用启动后解密的值依然会以明文形式驻留在内存中。生产环境必须禁用 heapdump 端点,没有妥协余地。如果确实需要在线诊断内存问题,应该通过 JMX 连接或使用 APM 工具的 profiling 功能,这些通道本身有独立的认证和加密机制。

env 和 configprops 的脱敏处理

如果因为某些原因必须在受控环境下保留 env 端点,至少要对敏感字段做脱敏。Spring Boot 提供了 SanitizingFunction 机制:

@Bean
public SanitizingFunction sanitizingFunction() {
    return data -> {
        PropertySource propertySource = data.getPropertySource();
        if (propertySource.getName().contains("applicationConfig")) {
            return data.withValue("");
        }
        return data;
    };
}

但这只是障眼法,脱敏逻辑可能被绕过,或者新增的 PropertySource 没被覆盖到。最稳妥的方案仍然是禁用 env 和 configprops 端点,敏感配置的查看通过专门的权限管理平台或审计日志来实现。

Spring Boot 3.x 的安全增强

Spring Boot 3.x 对 Actuator 安全做了进一步收紧,但依然需要开发者正确配置;

3.x 默认只暴露 health,连 info 都需要显式添加。同时 Actuator 端点与 Spring Security 的集成更紧密,如果类路径上有 Spring Security,Actuator 会自动要求认证,但自动配置的默认用户和密码是随机生成的,生产环境必须覆盖。另外 3.x 引入了对 Micrometer Tracing 的原生支持,trace 和 spans 端点如果暴露,会泄露内部调用链和参数,同样需要严格管控。

审计与监控

安全配置做完后,还需要监控 Actuator 端点本身的访问行为。开启 Actuator 的审计事件,记录谁在什么时间访问了哪个端点:

@EventListener
public void onAuditEvent(AuditEvent event) {
    log.warn("Actuator访问审计: {} 访问了 {} 结果: {}", 
        event.getPrincipal(), event.getType(), event.getData());
}

结合日志聚合系统设置告警,当 env、heapdump 等敏感端点被访问时即时通知安全团队。这不是过度防御,而是纵深防御的必要一环。很多数据泄露事件事后复盘时,攻击者早在数月前就已经通过 Actuator 端点完成了信息收集,只是当时没人注意到这些访问记录。

检查清单

把下面这些项逐条过一遍,基本能覆盖 90% 的 Actuator 安全风险:生产环境 management.endpoints.web.exposure.include 不使用通配符;heapdump、env、configprops、threaddump、mappings 端点全部禁用;管理端口独立监听内网地址或 127.0.0.1;Actuator 路径配置独立的安全策略,health 和 info 按需放行,其余要求强认证;自定义端点默认禁用,按需开启并做权限控制;审计日志记录所有敏感端点访问;定期扫描外网暴露面,确认 Actuator 路径不可达。安全不是一次性配置,而是持续验证的过程。