SSL証明書やドメイン有効期限をSlack経由で監視

シンプル監視(さくらのクラウドのアプライアンス機能)を使えば、コントロールパネルの簡単な操作でウェブサーバやメールサーバなどの状況を監視できます。状況に変化があればメールまたはSlack で通知を受け取れます。さらに、実用的な監視の応用として、SSL 証明書やドメイン名の有効期限をシンプル監視でチェックする方法をご紹介します。

今回のお題は、シンプル監視

自分のウェブサイトが正常に動いているかどうかを把握するには、何らかの監視ツールの設定が欠かせません。なぜなら、サイトは24時間稼働するからです。人間が PC の画面に張り付いて、監視し続けるのは現実的ではありません。もしもそこに監視ツールがあれば、何らかの問題が発生してウェブが表示できなくなっても、誰かが気づくまでそのまま放置――という状況を避けられます。

サーバ監視をするには、かつては監視用のサーバを準備し、監視用のツールをセットアップする必要がありました。たとえ監視対象が個人で運用しているウェブサイトだとしてもです。また、商用サービスの環境が対象であれば、監視ツール自身の監視はどうするかという課題もありました。

監視サーバの準備や契約は不要

さくらのクラウドの「シンプル監視」は、インターネットを通してサーバの状態を監視するサービスです。サーバ上の各ポートの応答や、ウェブサイトの応答コードなどをインターネット側から定期的に監視します。そして、状況が変わればメールもしくは Slack の WebHook(ウェブフック)を通して通知できます。

「シンプル監視」は、すぐにご利用いただけます。さくらのクラウドのアカウントをお持ちであれば、コントロールパネルの「シンプル監視」のメニューから設定を済ますだけ。特別な契約は要りません。

さらに、監視対象のネットワークがさくらインターネットのサービス内であれば、無料で利用できます。もちろん、その他のネットワークの場合もご利用いただけます(1監視対象あたり21円/月)。料金に関する詳細は、料金のご案内ページをご覧ください。

Slack の WebHook 追加と情報確認

シンプル監視の通知先は「電子メール」と「Slack」に対応しています。メール通知の場合、問題の検出から通知まで、メール送信→受信 までのタイムラグが発生します。それに対し、Slack 通知の場合は 、状況が変化し次第 WebHook(ウェブフック)を通して、直ちに通知を受け取れます。

Slack 通知を使うには、あらかじめ Slack 上で WebHook の設定が必要です。設定をするには、Slack にログインします。それから通知したい Channel (チャンネル)を決め、必要があれば Channel を新設します。

そして、左上の設定メニューから【 Apps & integrations 】(アプリと統合)をクリックします。

次の画面の検索フォームで【 Incoming WebHooks 】を検索・クリックします。Incoming Webhooks(インカミング・ウェブフック)は、自分の Slack の Channel に Slack 外からメッセージを投稿する機能です。シンプル監視は JSON 形式のデータを特定の Slack 用の URL にリクエストします。

それから【 Add Configuration 】(設定の追加)をクリックします。画面が切り替わったら、投稿先の Channel を選択するか、【 create a new channel 】(新しいチャンネルの作成)を押して新しくチャンネルを作成します。選択が終わったら【 Add Incoming Webhooks Integration 】(着信ウェブフック統合の追加)をクリックします。

以上で Slack とシンプル監視を連携するための事前設定が完了です。次の画面を下にスクロールしてくと【 Webhook URL 】の項目が見えます。【 https://hooks.slack.com/services/<文字列> 】 の項目を、テキストエディタなどに控えておきます。あとでシンプル監視の通知先として使います。

ウェブサイトを監視するには

それでは、はじめに簡単な例として、ウェブサイトが正常に表示しているかどうかを調べてみましょう。

シンプル監視を使うには、さくらのクラウドのコントロールパネルから、【 シンプル監視 】 を開きます。画面上方にある【 追加 】ボタンをクリックします。

次に監視対象を入力します。ここでは例として、前回の投稿で使った https://secure.zem.jp を監視対象にします。【 IP アドレス 】の【 サーバから選択 】をクリックし、監視対象のサーバを選択します。監視対象がさくらのクラウドであれば、このように簡単に選択できます。

