确保Actuator的安全

我们可能不想让别人窥探Actuator暴露的信息。此外,因为Actuator提供了一些用于修改环境变量和日志级别的操作,所以最好对Actuator进行保护,使得只有具有对应权限的客户端才能消费这些端点。

虽然保护Actuator端点非常重要,但是确保安全性并不是Actuator本身的职责,我们需要使用Spring Security来保护Actuator。因为Actuator端点的路径和应用本身的路径非常相似,所以保护Actuator与保护其他的应用路径并没有太大区别。我们在第5章讨论的内容依然适用于保护Actuator端点。

因为所有的端点都集中在“/actuator”基础路径(如果设置了management.endpoints. web.base-path属性,那么可能会是其他的路径)下,所以很容易将授权规则应用到所有的Actuator端点上。例如,想要仅允许具有ROLE_ADMIN权限的用户调用Actuator端点,可以重写WebSecurityConfigurerAdapter的configure()方法:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .authorizeRequests()
      .antMatchers("/actuator/**").hasRole("ADMIN")

    .and()

    .httpBasic();
}

这使得所有的请求均需由具备ROLE_ADMIN权限的授权用户发起才能访问。它还配置了HTTP basic认证,使客户端应用可以在请求的Authorization头信息中提交编码后的认证信息。

保护Actuator的唯一问题在于,端点的路径硬编码为“/actuator/**”,如果修改management.endpoints.web.base-path属性导致了路径发生变化,这种方式就无法正常运行了。为了解决这个问题,Spring Boot提供了EndpointRequest(一个请求匹配类,更简单,而且不依赖于给定的String类型的路径)。借助EndpointRequest,可以将相同的安全要求用于Actuator,而且不需要硬编码路径:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .requestMatcher(EndpointRequest.toAnyEndpoint())
      .authorizeRequests()
        .anyRequest().hasRole("ADMIN")
    .and()
    .httpBasic();
}

EndpointRequest.toAnyEndpoint()方法会返回一个请求匹配器,它会匹配所有的Actuator端点。如果想要将某些端点从请求匹配器中移除,可以调用excluding()方法,并通过名称声明:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .requestMatcher(
        EndpointRequest.toAnyEndpoint()
                       .excluding("health", "info"))
    .authorizeRequests()
      .anyRequest().hasRole("ADMIN")
  .and()
    .httpBasic();
}

另外,如果只是想将安全性用于一部分Actuator端点,可以调用to()来替换toAnyEndpoint(),并使用名称指明这些端点:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .requestMatcher(EndpointRequest.to(
            "beans", "threaddump", "loggers"))
    .authorizeRequests()
      .anyRequest().hasRole("ADMIN")
  .and()
    .httpBasic();
}

这样会限制安全性功能仅用于“/beans”“/threaddump”和“/loggers”端点,其他Actuator端点会全部对外开放。

小结

  • Spring Boot Actuator以HTTP和JMX MBean的形式提供了多个端点,能够让我们探查Spring Boot应用内部的运行状况。

  • 大多数Actuator端点默认是禁用的,可以通过设置management.endpoints.web.exposure. include和management.endpoints.web.exposure.exclude属性有选择地对外暴露它们。

  • 有些端点(比如“/loggers”和“/env”)允许写入操作,以在运行时改变应用的配置。

  • 借助“/info”端点可以暴露应用的构建和Git提交的详情。

  • 自定义的健康指示器可以反映应用的健康状况,以便跟踪外部集成系统的健康状态。

  • 自定义的应用指标可以通过Micrometer注册,以集成Spring Boot应用和多种流行的指标引擎,包括Datadog、New Relic和Prometheus。

  • Spring Security可以保护Actuator的Web端点,就像保护Spring Web应用的其他端点一样。