热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Zabbixagent2自定义插件获取https证书过期时间

微信公众号:运维开发故事,作者:wanger需求对经常维护网站的人来讲,是要经常跟https的证书打交道的,一般https证书的有效期在一年的时间,证书一旦过期,对公司的损失是非常




微信公众号:运维开发故事,作者:wanger



需求

对经常维护网站的人来讲,是要经常跟https的证书打交道的,一般https证书的有效期在一年的时间,证书一旦过期,对公司的损失是非常大的,去年网易邮箱因为https证书忘记续期,导致大量用户无法正常使用邮箱就是个很好的反例,我们也不能什么时候想起来才去手动查一下,这样也不现实,最好的方法是把过期时间监控起来,距离一定期限自动发送通知,可以使用zabbix或者Prometheus的ssl_exporter来进行监控,在zabbix4.4版本以前可以使用自定义脚本的方式,在4.4之后出现了zabbix-agent2,除了官方自带的插件也可以通过自定义插件的方式来满足我们的监控需求,那么接下来就给大家介绍如何使用zabbix-agent2自定义插件来实现获取https证书过期时间的需求。


zabbix-agent2自定义https_expire插件

之前问们已经介绍过如何使用自定义插件来实现对mqtt的监控,原文地址https://mp.weixin.qq.com/s/4e6WnFyjXZYnXphx2erkGw,只不过当时使用的Watcher接口来将新数据主动push给server端,这次将通过实现Exporter接口来采集数据,这里再次提供下官方文档https://www.zabbix.com/documentation/current/manual/config/items/plugins和Zabbix认证专家米宏翻译的官方博文https://mp.weixin.qq.com/s/7JLuVdZYX719pgGSP3xc9w
这里我再介绍一下自定义插件的一些标准规范
1. 插件必须导入zabbix.com/pkg/plugin软件包。

import "zabbix.com/pkg/plugin"

1. 插件必须定义结构并嵌入该plugin.Base结构。

type Plugin struct {
plugin.Base
}
var impl Plugin

1. 一个插件必须实现一个或多个插件接口。

func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (result interface{}, err error) {
if len(params) > 0 {
p.Debugf("received %d parameters while expected none", len(params))
return nil, errors.New("Too many parameters")
}
return time.Now().Format(time.RFC3339)
}

1. 插件必须在初始化期间注册自己。

func init() {
plugin.RegisterMetrics(&impl, "Time", "system.time", "Returns time string in RFC 3999 format.")
}

ssl_expire代码不多,插件由尼古拉·拖拉基斯基·王二编写,完整代码可以去github查看

func (p *Plugin) Configure(global *plugin.GlobalOptions, options interface{}) {
if err = conf.Unmarshal(options, &p.options); err != nil {
p.Errf("cannot unmarshal configuration options: %s", err)
}
if p.options.Timeout == 0 {
p.options.Timeout = global.Timeout
}
p.client = newClient(p.options.Timeout)
}
func (p *Plugin) Validate(options interface{}) error {
return conf.Unmarshal(options, &opts)
}
func checkParamnums(params []string) error {
if len(params) > paramnums {
err:=errors.New("Too many parameters.")
return zbxerr.ErrorTooFewParameters.Wrap(err)
} else if len(params) ==0 {
err:=errors.New("Missing URL parameters.")
return zbxerr.ErrorTooFewParameters.Wrap(err)
}
return nil
}
func checkParams(params []string) (string, error) {
if strings.HasPrefix(params[0], "http://") {
errorsting:=fmt.Sprintf("Target is using http scheme: %s", params[0])
err:=errors.New(errorsting)
return "",zbxerr.ErrorInvalidParams.Wrap(err)
}
if !strings.HasPrefix(params[0], "https://") {
params[0] = "https://" + params[0]
}
return string(params[0]),nil
}
func (cli *client) Query(url string) (int64, error) {
resp, err := cli.client.Get(url)
if err != nil {
impl.Debugf("cannot fetch data: %s", err)
err:=errors.New("cannot fetch data")
return 0, zbxerr.ErrorCannotFetchData.Wrap(err)
}
defer resp.Body.Close()
certInfo:=resp.TLS.PeerCertificates[0]
expiredays:=(certInfo.NotAfter.Unix()-time.Now().Unix())/60/60/24
return expiredays,nil
}
// Export implements the Exporter interface.
func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (interface{}, error) {
if err = checkParamnums(params); err != nil {
return nil, err
}
urls,err:= checkParams(params)
if err!= nil {
return nil,err
}
body, err := p.client.Query(urls)
if err!=nil{
return nil, err
}
return body,nil
}
func init() {
plugin.RegisterMetrics(&impl, pluginName,
"https_expire", "Returns the number of days between the HTTPS certificate expiration time and the current date.")
}