ここで、料金について捕捉。シンプル監視は対象のサーバがさくらインターネット上であれば無償でお使いいただけます。ただし、IP アドレスで指定するか、サーバを選択する必要があります。そのため、ホスト名 secure.zem.jpさくらのクラウド上ですが、「FQDN」でホスト名を監視対象にすると有償になりますので、ご注意ください。

その他の指定項目は以下の通りです。

  • 監視方法 … 【 https 】にします。https に対応していないサイトであれば「http」にします。
  • Hostヘッダ … secure.zem.jp など、ブラウザで表示したいホスト名を入力します。
  • ポート番号 … 【 443 】にします。通常はこのままです。
  • パス … 存在するファイルの URL のパスを指定します。ここでは監視対象の URL を https://secure.zem.jp/index.html とするため【/index.html】 を指定します。しています。その他にも index.php など、存在するファイルのパスであれば任意のパスを指定できます。
  • レスポンスコード … 【 200 】は HTTP レスポンスコードが 200(正常)状態であれば、正常な状態と見なします。ページがみつからない、あるいは応答しない場合は異常と認識し、通知します。
  • チェック間隔 … 【 1 】分に指定していますが、任意の間隔(1~60分の間まで)を指定できます。

そして、Slack の通知を有効にするには、【 通知先 】の【 Slack 】にチェックを入れます。それから【 Webhook URL 】に先ほど控えた自分の Webhook の URL を入力します。

最後に画面を下まで移動し、【 作成 】ボタンをクリックします。

確認画面が表示されるので【 作成 】ボタンをクリックします。

以上で監視設定が終わりました。シンプル監視の一覧画面に戻れば、新しい監視項目が追加されているのが分かります。画面上、監視対象の左側が緑色です。これは監視中(正常)な状態です。もし、応答が無いなど異常があれば、赤色に変わります。

もしこの段階でエラーになってしまう場合は、以下のご確認をお願いします。

  • ウェブサーバが起動しているかどうか
  • iptables や firewalld でポートを公開しているかどうか
  • index.html が存在しているかどうか

Slack 通知の動作確認

それでは、Slack を通して実際に監視情報を受け取りましょう。監視対象のサーバにログインし、監視対象のファイル(この例では index.html )の名前を別名にして、あえてエラーを発生させます。

別名に変えた後は、暫く待ちます。今回、監視間隔は1分にしていますので、1分後、シンプル監視が対象 URL をチェックして問題があれば、その情報を Slackを通して直ちに受信できます。

 

次は index.html を元通りに直します。再び1分ほど待ちますと、次のように復旧したとアップ検知が届きます。

ちなみに:tcp 監視と http/https 監視の違いとは?

シンプル監視には tcp のポート番号を監視する機能もあります。これを使えば、ウェブサーバの用のポート 80(HTTP用)や 443(HTTPS用)を監視対象にできます。

しかし、ポート監視は、あくまでも tcp 通信が正常かどうかしか確認しません。http/https と決定的に違うのは、ページが正常に表示できるかどうかです。たとえば、ウェブサーバ上のファイルが見えない状態(HTTP 応答コード 404 や 403)、設定を間違えて表示できない場合(コード 500)などを tcp ポート監視では把握できません。

そのため、シンプル監視のように HTTP 応答コードの監視ができる場合は、こちらを使った監視もお薦めです。

SSL 証明書やドメイン名の有効期限を監視

ここで突然ですが、皆さんは SSL の証明書やドメイン名の有効期限を、皆さんはどのように確認されていますでしょうか。カレンダーで管理されているかもしれませんし、あるいは、事業者から届くメールなどの案内でお気づきになるかもしれません。

この有効期限をシンプル監視機能でチェックしましょう。シンプル監視は単にサーバの応答やウェブサイトを監視できるだけではありません。少しの工夫で、SSL 証明書やドメイン名の有効期限の監視にも応用できます。

必要になるのはクラウドもしくは VPS 上のサーバが1台です。監視には http/https 監視を使います。監視の構成は、以下の図をご覧ください。

