确保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应用的其他端点一样。