對常常維護網站的人來講,要常常跟https的證書打交道。通常https證書的有效期是一年,證書一旦過時,公司的損失會很是大。去年網易郵箱由於https證書忘記續期,致使大量用戶沒法正常使用郵箱就是個典型案例。何時想起來纔去手動查一下也不現實,最好的方法是把過時時間監控起來,距離必定期限自動發送通知。
node
可使用Zabbix或者Prometheus的ssl_exporter來進行監控,在Zabbix4.4版本之前可使用自定義腳本的方式,在Zabbix4.4以後出現了zabbix-agent2,除了官方自帶的插件也能夠經過自定義插件的方式來知足咱們的監控需求。本文介紹如何使用zabbix-agent2自定義插件來實現獲取https證書過時時間的需求。mysql
以前介紹過如何使用自定義插件來實現對mqtt的監控,只不過當時使用的Watcher接口來將新數據主動push給server端,此次將經過實現Exporter接口來採集數據,再次提供官方文檔和Zabbix認證專家米宏翻譯的官方博文。
這裏我再介紹一下自定義插件的一些標準規範 linux
import "zabbix.com/pkg/plugin"
type Plugin struct { plugin.Base } var impl Plugin
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) }
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.") }
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
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"
yum install automake autoconf pcre* -y ./bootstrap.sh pushd . cd src/go/ go mod vendor popd ./configure --enable-agent2 --enable-static make install
這裏我調整了日誌級別,方便前臺調試 可選參數 git
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
cd /root/zabbix_agent/src/go/bin zabbix_agent2 -c conf/zabbix_agent2.conf
鍵值示例以下github
https_expire["www.xyzabbix.cn"]
或golang
https_expire["https://www.xyzabbix.cn"]
查看最新數據,這個證書還有四十天過時sql
我是用的阿里雲ssl證書,能夠看到確實離過時時間還有四十天,今天是2021.3.7docker
能夠建立一個觸發器,在還有一個月的時候發送報警通知。bootstrap