下载zabbix agent2源码并将自定义插件编译

yum install golang
git clone https://git.zabbix.com/scm/zbx/zabbix.git --depth 1 zabbix-agent2
cd zabbix-agent2
git submodule add https://github.com/cxf210/ssl_expire.git src/go/plugins/https_expire

导入https_expire插件

vi src/go/plugins/plugins_linux.go

添加最后一行

_ "zabbix.com/plugins/ceph"
_ "zabbix.com/plugins/docker"
_ "zabbix.com/plugins/kernel"
_ "zabbix.com/plugins/log"
_ "zabbix.com/plugins/memcached"
_ "zabbix.com/plugins/modbus"
_ "zabbix.com/plugins/mqtt"
_ "zabbix.com/plugins/mysql"
_ "zabbix.com/plugins/net/netif"
_ "zabbix.com/plugins/net/tcp"
...
_ "zabbix.com/plugins/https_expire"

编译安装zabbix agent2

yum install automake autoconf pcre* -y
./bootstrap.sh
pushd .
cd src/go/
go mod vendor
popd
./configure --enable-agent2 --enable-static
make install

编辑配置文件

这里我调整了日志级别,方便前台调试
可选参数
Plugins.Https_expire.Timeout = 5

egrep -v "^$|^#" conf/zabbix_agent2.conf
LogType=console
LogFile=/tmp/zabbix_agent2.log
DebugLevel=4
Server=172.17.0.5
Plugins.Https_expire.Timeout=5
Hostname=node2
COntrolSocket=/tmp/agent.sock

启动Zabbix_agent2

cd /root/zabbix_agent/src/go/bin
zabbix_agent2 -c conf/zabbix_agent2.conf

![image.png](https://www.icode9.com/i/ll/?i=img_convert/01e581803e6800e564773504acd5a50d.png#align=left&display=inline&www.xyzabbix.cn"]

https_expire["https://www.xyzabbix.cn"]

![image.png](https://www.icode9.com/i/ll/?i=img_convert/d1fe529aa9654569c15a7e152c271045.png#align=left&display=inline&height=336&margin=[object Object]&name=image.png&originHeight=672&originWidth=930&size=46093&status=done&style=none&width=465)
查看最新数据,这个证书还有四十天过期
![image.png](https://www.icode9.com/i/ll/?i=img_convert/532389a54e779e6c31ee9a228b2d950a.png#align=left&display=inline&height=80&margin=[object Object]&name=image.png&originHeight=159&originWidth=1625&size=15012&status=done&style=none&width=812.5)
我是用的阿里云ssl证书,可以看到确实离过期时间还有四十天,今天是2021.3.7
![image.png](https://www.icode9.com/i/ll/?i=img_convert/a9e0059914c661a2288c57a573f193b2.png#align=left&display=inline&height=118&margin=[object Object]&name=image.png&originHeight=236&originWidth=1497&size=21620&status=done&style=none&width=748.5)
可以创建一个触发器,在还有一个月的时候发送报警通知
![image.png](https://www.icode9.com/i/ll/?i=img_convert/7921a39a29c3807bfbde3372e13b2f02.png#align=left&display=inline&height=302&margin=[object Object]&name=image.png&originHeight=603&originWidth=949&size=40242&status=done&style=none&width=474.5)



推荐阅读
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • com.hazelcast.config.MapConfig.isStatisticsEnabled()方法的使用及代码示例 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 未定义的打字稿记录:探索其成因与解决方案 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 深入浅出 webpack 系列(二):实现 PostCSS 代码的编译与优化
    在前一篇文章中,我们探讨了如何通过基础配置使 Webpack 完成 ES6 代码的编译。本文将深入讲解如何利用 Webpack 实现 PostCSS 代码的编译与优化,包括配置相关插件和加载器,以提升开发效率和代码质量。我们将详细介绍每个步骤,并提供实用示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
author-avatar
dmcm0007
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有