相关推荐recommended
Spring Boot Actuator未授权访问漏洞
作者:mmseoamin日期:2023-12-05

1.问题

Spring Boot Actuator 端点的未授权访问漏洞是一个安全性问题,可能会导致未经授权的用户访问敏感的应用程序信息。

可是并不用太过担心,Spring Boot Actuator 默认暴漏的信息有限,一般情况下并不会暴露敏感数据。

注册中心有些功能集成了actuator,如果同时使用eureka和actuator,可以在eureka中点击注册链接查看健康状态信息(/actuator/info)。但是删除 Spring Boot Actuator 的引用对 Eureka 注册中心本身并没有直接影响。Eureka 注册中心是用于管理微服务实例的,而 Spring Boot Actuator 提供了用于监控和管理单个微服务实例的功能。

Spring Boot Actuator 的存在与否不会影响 Eureka 注册中心的核心功能,即注册和发现微服务。删除 Spring Boot Actuator 的引用只会影响您的单个微服务实例,使您失去了通过 Actuator 暴露的一些监控和管理功能。

2. 解决方案

2.1 关闭不必要的端点

在默认情况下,Spring Boot Actuator 并不会暴露所有端点。您可以在配置文件中配置 management.endpoints.web.exposure.include 或 management.endpoints.web.exposure.exclude 属性,以控制哪些端点是公开的或不公开的。确保只公开需要的端点,将不必要的端点关闭。

management:
  endpoints:
    enabled-by-default: false
    health: 
      enabled: true  
    web:
      base-path: /myownurl
      exposure:
        exclude: '*'

2.2 添加访问权限控制

您可以通过配置 Spring Security 来限制对 Actuator 端点的访问。Spring Security 可以帮助您实现身份验证和授权机制,确保只有授权的用户可以访问 Actuator 端点。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/actuator/**").hasRole("ADMIN") // 设置只有具有 ADMIN 角色的用户可以访问 Actuator 端点
                .anyRequest().permitAll()
            .and()
            .httpBasic(); // 启用基本认证
    }
}

3. 了解actuator

3.1 概念

Spring Boot Actuator 是 Spring Boot 框架中的一个模块,它提供了一组用于监控和管理 Spring Boot 应用程序的功能。Actuator 使开发人员能够在应用程序运行时了解应用程序的状态、性能和健康情况,以及一些管理操作。它主要有以下作用:

应用程序健康监控:Actuator 提供了 /actuator/health 端点,可以用来检查应用程序的健康状态。这对于自动化运维、监控系统和负载均衡器非常有用。您可以在应用程序发生问题时通过此端点检查应用程序是否健康,以及有关问题的更多信息。

度量指标:通过 /actuator/metrics 端点,可以获取关于应用程序运行状态的度量指标,如内存使用、线程数、HTTP 请求等。这些指标对于性能优化和容量规划很有帮助。

应用程序信息:通过 /actuator/info 端点,您可以暴露自定义的应用程序信息,如版本号、作者、描述等。这对于构建信息展示页面或者提供有关应用程序的元数据很有用。

Spring Beans 和 Endpoints 显示:通过 /actuator/beans 和 /actuator/mappings 端点,您可以查看应用程序中所有的 Spring Bean 和 Spring MVC 的映射路径,这对于调试和监控应用程序的组件很有帮助。

环境属性和配置:通过 /actuator/env 端点,可以查看应用程序的环境属性和配置信息。

日志级别管理:通过 /actuator/loggers 端点,您可以查看和修改应用程序的日志级别。

HTTP 请求跟踪:通过 /actuator/trace 端点,您可以查看最近的 HTTP 请求的跟踪信息,用于排查问题。

Spring Boot Actuator 提供了丰富的端点,以帮助开发人员更好地理解和管理他们的应用程序。它在监控、调试和运维方面提供了强大的功能,是构建可管理的 Spring Boot 应用程序的重要工具。

3.2 配置详情

在默认情况下,Spring Boot Actuator 公开了一些常用的端点,但也有一些端点是不公开的。这是为了安全性考虑,避免在生产环境中泄漏敏感信息。

以下是 Spring Boot 2.x 版本默认情况下公开的一些端点:

/actuator/health:公开,默认允许所有用户访问。提供应用程序的健康状况信息。

/actuator/info:公开,默认允许所有用户访问。提供自定义的应用程序信息。

/actuator/metrics:不公开,默认不允许访问。提供各种度量指标,如内存使用、线程数、HTTP 请求等。

/actuator/mappings:不公开,默认不允许访问。展示 Spring MVC 中的所有映射路径。

/actuator/env:不公开,默认不允许访问。显示应用程序的环境属性和配置。

/actuator/beans:不公开,默认不允许访问。显示 Spring Bean 的列表。

/actuator/trace:不公开,默认不允许访问。显示最近的 HTTP 请求的跟踪信息。

/actuator/threaddump:不公开,默认不允许访问。生成当前线程的线程转储。

/actuator/auditevents:不公开,默认不允许访问。提供应用程序的审计事件信息。

/actuator/loggers:不公开,默认不允许访问。显示和修改应用程序的日志配置。

/actuator/httptrace:不公开,默认不允许访问。提供 HTTP 跟踪信息,用于记录 HTTP 请求和响应的详细信息。

您可以通过在配置文件中使用 management.endpoints.web.exposure.include 或 management.endpoints.web.exposure.exclude 属性来控制哪些端点是公开的或不公开的。默认情况下,info 和 health 是允许公开的。

例如,以下配置将会关闭 mappings 端点的公开:

关闭 mappings 端点的公开

management.endpoints.web.exposure.exclude=mappings

根据您的需求,您可以灵活地配置哪些 Actuator 端点是可以访问的。确保在生产环境中仅公开必要的端点,并保护敏感信息。

3.3 注意事项

  1. springboot项目不会默认导入Spring Boot Actuator

    org.springframework.boot
    spring-boot-starter-actuator

  1. 如果其他组件有引入但是不知道是哪个组件,使用传递依赖引入,进入项目根目录,使用mvn dependency:tree列出所有依赖项及其传递依赖项。