【安全鉴权】Spring Boot Actuator如何进行安全鉴权?还得是这样。

5,451 阅读2分钟

背景

spirng boot actuator是springboot程序的监控系统,可以监控很多很多的系统数据,可以查看应用配置的详细信息等功能。这么强大的功能,如果不采取一些安全措施,很容易暴露出来,被人恶意利用。故本文将讲述2种方式,来保证使用spirng boot actuator的安全。

安全措施

  • 按需开放管理端点
  • 加入spring security,使用actuator时需要鉴权

前提

spring Boot系统已实现spring Boot Actuator,可使用其监控功能。本文不描述如何实现spring Boot Actuator,只讲解如何保证其安全性。

实现(精华)

  • 1、 检查服务中是否有引入依赖spring-boot-starter-security,若未引入,则引入对应依赖。
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
  • 2、 新增security相关的环境变量,如图所示

image.png

代码内容如下

spring:
  security:
    user:
      name: admin
      password: 123456
  • 3、 确认服务中需要开放的actuator端点,根据actuator开放端点方式说明进行对应的配置。

actuator开放端点方式说明

示例1: 当需要开放的actuator端点数量较少,如info、health时,可采用以下方式进行配置

image.png

示例2: 当需要开放的actuator端点数量较多时,如除端点info、health外其他所有端点,可采用以下方式进行配置

image.png

  • 4、 确认服务中需要开启Security鉴权验证的actuator端点,维护在环境变量中。多个端点之间使用,隔开。

示例:

# 需要Security验证的actuator端点名,多个端点之间使用,隔开。
actuator:
  security:
    endpoints: info,prometheus
  • 5、 新建Security配置文件,代码如下
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * @author Q
 * @version 1.0
 * @date 2022/3/24 16:27
 */

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${actuator.security.endpoints:#{null}}")
    private String endpoints;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
//        方式1:开放的actuator端点全部都验证
//        http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()
//                .anyRequest().authenticated().and().httpBasic();
//        方式2:仅验证名单中的actuator端点
        http.requestMatcher(EndpointRequest.to(transformEndpoints(endpoints))).authorizeRequests()
                .anyRequest().authenticated().and().httpBasic();
    }

    private String[] transformEndpoints(String endpoints) {
        // isEmpty判空方法
        if (isEmpty(endpoints)) {
            return new String[0];
        }
        return endpoints.split(",");

    }

}

验证(看看效果)

验证1: 当访问需要验证的端点时,会提示输入账号密码。正确输入上文种配置的密码即可访问。

image.png

验证2: 当访问不验证的端点时,可直接访问。

image.png

验证3: 当访问未开放的端点时,地址不可达。

image.png

备注: actuator.security.endpoints和management.endpoints.web.exposure.include/exclude 这些值均可需要配置在application-XXX.yml中开放给运维配置,更加保证其安全性。