基于SpringBoot应用监控Actuator安全隐患及解决方式

 更新时间:2021年07月23日 10:15:44   作者:lucky jaler  
这篇文章主要介绍了SpringBoot应用监控Actuator安全隐患及解决方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

概述

微服务作为一项在云中部署应用和服务的新技术是当下比较热门话题,而微服务的特点决定了功能模块的部署是分布式的,运行在不同的机器上相互通过服务调用进行交互,业务流会经过多个微服务的处理和传递,在这种框架下,微服务的监控显得尤为重要。

而Actuator正是Spring Boot提供的对应用系统的监控和管理的集成功能,可以查看应用配置的详细信息,例如自动化配置信息、创建的Spring beans信息、系统环境变量的配置信息以及Web请求的详细信息等。

如果使用不当或者一些不经意的疏忽,可能造成信息泄露等严重的安全隐患。

Actuator使用

Actuator应用监控使用只需要添加spring-boot-starter-actuator依赖即可,如下:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

可以在application.properties中指定actuator的访问端口、访问路径等信息:

# 访问示例:http://localhost:9595/monitor
management:
  endpoints:
    web:
      # actuator的访问路径,替换默认/actuator
      base-path: /monitor
      # 设置是否暴露端点 默认只有health和info可见
      exposure:
        # include: env   # 方式1: 暴露端点env,配置多个以,隔开
        include: "*"     # 方式2: 包括所有端点,注意需要添加引号
        # 排除端点
        exclude: shutdown
  server:
    port: 9595  #新开监控端口,不和应用用同一个端口
  endpoint:
    health:
      show-details: always # 显示db、redis、rabbti连接情况等
    shutdown:
      enabled: true  #默认情况下,除shutdown以外的所有端点均已启用。手动开启

此时,运行示例,访问/monitor/即可查看所有端点信息,再访问/monitor/env即可查看该应用全部环境属性,如图:

Endpoints(端点)介绍

Endpoints 是 Actuator 的核心部分,它用来监视应用程序及交互,spring-boot-actuator中已经内置了非常多的Endpoints(health、info、beans、httptrace、shutdown等等),同时也允许我们扩展自己的端点。

Endpoints 分成两类:原生端点和用户自定义端点;自定义端点主要是指扩展性,用户可以根据自己的实际应用,定义一些比较关心的指标,在运行期进行监控。

原生端点是在应用程序里提供的众多 restful api 接口,通过它们可以监控应用程序运行时的内部状况。原生端点又可以分成三类:

  • 应用配置类:可以查看应用在运行期间的静态信息:例如自动配置信息、加载的spring bean信息、yml文件配置信息、环境信息、请求映射信息;
  • 度量指标类:主要是运行期间的动态信息,例如堆栈、请求连、一些健康指标、metrics信息等;
  • 操作控制类:主要是指shutdown,用户可以发送一个请求将应用的监控功能关闭。

Actuator 默认提供了以下接口,具体如下表所示:

ID

描述

默认启用

默认公开

auditevents 公开当前应用程序的审计事件信息 Yes No
beans 显示应用程序中所有Spring bean的完整列表 Yes No
conditions 显示在配置和自动配置类上评估的条件以及它们是否匹配的原因 Yes No
configprops 显示所有@ConfigurationProperties对照的列表 Yes No
env 从Spring的ConfigurableEnvironment中公开属性 Yes No
flyway 显示已应用的任何Flyway数据库迁移 Yes No
health 显示应用程序健康信息 Yes Yes
httptrace 显示HTTP跟踪信息(默认情况下,最后100个HTTP请求-响应交互) Yes No
info 显示任意应用程序信息 Yes Yes
loggers 显示和修改应用程序中记录器的配置 Yes No
liquibase 显示已应用的任何Liquibase数据库迁移 Yes No
metrics 显示当前应用程序的“指标”信息 Yes No
mappings 显示所有@RequestMapping路径对照的列表 Yes No
scheduledtasks 显示应用程序中调度的任务 Yes No
sessions 允许从Spring Session支持的会话存储中检索和删除用户会话 Yes No
shutdown 让应用程序优雅地关闭 No No
threaddump 执行线程转储 Yes No

安全措施

