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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