処理の流れはどちらも共通しています。

  1. cron で監視用のスクリプトを実行。
  2. スクリプトはリモート URL の SSL または whois ドメインの有効期限を確認。
  3. 有効期限と現在の日数を比較。
  4. 有効期限が指定した日数を上回る場合に正常とみなし、http://<ホスト>/<監視用ファイル> を作成。
  5. 有効期限が指定した日数を下回る場合、あるいは何らかのエラーがあれば異常とみなし、ファイルを削除。

このように、有効期限を確認し、日付の差を比較します。そして、シンプル監視では、http/https 監視先の URL にファイルが存在する場合に正常、つまり有効期限内であるとみなす方法です。

ただし、弱点としては、ウェブサイトがダウンした場合や通信できない場合も障害発生の通知が届いてしまう点です。

以降では、具体的な SSL 証明書およびドメインの有効期限を確認する設定を紹介していきます。

応用1:SSL 証明書の有効期限を監視

次のスクリプト /opt/sakura/simplemonitor/expire-ssl.sh を設置します(あるいは、任意の場所に設置いただいても構いません)。

# mkdir -p /opt/sakura/simplemonitor
# touch /opt/sakura/simplemonitor/expire-ssl.sh
# chmod 700 /opt/sakura/simplemonitor/expire-ssl.sh

この時、以下の情報の変更をお願いします。

  • HOST … 監視対象のホスト名です。
  • PORT … 監視対象のポート番号(http の場合は 80、https の場合は 443)です。
  • NOTICE … 更新切れまでの残り日数(指定した日数以内になれば、監視対象ファイルを削除)です。
  • CHECK … データ出力用のファイルのパスです。Nginx のドキュメント・ルートは「/usr/share/nginx/html/」のため、この直下に「check_ssl.dat」を作成します。ここが監視対象の URL になります。もし Apache をお使いであれば、ドキュメント・ルートは「/var/www/html/」のため、「/var/www/html/check_ssl.dat」が出力用のパスになります。

以下の「expire-ssl.sh」は GitHub からダウンロードできます。

#!/bin/sh

### SSL Expire Checker
### MIT License
### Masahito Zembutsu <github.com/zembutsu>


### Variables
HOST="secure.zem.jp"
PORT="443"
NOTICE="30"
CHECK="/usr/share/nginx/html/check_ssl.dat"

# fetch ssl certificate and calcurate
EXPIRE_DATE=`date '+%s' -d "\` echo | \
        openssl s_client -connect $HOST:$PORT -showcerts  2>/dev/null | \
        openssl x509 -noout -dates | \
        grep notAfter | \
        sed 's/notAfter=//' \`"`
# how many days
EXPIRE=$((($EXPIRE_DATE-`date '+%s'`)/86400))
DIFF=$(($EXPIRE-$NOTICE))

if [ $DIFF -gt 0 ];  then
        # ok
        echo $EXPIRE > $CHECK
else
        # notice
        if [ -e $CHECK ]; then
                rm -f $CHECK
        fi
fi

こちらを後で cron に登録します。そのため、cron に登録するユーザ権限に切り替えてから、手動でスクリプトを実行し、エラーが出ないかどうかを確認します。

# /opt/sakura/simplemonitor/expire-ssl.sh

もしエラーが出る場合、cron を実行するユーザがドキュメント・ルートに対する書き込み許可があるかどうかを確認します。そして、「CHECK」変数で指定したファイルを出力している か確認します。出力できている場合、ファイル内を開くと有効期限までの日数を確認できます。

# cat /usr/share/nginx/html/check_ssl.dat
82

この例では、SSL 証明書の有効期限は残り 82 日だと分かります。動作確認としては、スクリプト内の「NOTICE」の値を「90」に書き換えてみます。残り日数が「NOTICE」を下回ればファイル を削除しますので、次のように手動で実行したら、ファイルが削除されていることが分かります。

# /opt/sakura/simplemonitor/expire-ssl.sh
# cat /usr/share/nginx/html/check_ssl.dat
cat: /usr/share/nginx/html/check_ssl.dat: No such file or directory

動作確認後は「NOTICE」を元の値(30など)に戻します。

あとは cron に登録します。 crontab -e を実行し、次のように1日1回確認を行います。

