问题场景:线上页面安全测试反馈存在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 的安全问题。