修复SpringBoot Actuator未授权访问遇到的问题
问题场景:线上页面安全测试反馈存在SpringBoot Actuator未授权访问问题。简单说就是访问https://xxx.xx.x/actuator/env(xxx.xx.x,页面调用接口域名)时,会返回全部环境属性。
****风险分析:****Actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块,借助于 Actuator 开发者可以很方便地对应用系统某些监控指标进行查看、统计等。在 Actuator 启用的情况下,如果没有做好相关权限控制,非法用户可通过访问默认的执行器端点(endpoints)来获取应用系统中的监控信息。
Actuator 相关信息可以自行检索了解,在查找解决方案时,发现主要有以下几种处理: 1.禁用/env接口
management:
endpoint:
env:
enabled: false
2.可以在配置文件中把暴露出的端点排除掉
#开启所有的端点访问(目前 health和info是默认开启的) management.endpoints.web.exposure.include=* #屏蔽掉health端点 management.endpoints.web.exposure.exclude=health
3.引入spring-boot-starter-security依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
在application.properties中指定actuator的端口以及开启security功能,配置访问权限验证,这时再访问actuator功能时就会弹出登录窗口,需要输入账号密码验证后才允许访问。
spring:
security:
user:
name: admin
password: admin
management:
server:
port: 8099
endpoints:
web:
exposure:
include: "*"
先使用方案三,配置A服务发布上线后,发现访问时确实需要用户名和密码了,但是B服务在对A服务服务间调用时,发生了报错,检查报错原因为未授权也就是访问的时候需要用户名和密码。 发生这种问题原因:A服务作为最顶层的服务,一般可理解为网关,A服务不应该被B服务服务间调用。 合理情况应该是: 1.A服务作为最顶层的服务,由它来做接口访问限制。 2.正常应该是A调用B,对于微服务的设计需要合理化。 由于项目的微服务划分不合理,导致顶层的服务本来是可以通过security 的用户名和密码加接口访问限制,结果发现方案三在此项目中行不通。后来改用方案一后解决了Actuator 的安全问题。
最后
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。