如果上述请求接口不做任何安全限制,安全隐患显而易见。实际上Spring Boot也提供了安全限制功能。比如要禁用/env接口,则可设置如下:

endpoint:
 env:
    enabled: false

另外也可以引入spring-boot-starter-security依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

在application.properties中开启security功能,配置访问权限验证,这时再访问actuator功能时就会弹出登录窗口,需要输入账号密码验证后才允许访问。

spring:
 security:
    user:
      password: 123456
      name: jaler

为了只对actuator功能做权限验证,其他应用接口不做认证,我们可以重新定制下SpringSecurity

package com.jaler.common.common.config; 
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
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;
 
@Configuration
@EnableWebSecurity
public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter {
 
  @Autowired
  Environment env;
 
  @Override
  protected void configure(HttpSecurity security) throws Exception { 
        String contextPath = env.getProperty("management.endpoints.web.base-path");
        if(StringUtils.isEmpty(contextPath)) {
            contextPath = "";
        }
        security.csrf().disable();
        security.authorizeRequests()
                .antMatchers("/**"+contextPath+"/**")
                .authenticated()
                .anyRequest()
                .permitAll()
                .and()
                .httpBasic(); 
     }
}

再次访问http://localhost:9595/monitor,此时需要进行权限验证,如下图:

安全建议

1.只开放某些无敏感信息的端点。

2.打开安全限制并进行身份验证,访问Actuator接口时需要登录。

3.Actuator访问接口使用独立端口,并配置不对外网开放。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用IntelliJ IDEA搭建SSM框架的图文教程

    使用IntelliJ IDEA搭建SSM框架的图文教程

    本文通过图文并茂的形式给大家介绍了使用IntelliJ IDEA搭建SSM框架的教程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • 在MyBatisPlus中使用@TableField完成字段自动填充的操作

    在MyBatisPlus中使用@TableField完成字段自动填充的操作

    这篇文章主要介绍了在MyBatisPlus中使用@TableField完成字段自动填充的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 一篇文章带你搞懂Java线程池实现原理

    一篇文章带你搞懂Java线程池实现原理

    线程池无论是工作还是面试都是必备的技能,但是很多人对于线程池的实现原理却一知半解,并不了解线程池内部的工作原理,今天就带大家一块剖析线程池底层实现原理
    2022-11-11
  • SpringBoot实战之处理异常案例详解

    SpringBoot实战之处理异常案例详解

    这篇文章主要介绍了SpringBoot实战之处理异常案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • JAVA的LIST接口的REMOVE重载方法调用原理解析

    JAVA的LIST接口的REMOVE重载方法调用原理解析

    这篇文章主要介绍了JAVA的LIST接口的REMOVE重载方法调用原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java8 将一个List<T>转为Map<String,T>的操作

    Java8 将一个List<T>转为Map<String,T>的操作

    这篇文章主要介绍了Java8 将一个List<T>转为Map<String, T>的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 通过JDK源码学习InputStream详解

    通过JDK源码学习InputStream详解

    InputStream抽象类是所有字节输入流的类的超类。这篇文章主要给大家介绍了关于通过JDK源码学习InputStream的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • spring boot异步(Async)任务调度实现方法

    spring boot异步(Async)任务调度实现方法

    在没有使用spring boot之前,我们的做法是在配置文件中定义一个任务池,然后将@Async注解的任务丢到任务池中去执行,那么在spring boot中,怎么来实现异步任务的调用了,下面通过本文给大家讲解,需要的朋友参考下
    2018-02-02
  • 二叉搜索树实例练习

    二叉搜索树实例练习

    一棵二叉查找树是按二叉树结构来组织的。这样的树可以用链表结构表示,其中每一个结点都是一个对象
    2012-11-11
  • 关于Mybatis的@param注解及多个传参

    关于Mybatis的@param注解及多个传参

    这篇文章主要介绍了关于Mybatis的@param注解及多个传参,@Param的作用就是给参数命名,比如在mapper里面某方法A(int id),当添加注解后A(@Param(“userId”) int id),也就是说外部想要取出传入的id值,只需要取它的参数名userId就可以了,需要的朋友可以参考下
    2023-05-05

最新评论