Zabbix で SSL 証明書の有効期限を監視してみる

こんにちは。
このサイトは Let’s Encrypt で証明書を取得して cron で自動更新しているんですが、昨日にサイトを確認すると証明書の期限が切れておりました。
原因を調べたところ certbot が正常に動作しなくなっておりまして、どうも先日に yum update を行った際にパッケージのバージョン関連で不整合が発生していたようです。
※こちらは pyOpenSSL を yum 管理ではなく、pip 管理にすることで解決しました。

今後も同様のことが発生した時に気づけるように Zabbix で証明書の期限を監視してみます。

外部スクリプト

証明書の情報諸々は openssl s_client で取得できるので、これの出力を整形/計算して証明書の残り期限を出力させるスクリプトを用意します。

#!/bin/bash

DOMAIN=$1
TODAY=$(date "+%Y%m%d")

PREVALIDDAY=$(echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -enddate | awk  -F '=' '{print $2}')
expr \( `date -d"$PREVALIDDAY" +%s` - `date -d"$TODAY" +%s` \) / 86400

後で汎用的に利用できるZabbixテンプレートを作成するので、監視する証明書のコモンネームを第一引数に指定できるようにしてます。
※CLIから実行するとこんな感じ ↓
[root@sanuki-zab50 externalscripts]# ./ssl-check.sh fingerease.work
89

Zabbix には外部スクリプトの出力結果を取り込む機能があるので、こちらのスクリプトを Zabbix サーバの下記ディレクトリ以下に ssl-check.sh という名称で配置します。
[root@sanuki-zab50 externalscripts]# pwd && ls
/usr/lib/zabbix/externalscripts
ssl-check.sh

テンプレート

Zabbix の WEB UI から証明書期限監視用のテンプレートを作成します。
※今回は S_Template_ssl_check という名称のテンプレートを作成します。

アイテム

キーに先程作成したスクリプトの名称と第一引数(証明書のコモンネーム)をマクロで指定できるように記述しておきます。

名前:cert valid days
タイプ:外部チェック
キー:ssl-check.sh[“{$DOMAIN}”]
データ型:数値(整数)

トリガー

トリガーには証明書の期限が「何日以内」となった場合にアラートを飛ばすか汎用的に設定できるよう、{$THRES} というマクロを用意しておきます。

名前:{$DOMAIN} の証明書期限が残り{$THRES}日です
条件式:{S_Template_ssl_check:ssl-check.sh[“{$DOMAIN}”].last()}<{$THRES}

監視

あとはホストを作成してマクロに監視対象のコモンネーム、監視閾値を入力すればOKです。

↓こんな感じ

{$DOMAIN} → fingerease.work
{$THRES} → 7

Zabbixを使うと割となんでも監視/グラフ化することができますね。