基于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访问接口使用独立端口,并配置不对外网开放。

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

(0)

相关推荐

  • 使用SpringBoot Actuator监控应用示例

    Actuator是Spring Boot提供的对应用系统的自省和监控的集成功能,可以对应用系统进行配置查看.相关功能统计等. 使用Actuator 引入依赖即可 Maven : <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> Gradl

  • 一文搞懂并学会使用SpringBoot的Actuator运行状态监控组件的详细教程

    目录闲言碎语:背景Actuator介绍Rest方法来查看Actuatorpom.xml引入Actuator依赖配置application.yml运行项目Actuator配合SpringBootSecurity配置application.xml运行项目配置关闭项目API端口配置application.yml命令行执行post关闭指令附:Actuator端口信息附:SpringBoot自带的健康指示器赠言 闲言碎语:   最近刷抖音,看到了星爷的很多电影,感叹星爷给后世留下了很多的经典作品,我就在想

  • SpringBoot 监控管理模块actuator没有权限的问题解决方法

    SpringBoot 1.5.9 版本加入actuator依赖后,访问/beans 等敏感的信息时候报错,如下 Tue Mar 07 21:18:57 GMT+08:00 2017 There was an unexpected error (type=Unauthorized, status=401). Full authentication is required to access this resource. 肯定是权限问题了.有两种方式: 1.关闭权限:application.prop

  • springboot 使用Spring Boot Actuator监控应用小结

    微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了异常如何快速定位是哪个环节出现了问题? 在这种框架下,微服务的监控显得尤为重要.本文主要结合Spring Boot Actuator,跟大家一起分享微服务Spring Boot Actuator的常见用法,方便我们在日常中对我们的微服务进行监控治理. Actuator监控 Spring Boot使用"习惯优于配置的理念",采用包

  • SpringBoot配置Actuator组件,实现系统监控

    目录 一.Actuator简介 二.与SpringBoot2.0整合 1.核心依赖Jar包 2.Yml配置文件 三.监控接口详解 1.Info接口 2.Health接口 3.Beans接口 4.Conditions接口 5.HeapDump接口 6.Mappings接口 7.ThreadDump接口 8.ShutDown接口 四.源代码地址 一.Actuator简介 监控分类 Actuator 提供Rest接口,展示监控信息. 接口分为三大类: 应用配置类:获取应用程序中加载的应用配置.环境变量

  • Springboot actuator应用后台监控实现

    一 前言 springboot 额外的特色是提供了后台应用监控,可以通过 HTTP 或者 JMX的方式管理监控应用,本文主讲HTTP方式:其主要的功能是监控应用的健康状态,查看环境变量等: 二 pom.xml springboot 2.1.1,主要引入 actuator 依赖,web依赖用于测试: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-

  • 详解关于springboot-actuator监控的401无权限访问

    今天心血来潮看一下spring监控 访问/beans 等敏感的信息时候报错 Tue Mar 07 21:18:57 GMT+08:00 2017 There was an unexpected error (type=Unauthorized, status=401). Full authentication is required to access this resource. application.properties添加配置参数 management.security.enabled=

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

    概述 微服务作为一项在云中部署应用和服务的新技术是当下比较热门话题,而微服务的特点决定了功能模块的部署是分布式的,运行在不同的机器上相互通过服务调用进行交互,业务流会经过多个微服务的处理和传递,在这种框架下,微服务的监控显得尤为重要. 而Actuator正是Spring Boot提供的对应用系统的监控和管理的集成功能,可以查看应用配置的详细信息,例如自动化配置信息.创建的Spring beans信息.系统环境变量的配置信息以及Web请求的详细信息等. 如果使用不当或者一些不经意的疏忽,可能造成信

  • SpringBoot 指标监控actuator的专题

    目录 1.写在前面 2.SpringBoot Actuator 3.定制化Endpoint 3.1 定制health端点信息 3.2 定制info端点信息 1.写在前面 首先肯定要说一下SpringBoot的四大核心了: 自动装配:简单配置甚至零配置即可运行项目 起步依赖:场景启动器 Actuator:指标监控 命令行界面 :命令行 这篇文章呢,我来和大家聊聊指标监控这个东西. 2.SpringBoot Actuator 未来每一个微服务在云上部署以后,我们都需要对其进行监控.追踪.审计.控制等

  • 基于SpringBoot bootstrap.yml配置未生效的解决

    我就废话不多说了,大家还是直接看代码吧~ <!--需要引入该jar才能使bootstrap配置文件生效--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-context</artifactId> </dependency> 补充知识:SpringBoot不读取bootstrap.yml/properti

  • 基于spring boot 日志(logback)报错的解决方式

    记录一次报错解决方法: No converter found capable of converting from type [java.lang.String] to type [java.util.Map<java.lang.String, java.lang.String>] org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'logging.le

  • 基于Python3.7.1无法导入Numpy的解决方式

    开发环境:Pycharm 2018.3 + Anaconda3(5.3.0) + Python 3.7.1 + Numpy 1.15.4 在此环境下,我打算使用numpy模块的zeros方法创建一个空的二维List,却屡屡报错 Traceback (most recent call last): File "D:\Anaconda3\lib\site-packages\numpy\core\__init__.py", line 16, in <module> from .

  • SpringBoot跨域问题的五种解决方式

    目录 一.什么是跨域 CORS 二.为什么会有跨域问题 三.有哪些跨域类型 四.解决跨域问题的五种方式 1. 添加跨域配置类 2. 重写WebMvcConfigurer 3. 注解 @CrossOrigin 4. 自定义过滤器 5. 手动设置响应头 前后分离的跨域问题其他解决方案 Nginx服务器反向代理 或者直接在Nginx中进行配置 总结 一.什么是跨域 CORS 当一台服务器资源从另一台服务器(不同 的域名或者端口)请求一个资源或者接口,就会发起一个跨域 HTTP 请求. 举个简单的例子,

  • SpringBoot实现监控Actuator,关闭redis监测

    目录 SpringBoot监控Actuator,关闭redis监测 方法 springboot Actuator 查看配置明细 运行时度量 SpringBoot监控Actuator,关闭redis监测 方法 当我们导入了spring-boot-starter-actuator这个依赖后, SpringBoot会默认去监测一些信息.其中就包括redis. 会根据redis的默认初始配置, localhost:6379 尝试连接redis.如果我们没有用到redis, 启动就会报错 <depende

  • 基于spring-boot和docker-java实现对docker容器的动态管理和监控功能[附完整源码下载]

    docker简介 Docker 是一个开源的应用容器引擎,和传统的虚拟机技术相比,Docker 容器性能开销极低,因此也广受开发者喜爱.随着基于docker的开发者越来越多,docker的镜像也原来越丰富,未来各种企业级的完整解决方案都可以直接通过下载镜像拿来即用.因此docker变得越来越重要. 本文目的 本文通过一个项目实例来介绍如果通过docker对外接口来实现对docker容器的管理和监控. 应用场景: 对服务器资源池通过docker进行统一管理,按需分配资源和创建容器,达到资源最大化利

  • 用SpringBoot Admin监控SpringBoot程序

    项目源码地址:https://github.com/laolunsi/spring-boot-examples/tree/master/02-spring-boot-admin-demo 一.SpringBoot Admin概要 SpringBoot Admin用于监控SpringBoot程序,一个SpringBoot程序通过向SpringBoot Admin Server注册或使用@DiscoveryClient等微服务方式,可以将自身注册到SpringBoot Admin Server. S

  • 聊一聊SpringBoot服务监控机制

    前言 任何一个服务如果没有监控,那就是两眼一抹黑,无法知道当前服务的运行情况,也就无法对可能出现的异常状况进行很好的处理,所以对任意一个服务来说,监控都是必不可少的. 就目前而言,大部分微服务应用都是基于 SpringBoot 来构建,所以了解 SpringBoot 的监控特性是非常有必要的,而 SpringBoot 也提供了一些特性来帮助我们监控应用. 本文基于 SpringBoot 2.3.1.RELEASE 版本演示. SpringBoot 监控 SpringBoot 中的监控可以分为 H

随机推荐