一、介绍
由于项目中使用的仍然是比较老旧的1.5.6版本,所以本文是基于此版本进行描述。
二、Actuator使用
ActuatorActuator是Spring Boot提供的对应用系统的监控和管理的集成功能,可以查看应用配置的详细信息,例如自动化配置信息、创建的Spring beans信息、系统环境变量的配置信以及Web请求的详细信息等。如果使用不当或者一些不经意的疏忽,可能造成信息泄露等严重的安全隐患。
Actuator是Springboot提供的用来对应用系统进行自省和监控的功能模块,借助于Actuator开发者可以很方便地对应用系统某些监控指标进行查看、统计等。
Actuator 的核心是端点 Endpoint,它用来监视应用程序及交互,spring-boot-actuator 中已经内置了非常多的 Endpoint(health、info、beans、metrics、httptrace、shutdown等等),同时也允许我们自己扩展自己的 Endpoints。每个 Endpoint 都可以启用和禁用。要远程访问 Endpoint,还必须通过 JMX 或 HTTP 进行暴露,大部分应用选择HTTP。
Actuator应用监控使用只需要添加spring-boot-starter-actuator依赖即可,如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
如果请求接口不做任何安全限制,会有很大的安全隐患,审计也不过关。
一般我们的配置方式如下:
#先禁用所有endpoint
endpoints.enabled = false
#按需要开启部分endpoint
endpoints.metrics.enabled = true
endpoints.dump.enabled= true
另外也可以引入spring-boot-starter-security依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
在application.properties中指定actuator的端口以及开启security功能,配置访问权限验证,这时再访问actuator功能时就会弹出登录窗口,需要输入账号密码验证后才允许访问。
management.port=8099 management.security.enabled=true security.user.name=admin security.user.password=admin
安全建议
在使用Actuator时,不正确的使用或者一些不经意的疏忽,就会造成严重的信息泄露等安全隐患。在代码审计时如果是springboot项目并且遇到actuator依赖,则有必要对安全依赖及配置进行复查。也可作为一条规则添加到黑盒扫描器中进一步把控。
安全的做法是一定要引入security依赖,打开安全限制并进行身份验证。同时设置单独的Actuator管理端口并配置不对外网开放。
三、2.x与1.x
需要注意的是,Spring Boot 2.0 相对于上个版本, Actuator 发生很多变化,keys 的配置改变如下:
四、源码相关
参考:Springboot Actuator之七:actuator 中原生endpoint源码解析1 - 走看看
五、查看所有可配置的endpoints
Actuator监控分成两类:原生端点和用户自定义扩展端点,原生的主要有:
路径 | 描述 |
/loggers | 查看所有的日志级别,不同包的级别。默认的日志级别为 另外,可动态修改日志的打印级别 |
/shutdown | 关闭应用程序,要求endpoints.shutdown.enabled设置为true 需要关闭,否则可否以远程关闭服务 |
/env | 获取全部环境属性,如操作系统信息(什么操作系统,什么版本等),虚拟机信息(名称、版本、厂商等),java版本,类路径,用户信息,系统域信息(容易暴露公司信息),第三方服务信息(如数据库连接地址,redis地址等,很敏感),IP地址(很敏感)。 总之一句话,env绝对要关闭 |
/configprops | 描述配置属性(包含默认值)如何注入Bean。 容易暴露ip地址,eureka地址,endpoints哪些可访问等 需要关闭,否则可能基于此接口间接获取到其它的信息 |
/heapdump | 访问/heapdump 路径,返回 GZip 压缩 hprof 堆转储文件。在 Android studio 打开,会泄露站点内存信息,很多时候会包含后台用户的账号密码(包含漏洞的图片暂时没得,大家记住思路就好了..),通过泄露的账号密码,然后进入后台一番轰炸也不错的。 |
/trace | 通过访问/trace路径,可获取用户认证字段信息,如token,cookie 等重要权限验证信息 需要关闭,否则可能暴露用户的token或cookie等权限验证信息 |
/dump | 获取线程活动的快照 |
/info | 获取应用程序的定制信息,这些信息由info打头的属性提供 一般不配置为空 |
/health | 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供 |
/mappings | 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系 非必要也不要打开,黑客可攻击写相关的接口(如果权限验证不当就惨了) |
/metrics | 报告各种应用程序度量信息,比如内存用量和HTTP请求计数 |
/autoconfig | 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过 |
/beans | 描述应用程序上下文里全部的Bean,以及它们的关系 |
六、prometheus对应的endpoint
endpoints.prometheus.enabled=true
endpoint是可以自定义的,springboot对接prometheus用的就是自定义endpoint的原理,如下:
因此我们同样可以用正常endpoint开启和关闭的方式进行配置。
注意,如果我们配置了关闭endpoint,则需要显示配置去打开prometheus这个endpoint,配置方式如下:
七、动态修改日志级别
如下案例所示:
将com.iqiyi.hubble.auth.service.impl.UserAuthResServiceImpl类的日志级别修改成DEBUG
参考: