文章总结: 本文记录了一起SpringBootActuator端点因配置include:*导致生产环境敏感信息泄露的高危安全事件。作者详细描述了从收到安全工单、确认泄露范围(包括数据库密码、Redis密码、API密钥及1.8GB堆内存dump)到紧急修复的全过程。核心修复措施包括限制暴露端点、添加认证、禁用heapdump、Nginx层面拦截以及全团队推广安全配置模板。文章提供了可操作的安全加固Checklist和风险评估报告,强调了生产环境禁用高风险端点的重要性。 综合评分: 90 文章分类: 应急响应,安全建设,解决方案,安全工具,漏洞分析
Spring Boot Actuator端点泄露-安全团队给我发了高危工单
原创
希成男孩 希成男孩
JAVA小师傅
2026年8月20日 09:03 上海
在小说阅读器读本章
去阅读
安全团队的工单邮件发到我邮箱时,我以为是钓鱼邮件。
标题写着:【高危】生产环境敏感信息泄露 — 涉及数据库密码、Redis密码、API密钥。
打开一看,我们的订单服务Actuator端点暴露在公网,任何人都可以访问。里面不仅有健康检查,还有环境变量、配置属性、线程dump——数据库密码就在环境变量里明文展示。
我花了半天时间修复和排查,发现泄露的数据比我想象的还多。
问题发现
安全团队的工单内容:
【高危安全工单 #SEC-2025-1847】
发现时间:2025-11-20 14:30
风险等级:P0-高危
影响范围:订单服务(order-service-prod)
问题描述:
外部安全扫描发现 order-api.xxx.com/actuator 端点可公开访问,
未配置任何身份认证。
泄露信息:
1. /actuator/env → 包含数据库密码、Redis密码、第三方API Key
2. /actuator/heapdump → 可下载完整堆内存(含用户Session信息)
3. /actuator/threaddump → 暴露内部线程结构和调用栈
4. /actuator/configprops → 完整配置属性
5. /actuator/mappings → 全部URL映射
请24小时内修复并提供影响评估报告。
我当时就慌了。
第一步:确认泄露范围
先确认这些端点是否真的对外开放:
# 从外部测试
$ curl-s http://order-api.xxx.com/actuator | head -20
{
"_links": {
"self": {
"href": "http://order-api.xxx.com/actuator",
"templated": false
},
"health": {
"href": "http://order-api.xxx.com/actuator/health",
"templated": false
},
"info": {
"href": "http://order-api.xxx.com/actuator/info",
"templated": false
},
"env": {
"href": "http://order-api.xxx.com/actuator/env",
"templated": false
}
}
}
确实是开放的。再看env端点:
$ curl-s http://order-api.xxx.com/actuator/env | python3 -m json.tool | grep-i"pass\|key\|secret" | head -20
"db.password": "****",
"redis.password": "******",
"oss.access-key-id": "LTAI5tXXXXXXXX",
"oss.access-key-secret": "XXXXXXXXXXXX",
"wechat.pay.mch-key": "XXXXXXXX",
"spring.datasource.password": "Xk8#mN2$pQ9!rT5&"
部分密码被Spring Boot的sanitization功能掩盖了(显示为 ****),但 spring.datasource.password 因为配置方式的原因没有被掩盖。
再看heapdump:
$ curl-s-o heapdump.hprof http://order-api.xxx.com/actuator/heapdump
$ ls-lh heapdump.hprof
-rw-r--r--1 root root 1.8G heapdump.hprof
1.8GB的堆内存dump文件,包含了所有运行时的内存数据——用户信息、订单数据、Session、缓存里的密码……全部都在里面。
第二步:分析Actuator配置
找到问题配置:
# application.yml
management:
endpoints:
web:
exposure:
include: "*" # ❌ 暴露所有端点!
base-path: /actuator
endpoint:
health:
show-details: always
env:
enabled: true # 默认开启
heapdump:
enabled: true # 默认开启
include: "*" 暴露了所有Actuator端点。而Spring Boot默认的Actuator端点权限是——没有任何权限控制。谁都可以访问。
第三步:紧急修复
1. 只暴露必要的端点
management:
endpoints:
web:
exposure:
include: health,info,prometheus # ✅ 只暴露必要的端点
# exclude: env,heapdump,threaddump,configprops,mappings,beans,conditions,flyway,scheduledtasks,httptrace
2. 敏感端点加认证
对于仍然需要使用的管理端点(如env用于运维排查),加上认证:
@Configuration
publicclassActuatorSecurityConfigextendsWebSecurityConfigurerAdapter {
@Override
protectedvoidconfigure(HttpSecurityhttp) throwsException {
http
.requestMatchers()
.antMatchers("/actuator/**")
.and()
.authorizeRequests()
.antMatchers("/actuator/health", "/actuator/info", "/actuator/prometheus")
.permitAll() // 健康检查和监控指标不需要认证(供K8s和Prometheus使用)
.antMatchers("/actuator/**")
.hasRole("ADMIN") // 其他端点需要ADMIN角色
.and()
.httpBasic(); // 使用HTTP Basic认证
}
}
#
3. 密码自动掩盖
Spring Boot 2.0+ 默认会掩盖env端点中包含”password”、”secret”、”key”等关键词的属性值。但需要确认自定义的配置前缀是否被包含:
management:
endpoint:
env:
show-values: WHEN_AUTHORIZED # 认证后才显示明文
keys-to-sanitize: # 需要掩盖的关键词
- password
- secret
- key
- token
- .*credentials.*
- .*api-key.*
- .*access-key.*
- spring.datasource.password
- redis.password
- oss.access-key-secret
4. 禁用heapdump端点
heapdump是最高风险的端点。在任何环境都不应该暴露:
management:
endpoint:
heapdump:
enabled: false # 直接禁用
threaddump:
enabled: false # 也建议禁用,除非运维需要
如果需要heapdump排查线上问题,通过内网SSH到服务器本地执行,不要通过网络暴露。
第四步:全面排查和加固
1. Nginx层面拦截
即使Spring Boot层面修了,也要在Nginx层面加一道防线:
# nginx.conf
server {
listen 80;
server_name order-api.xxx.com;
# 禁止访问actuator端点(除了health)
location /actuator/ {
# 只允许健康检查和监控指标
if ($uri !~ ^/actuator/(health|info|prometheus)$) {
return 403;
}
# 健康检查允许所有来源
proxy_pass http://order-service-upstream;
}
# 其他路径正常代理
location / {
proxy_pass http://order-service-upstream;
}
}
2. 检查所有服务
# 批量检查所有服务的Actuator端点
for service in order-service payment-service inventory-service user-service product-service; do
echo "=== $service ==="
curl -s -o /dev/null -w "%{http_code}" "http://${service}-api.xxx.com/actuator"
echo ""
done
# 结果:
# === order-service === 200(❌ 暴露了)
# === payment-service === 200(❌ 暴露了)
# === inventory-service === 404(✅ 没暴露)
# === user-service === 200(❌ 暴露了)
# === product-service === 404(✅ 没暴露)
5个服务中有3个暴露了Actuator端点。全部修复。
3. 检查是否有历史泄露
# 检查Nginx访问日志,看有没有外部IP访问过这些端点
$ grep "/actuator/env\|/actuator/heapdump" /data/logs/nginx/access.log | awk '{print $1}' | sort -u
47.96.xxx.xxx
120.55.xxx.xxx
203.0.xxx.xxx # ← 这些是外部IP
101.132.xxx.xxx
有4个外部IP访问过这些敏感端点。需要评估是否被恶意利用。
第五步:安全加固Checklist
修复完成后,我整理了一份Actuator安全配置模板,推广到全团队:
# actuator-security.yml —— 团队统一模板
management:
endpoints:
web:
exposure:
include: health,info,prometheus # 只暴露必要的
base-path: /internal/actuator # 改个不容易猜到的路径
health:
show-details: when-authorized # 只有认证后才显示详情
env:
enabled: false # 生产环境禁用env端点
show-values: WHEN_AUTHORIZED
heapdump:
enabled: false # 生产环境必须禁用
threaddump:
enabled: false
configprops:
enabled: false
beans:
enabled: false
mappings:
enabled: false
conditions:
enabled: false
# Prometheus指标仍然需要(用于监控系统采集)
metrics:
export:
prometheus:
enabled: true
风险评估报告
给安全团队的回复:
【修复报告 #SEC-2025-1847】
修复时间:2025-11-20 18:00(发现后3.5小时)
泄露数据评估:
1. 数据库密码:spring.datasource.password 明文泄露(1个)
→ 已修改密码
2. Redis密码:被sanitization掩盖(显示为****)
→ 未实际泄露,但建议修改
3. OSS密钥:access-key-id泄露,access-key-secret被掩盖
→ 已轮换OSS密钥
4. 微信支付密钥:被掩盖
→ 未泄露,已确认
5. heapdump:可被下载(1.8GB)
→ 已无法访问。需要排查dump中是否包含用户敏感数据
影响用户数:heapdump中包含约2000条活跃Session,
涉及约500个用户的运行时数据(购物车、订单草稿等)。
无支付信息泄露(支付信息在独立服务中,未受影响)。
修复措施:
1. 所有服务Actuator端点限制暴露范围
2. 敏感端点加认证
3. Nginx层面拦截非授权访问
4. 轮换所有可能泄露的密钥和密码
5. 全团队推广Actuator安全配置模板
经验沉淀
Actuator安全配置Checklist:
include配成*了吗?生产环境绝对不能- heapdump端点禁用了吗?这是最高风险的端点
- env端点禁用了吗?或至少限制了认证访问
- 密码自动掩盖规则覆盖全了吗?自定义前缀的密钥有没有被掩盖
- Nginx层有没有拦截非授权Actuator请求?
- 所有服务都检查了吗?不能只改一个服务
- 有没有定期扫描?加到安全巡检流程中
Actuator端点风险等级:
| 端点 | 风险等级 | 生产环境建议 | | — | — | — | | /health | 低 | 可开放(K8s探针需要) | | /prometheus | 低 | 可开放(监控采集需要) | | /info | 低 | 可开放 | | /metrics | 中 | 认证后开放 | | /env | 高 | 禁用或严格认证 | | /heapdump | 极高 | 必须禁用 | | /threaddump | 高 | 禁用或认证后开放 | | /configprops | 高 | 禁用 | | /mappings | 中 | 禁用 | | /beans | 低 | 禁用 |
一句话总结: Actuator是给开发者用的诊断工具,不是给用户用的接口。生产环境一定要最小化暴露,最好只留health和prometheus。
👇 如果这篇文章对你有帮助,点个关注不迷路 👇
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:JAVA小师傅 希成男孩 希成男孩《Spring Boot Actuator端点泄露-安全团队给我发了高危工单》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论