需求

对经常维护网站的人来说,要经常跟https的证书打交道。一般https证书的有效期是一年,证书一旦过期,公司的损失会非常大。去年网易邮箱因为https证书忘记续期,导致大量用户无法正常使用邮箱就是个典型案例。什么时候想起来才去手动查一下也不现实,最好的方法是把过期时间监控起来,距离一定期限自动发送通知。

可以使用Zabbix或者Prometheus的ssl_exporter来进行监控,在Zabbix4.4版本以前可以使用自定义脚本的方式,在Zabbix4.4之后出现了zabbix-agent2,除了官方自带的插件也可以通过自定义插件的方式来满足我们的监控需求。本文介绍如何使用zabbix-agent2自定义插件来实现获取https证书过期时间的需求。

zabbix-agent2自定义https_expire插件

之前介绍过如何使用自定义插件来实现对mqtt的监控,只不过当时使用的Watcher接口来将新数据主动push给server端,这次将通过实现Exporter接口来采集数据,再次提供官方文档和Zabbix认证专家米宏翻译的官方博文。
这里我再介绍一下自定义插件的一些标准规范

1. 插件必须导入zabbix.com/pkg/plugin软件包。

import "zabbix.com/pkg/plugin"

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

type Plugin struct {    plugin.Base}var impl Plugin

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

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)}

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

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 golanggit clone https://git.zabbix.com/scm/zbx/zabbix.git --depth 1 zabbix-agent2cd zabbix-agent2git 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 = 5egrep -v "^$|^#" conf/zabbix_agent2.conf  LogType=consoleLogFile=/tmp/zabbix_agent2.logDebugLevel=4Server=172.17.0.5Plugins.Https_expire.Timeout=5Hostname=node2ControlSocket=/tmp/agent.sock

启动Zabbix_agent2

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

Zabbix创建监控项

键值示例如下

https_expire["www.xyzabbix.cn"]

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

查看最新数据,这个证书还有四十天过期

我是用的阿里云ssl证书,可以看到确实离过期时间还有四十天,今天是2021.3.7

可以创建一个触发器,在还有一个月的时候发送报警通知。

©著作权归作者所有:来自51CTO博客作者Zabbix中国的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Windows下添加Zscaler CA根证书到Python,解决Pip SSL访问报错问题
  2. 轻松集成HMS CGKit体积云实现云海仙境
  3. vscode的使用配置以及markdown常用语法
  4. markdown语法和Emmet插件的使用
  5. Vscode的下载安装和必备插件的使用与Markdown、Emmet的语法简介
  6. LNMP架构应用实战——PHP扩展及缓存插件安装
  7. php第一课vscode安装
  8. Linux学习--第14周
  9. Logstash 之 重要插件

随机推荐

  1. 无法使用@ContextConfiguration加载Appli
  2. XML验证 - 使用多个xsd
  3. 在网页程序或Java程序中调用接口实现短信
  4. 抽象批处理SFTP多目的地和自动重试
  5. java漏洞成黑客目标微软呼吁用户更新软件
  6. Thread.currentThread().getName() 和 th
  7. 算法 - 给出一个字符串str,输出包含两个
  8. JavaScript unshift()函数移入数据到数组
  9. 《JavaScript 高级程序设计》学习总结六(1
  10. OSGi 学习之路(4) - osgi的模块化 java在模