Zabbix サーバ証明書の有効期限の監視設定メモ

Zabbix
Zabbix
スポンサーリンク

Let's Encrypt や AWS Certificate Manager など、ここ数年で SSL/TLSサーバ証明書を無料で自動更新してくれるサービスが登場したこともあり、WEBサイトに HTTPS を導入する機会も増えてきたのではないでしょうか? サーバ証明書を自動更新してくれるのであれば、サーバ証明書の有効期限のチェックも自動化しておきたいものです。そこで今回は、Zabbix で SSL/TLSサーバ証明書の有効期限を監視する設定をメモしておきました。

サーバ証明書の有効期限取得スクリプトの作成

ます初めに、Zabbix から SSL/TLSサーバ証明書の有効期限を取得できるように、外部チェック用のスクリプトを作成します。

外部チェック用のスクリプトを置く場所は、Zabbixサーバの設定ファイルの ExternalScripts パラメーターで確認してください。Zabbixサーバをパッケージからインストールしている場合は「/usr/lib/zabbix/externalscripts」になっていると思います。

$ sudo grep ExternalScripts /etc/zabbix/zabbix_server.conf
(略)
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 chmod 700 /usr/lib/zabbix/externalscripts/get_certificate_expiration.php
$ sudo chown zabbix:zabbix /usr/lib/zabbix/externalscripts/get_certificate_expiration.php

有効期限までの日数が取得できるか確認します。

$ sudo -u 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つのホストに監視したいサーバ証明書が複数ある場合は、テンプレートの適用方法に悩むところですが、いっそのこと上のようにサーバ証明書のドメイン(コモンネーム)ごとに、ホストを作ってしまったほうが楽かもしれません。

コメント

タイトルとURLをコピーしました