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を使うと割となんでも監視/グラフ化することができますね。

【チラ裏】SSL(TLS)証明書関連【openssl】

SSL(というかTLS)証明書関連ですね。
いつもどおりのチラ裏です。

証明書の整合性確認

# 秘密鍵
openssl rsa -noout -text -in test.com.key
# 証明書
openssl x509 -noout -text -in test.com.crt
# 中間証明書
openssl x509 -noout -text -in test.com.ca

・秘密鍵、証明書の「Modules」の値が同じであること
・証明書のIssuer:CNと中間証明書のSubject:CNが同じであること

秘密鍵、CSR作成

# 秘密鍵作成
openssl genrsa -aes256 2048 > test.com.key

# CSR作成
openssl req -new -key test.com.key -out test.com.csr
=========================================================
Country Name:
ISOによる2文字の国名の符号
→JP

State or Province Name:
都道府県名
→Osaka

Locality Name:
市区町村名
→Osaka

Organization Name:
組織名
→test,Co.,Ltd.

Organizational Unit Name:
部署名
→test

Common Name:
→test.com

その他便利なopenssl

# CSRの内容確認
openssl req -noout -text -in test.com.csr

# Keyファイルの確認
openssl rsa -noout -check -in test.com.key
RSA key ok

# CSRとKeyファイルの比較
openssl rsa -in test.com.key -text
openssl req -in test.com.csr -text
⇒mosulusの値を比較し、差異が無いことを確認

# 秘密鍵のパスフレーズを解除
openssl rsa -in test.com.key -out test.com.key
openssl rsa -in test.com -text