Let's Encrypt や AWS Certificate Manager など、ここ数年で SSL/TLSサーバ証明書を無料で自動更新してくれるサービスが登場したこともあり、WEBサイトに HTTPS を導入する機会も増えてきたのではないでしょうか? サーバ証明書を自動更新してくれるのであれば、サーバ証明書の有効期限のチェックも自動化しておきたいものです。そこで今回は、Zabbix で SSL/TLSサーバ証明書の有効期限を監視する設定をメモしておきました。
サーバ証明書の有効期限取得スクリプトの作成
ます初めに、Zabbix から SSL/TLSサーバ証明書の有効期限を取得できるように、外部チェック用のスクリプトを作成します。
外部チェック用のスクリプトを置く場所は、Zabbixサーバの設定ファイルの ExternalScripts パラメーターで確認してください。Zabbixサーバをパッケージからインストールしている場合は「/usr/lib/zabbix/externalscripts」になっていると思います。
(略)
ExternalScripts=/usr/lib/zabbix/externalscripts
置く場所が確認できたらスクリプトを作成します。第一引数に指定したドメイン名(コモンネームとも呼びます)のサーバ証明書の情報を取得して、有効期限までの残り日数を返します。
sudo vi /usr/lib/zabbix/externalscripts/get_certificate_expiration.php
#!/usr/bin/php <?php # # SSL/TLSサーバ証明書の有効期限取得スクリプト # # チェックしたい証明書のドメイン名(コモンネーム)を第一引数に指定します。 # 有効期限までの残り日数を返します。 # $domain_name = $argv[1]; // ストリームコンテキストの作成 $context = array('ssl' => array('capture_peer_cert' => true)); $stream_context = stream_context_create($context); // リモートソケット接続の下準備 $resource = stream_socket_client( 'ssl://' . $domain_name . ':443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $stream_context ); // サーバ証明証情報の取得 $cont = stream_context_get_params($resource); // X509 証明書をパースし、配列として情報を返す $parsed = openssl_x509_parse($cont['options']['ssl']['peer_certificate']); // 証明証の有効期限(UNIXタイム) $validTo_time_t = $parsed['validTo_time_t']; // 有効期限までの残り秒数 $limit_sec = $validTo_time_t - time(); // 日に変換 $limit_day = $limit_sec / 60 / 60 / 24; // 小数点以下を切り捨てた値を、有効期限までの残り日数として返す echo floor($limit_day);
スクリプトは「PHP で外部サーバーの SSL サーバー証明書の有効期限を取得する | Qiita」の記事を参考にさせて頂きました。無駄のない素晴らしいコードなので、ほとんどコピペです(^^;)
スクリプトのオーナーを zabbix に変更して実行権限を付けます。
$ sudo chown zabbix:zabbix /usr/lib/zabbix/externalscripts/get_certificate_expiration.php
有効期限までの日数が取得できるか確認します。
サーバ証明書の有効期限監視テンプレートの作成
続いて、Zabbix の管理画面でテンプレートを作成します。このテンプレートのアイテムに先ほど作成した、サーバ証明書の有効期限取得スクリプトを登録します。
テンプレート名など、各種の名称は任意です。ご自身が分かりやすい名称を設定してください。
テンプレートの作成
[設定]→[テンプレート]→[テンプレートの作成]をクリックします。
[テンプレート]タブを選択 適当なテンプレート名とグループを入力または選択し、下の方にある「追加」ボタンをクリックしてテンプレートを作成します。
アイテムの作成
作成したテンプレートにアイテムを追加します。
[設定]→[テンプレート] 「My Template Certificate Expiration」行の「アイテム」をクリックします。
「アイテムの作成」をクリックします。
下記を設定し「追加」をクリックします。ドメイン名(コモンネーム)は、ユーザーマクロ「{$COMMON_NAME}」で指定します。
---(設定箇所)---------------------------
名前:サーバ証明証有効期限までの残日数
タイプ:外部チェック
キー:get_certificate_expiration.php[{$COMMON_NAME}]
更新間隔(秒):3600
アプリケーションの作成:certificate
------------------------------
トリガーの作成
サーバ証明証有効期限までの残日数が「30日以下」になったら、通知されるようにトリガーを作成します。
[設定]→[テンプレート] 「My Template Certificate Expiration」行の「トリガー」をクリックします。
「トリガーの作成」をクリックします。
下記を設定し「追加」をクリックします。
---(設定箇所)---------------------------
名前:{$COMMON_NAME} サーバ証明証有効期限までの残日数
条件式:{My Template Certificate Expiration:get_certificate_expiration.php[{$COMMON_NAME}].last()}<30
深刻度:警告
------------------------------
※表示の都合上、条件式が改行されているように見えますが、実際は1行で入力してください。条件式の Certificate と Expiration の間は半角スペースです。
以上で、サーバ証明書の有効期限監視テンプレートの完成です。このテンプレートをホストに適用して、有効期限までの日数を取得してみます。
ホストの作成とテンプレートの適用
今回は、確認用にサーバ証明書の有効期限監視テンプレートを適用するだけのホストを作成しますが、すでに作成済みのホストに、テンプレートとユーザーマクロ「{$COMMON_NAME}」を追加しても、もちろん構いません。
[設定]→[ホスト]→[ホストの作成] をクリックします。
「ホスト」タブを選択し、適当なホスト名とグループ名を入力します。監視するドメイン名(コモンネーム)は、ユーザーマクロで指定するので、IPアドレスはそのままでOKです。
続いて「テンプレート」タブを選択し、「新規テンプレートをリンク」枠の「選択」をクリックします。
先ほど作成した「My Template Certificate Expiration」テンプレートにチェックを入れて「選択」ボタンをクリックします。
「新規テンプレートをリンク」枠の「追加」をクリックします。
「テンプレートとのリンク」枠に「My Template Certificate Expiration」が表示されればOKです。
最後にユーザーマクロを設定します。「マクロ」タブをクリックし、マクロに「{$COMMON_NAME}」、値に監視するドメイン名(コモンネーム)を入力して「追加」ボタンをクリックします。
以上でホストにテンプレートが適用されました。しばらく待って、有効期限までの日数が取得できていればOKです。
[監視データ]→[概要] グループ「Certificates」、タイプ「データ」を選択
おわりに
1つのホストに監視したいサーバ証明書が複数ある場合は、テンプレートの適用方法に悩むところですが、いっそのこと上のようにサーバ証明書のドメイン(コモンネーム)ごとに、ホストを作ってしまったほうが楽かもしれません。
コメント