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

发布日期:2024-07-22 01:03    点击次数:135
背景

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

安全措施 按需开放管理端点 加入spring security,使用actuator时需要鉴权 前提

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

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

图片

代码内容如下

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

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

图片

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

图片

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

示例:

yaml复制代码# 需要Security验证的actuator端点名,多个端点之间使用,隔开。
actuator:
  security:
    endpoints: info,prometheus
5、 新建Security配置文件,代码如下
kotlin复制代码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: 当访问需要验证的端点时,会提示输入账号密码。正确输入上文种配置的密码即可访问。

图片

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

图片

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

图片

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。