列| zabbix-agent2カスタムプラグインを使用してhttps証明書の有効期限を取得します

要求する

Webサイトを頻繁に管理している人は、https証明書を頻繁に処理する必要があります。通常、https証明書の有効期間は1年です。証明書の有効期限が切れると、会社は大きな損失を被ります。昨年、網易のメールボックスがhttps証明書の更新を忘れたため、多くのユーザーがメールボックスを正常に使用できなくなりました。これは典型的なケースです。考えたときに手動で確認するのは現実的ではありません。有効期限を監視し、一定期間後に自動的に通知を送信するのが最善の方法です。

ZabbixまたはPrometheusのssl_exporterを監視に使用できます。Zabbix4.4より前はカスタムスクリプトを使用できます。Zabbix4.4以降はzabbix-agent2が登場しました。公式プラグインに加えて、プラグインをカスタマイズすることもできます。監視のニーズを満たすために。この記事では、zabbix-agent2カスタムプラグインを使用して、https証明書の有効期限を取得する要件を達成する方法について説明します。

zabbix-agent2カスタムhttps_expireプラグイン

カスタムプラグインを使用してmqttを監視する方法を紹介しましたが、当時はWatcherインターフェースを使用して新しいデータをサーバーに積極的にプッシュしていました。今回は、Exporterインターフェースを実装してデータと公式ドキュメントを収集します。 Zabbix認定が再度提供されます。専門家のMiHongが翻訳した公式ブログ投稿。
ここでは、カスタムプラグインのいくつかの標準仕様を紹介します

1.プラグインをzabbix.com/pkg/pluginパッケージにインポートする必要があります。

import "zabbix.com/pkg/plugin"

2.プラグインは構造を定義し、plugin.Base構造を埋め込む必要があります。

type Plugin struct {
    plugin.Base
}
var impl Plugin

3.プラグインは、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)
}

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 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"

zabbixagent2をコンパイルしてインストールします

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

ここに画像の説明を挿入

Zabbixはモニタリングアイテムを作成します

キー値の例は次のとおりです

https_expire["www.xyzabbix.cn"]

または

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

ここに画像の説明を挿入

最新のデータを確認してください。この証明書の有効期限は40日です。
ここに画像の説明を挿入

私はAlibabaCloudのSSL証明書を使用しています。有効期限の40日前に実際にあることがわかります。今日は2021.3.7です。
ここに画像の説明を挿入

残り1か月のときに、アラーム通知を送信するトリガーを作成できます。
ここに画像の説明を挿入

おすすめ

転載: blog.51cto.com/15094852/2676621