55 8 * * * /opt/sakura/simplemonitor/expire-ssl.sh 1 > /dev/null 2 > /dev/null

それから、シンプル監視を使い、監視対象の URL を指定するだけです。

さくらのクラウドのコントロールパネルを開きます。「シンプル監視」のメニューから「追加」ボタンをクリックします。

  • 監視対象は先ほどのスクリプトを設置したサーバです(さくらインターネットのネットワークにある IP アドレスを指定したら、監視料金は無料です)。
  • 監視方法に「http」または「https」を選択し、ポートの指定(httpの場合は80、httpsの場合は443)をします。
  • レスポンスコードを「200」と指定します。
  • パスを「check_ssl.dat」と指定します。
  • 必要に応じて、チェック間隔、通知の設定を追加します。
  • タグには「SSL有効期限監視」など、分かりやすいものを付けるのがオススメです。

入力を終えたら、画面右下の「作成」ボタンをクリックします。

応用2:ドメイン名の有効期限を監視

ドメイン名の有効期限の場合も、応用1の手順とほぼ同じです。今度は whois コマンドを使います。ホスト OS が CentOS であればセットアップされていないため、 yum でセットアップします。

# yum install whois

それから、次のスクリプト「expire-whois.sh」を設置します。設置の際は、以下の情報の変更をお願いします。

  • DOMAIN … 監視対象のドメイン名です。
  • NOTICE … 更新切れまでの残り日数(指定した日数以内になれば、監視対象ファイルを削除)です。
  • CHECK … データ出力用のファイルのパスです。

以下はサンプルの「expire-whois.sh」です。こちらは「汎用.jp」ドメインのみに対応しています。属性・地域型.jpドメインや、gTLDドメイン(.comや.netなど)は、別途GitHubからダウンロードをお願いします。

#!/bin/sh

### Whois Expire Checker
### MIT License
### Masahito Zembutsu <github.com/zembutsu>


### Variables
DOMAIN="zem.jp"
NOTICE="30"
CHECK="/usr/share/nginx/html/check_whois.dat"

# whois and calcurate
EXPIRE_DATE=`date '+%s' -d \`whois $DOMAIN | grep "Expires" | awk '{print $3}'\``

# how many days
EXPIRE=$((($EXPIRE_DATE-`date '+%s'`)/86400))
DIFF=$(($EXPIRE-$NOTICE))

if [ $DIFF -gt 0 ];  then
        # ok
        echo $EXPIRE > $CHECK
else
        # notice
        if [ -e $CHECK ]; then
                rm -f $CHECK
        fi
fi

動作の仕組みは先ほどの SSL 証明書の監視と同じです。whois の有効期限を確認し、ファイルを作成します。

ファイルを設置後は、先の手順通り、動作確認と cron への登録をお願いいたします。

さらなる応用や考慮点

このほかにも、何か監視したいものがあれば、サーバ内の任意の情報を取得し、http/https の監視設定をすることで、シンプル監視を活用できます。

注意点としては、この設定では特にアクセス制限を設けていない点です。もし URL からファイルが推測されたくない場合は、.htaccess やファイアウォール等のアクセス制限によって、シンプルの監視ネットワーク 27.133.139.32/28 からの通信のみを許可する設定にお願いします。

もう1つの注意点として、有効期限の有無を確認するのは cron の実行タイミングに依存します。そのため、何らかの理由により cron が停止してしまう場合は監視が停止してしまいますのでご注意ください。

まとめ

何らかのサイトやサービスを立ち上げた場合、正常にサイトが表示できるか、あるいは、正常にサービスが稼働しているか監視する必要があります。シンプル監視を使えば、監視サーバをたてることなく、手軽に監視が可能です。

クラウド・コンピューティングによって、必要な時に好きなだけサーバを建てられるようになりました。その環境を監視するために、別のリソースをたてる必要はありません。そして、単にサイトの情報を監視するだけでなく、スクリプトを組みあわせることで、様々な監視に応用できます。

シンプル監視は、さくらインターネットのネットワーク内であれば無償で活用できます。この記事をきっかけとして監視機能をお試しいただけますと、それはとってもうれしいなって思っています。

参考情報