微服务作为一项在云中部署应用和服务的新技术是当下比较热门话题,而微服务的特点决定了功能模块的部署是分布式的,运行在不同的机器上相互通过服务调用进行交互,业务流会经过多个微服务的处理和传递,在这种框架下,微服务的监控显得尤为重要。
而Actuator正是Spring Boot提供的对应用系统的监控和管理的集成功能,可以查看应用配置的详细信息,例如自动化配置信息、创建的Spring beans信息、系统环境变量的配置信以及Web请求的详细信息等。如果使用不当或者一些不经意的疏忽,可能造成信息泄露等严重的安全隐患。
Actuator应用监控使用只需要添加spring-boot-starter-actuator依赖即可,如下:
org.springframework.boot spring-boot-starter-actuator
可以在application.properties中指定actuator的访问路径,如指定路径为/monitor:
management.context-path=/monitor
此时,运行示例,访问/monitor/env即可查看系统环境变量的配置信息,之后再访问/monitor/trace即可查看所有Web请求的详细信息,包括请求方法、路径、时间戳以及请求和响应的头信息甚至cookie信息,如图:
Actuator监控分成两类:原生端点和用户自定义扩展端点,原生的主要有:
路径 | 描述 |
---|---|
/autoconfig | 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过 |
/beans | 描述应用程序上下文里全部的Bean,以及它们的关系 |
/env | 获取全部环境属性 |
/configprops | 描述配置属性(包含默认值)如何注入Bean |
/dump | 获取线程活动的快照 |
/health | 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供 |
/info | 获取应用程序的定制信息,这些信息由info打头的属性提供 |
/mappings | 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系 |
/metrics | 报告各种应用程序度量信息,比如内存用量和HTTP请求计数 |
/shutdown | 关闭应用程序,要求endpoints.shutdown.enabled设置为true |
/trace | 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等) |
如果上述请求接口不做任何安全限制,安全隐患显而易见。实际上Spring Boot也提供了安全限制功能。比如要禁用/env接口,则可设置如下:
endpoints.env.enabled= false
如果只想打开一两个接口,那就先禁用全部接口,然后启用需要的接口:
endpoints.enabled = false endpoints.metrics.enabled = true
另外也可以引入spring-boot-starter-security依赖
org.springframework.boot
spring-boot-starter-security
在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管理端口并配置不对外网开放。
参考:spring-boot-starter-actuator监控接口详解 - 简书
根据应用依赖和配置自动创建出来的监控和管理端点。通过这些端点,我们可以实时获取系统应用的各项监控指标。
org.springframework.boot
spring-boot-starter-actuator
#spring-boot-actuator配置
#开放所有的web Endpoints
management.endpoints.web.exposure.include=*
通过访问:http://localhost:8082/actuator,获取监控端点详细信息
字符串格式化:
{
"_links":{
"self":{
"href":"http://localhost:8082/actuator",
"templated":false
},
"archaius":{
"href":"http://localhost:8082/actuator/archaius",
"templated":false
},
"auditevents":{
"href":"http://localhost:8082/actuator/auditevents",
"templated":false
},
"beans":{
"href":"http://localhost:8082/actuator/beans",
"templated":false
},
"caches-cache":{
"href":"http://localhost:8082/actuator/caches/{cache}",
"templated":true
},
"caches":{
"href":"http://localhost:8082/actuator/caches",
"templated":false
},
"health":{
"href":"http://localhost:8082/actuator/health",
"templated":false
},
"health-component":{
"href":"http://localhost:8082/actuator/health/{component}",
"templated":true
},
"health-component-instance":{
"href":"http://localhost:8082/actuator/health/{component}/{instance}",
"templated":true
},
"conditions":{
"href":"http://localhost:8082/actuator/conditions",
"templated":false
},
"configprops":{
"href":"http://localhost:8082/actuator/configprops",
"templated":false
},
"env":{
"href":"http://localhost:8082/actuator/env",
"templated":false
},
"env-toMatch":{
"href":"http://localhost:8082/actuator/env/{toMatch}",
"templated":true
},
"info":{
"href":"http://localhost:8082/actuator/info",
"templated":false
},
"loggers":{
"href":"http://localhost:8082/actuator/loggers",
"templated":false
},
"loggers-name":{
"href":"http://localhost:8082/actuator/loggers/{name}",
"templated":true
},
"heapdump":{
"href":"http://localhost:8082/actuator/heapdump",
"templated":false
},
"threaddump":{
"href":"http://localhost:8082/actuator/threaddump",
"templated":false
},
"metrics-requiredMetricName":{
"href":"http://localhost:8082/actuator/metrics/{requiredMetricName}",
"templated":true
},
"metrics":{
"href":"http://localhost:8082/actuator/metrics",
"templated":false
},
"scheduledtasks":{
"href":"http://localhost:8082/actuator/scheduledtasks",
"templated":false
},
"httptrace":{
"href":"http://localhost:8082/actuator/httptrace",
"templated":false
},
"mappings":{
"href":"http://localhost:8082/actuator/mappings",
"templated":false
},
"refresh":{
"href":"http://localhost:8082/actuator/refresh",
"templated":false
},
"features":{
"href":"http://localhost:8082/actuator/features",
"templated":false
},
"service-registry":{
"href":"http://localhost:8082/actuator/service-registry",
"templated":false
}
}
}
spring-boot-starter-actuator模块生成的原生监控端点,分为三大类:
以上三类监控端点的详细信息,下面我们详细来说明。
1./shutdown: 该端点用来实现关闭应用的远程操作,需要配置属性endpoints.shutdown.enable=true才能实现。该操作非常危险,不建议使用。