Syntheticsでサイトの証明書の期限を監視する | Observability Platform

所要時間:約 4分

対象者

システム運用チーム、SRE

効果

SSL証明書の期限の管理はときに忘れがちですが重要な問題です。多くのサイトがhttpsでのアクセスを期待される昨今、SSL証明書はサイトにアクセスするために必要不可欠な書類です。そしてSSL証明書には1年といった有効期限があります。1年にたった1回の作業ですが、この作業を忘れるとサイトへのアクセスが事実上できなくなります。事実、このブログサイト https://blog.newrelic.co.jp/ も先日証明書の期限が切れてしまい一時的にアクセスできなくなってしまいました。その際はご迷惑をおかけいたしました。

SSL証明書を更新した際に、次の更新予定日をカレンダー登録しておくのも一つのアイディアです。しかし、これだけで不十分です。同じサイトに有効なSSL証明書が複数ある場合、いつの間にか別の、しかもより期限の短い証明書が設定されているかもしれません。事実、先日の期限切れは別の証明書がいつの間にか設定されていたことが期限切れに気づくのが遅れた一つの原因でした。このような事態を防ぐためには、今実際に配置されているSSL証明書について計測することが必要です。

New Relic Syntheticsは人工的にリクエストを発生させて、サイトの健全性を外部から計測することができます。SyntheticsでHTTP HEADリクエストを発行すると、配置されているSSL証明書に関する情報を計測できます。これらをInsightのカスタムイベントとして登録することで、ダッシュボードとして可視化でき、期限切れの一定日数前になったらアラートを発砲することが可能になります。

New Relic 製品

New Relic Synthetics, New Relic Alerts, New Relic Insight


実装方法

HTTP HEADリクエストを発行するためには、SyntheticsのAPI Test機能を利用します。頻度とロケーションは自由ですが、通常一つのロケーションから1日1回程度テストを行えば十分でしょう。

SyntheticsのAPI TestのスクリプトのサンプルをGistで公開しています。urlsToMonitorに対象のURLを配列として複数指定することができます。

https://gist.github.com/tanaka-takayoshi/e00d7e8a4ec2fff521204bf9d69e12fa

また、Insightにカスタムイベントとして登録する際に、送信先のaccountIdとInsight Insert KeyはSecure Credentialsの機能を利用しています。Secure Credentialsで設定した値は、console.logなどで出力しても伏字で表示されるため便利です。

このサンプルコードではダッシュボードを作成するためにInsightのカスタムイベントを送信しています。もし、Syntheticsのみで完結させたい場合は、assert.failを呼び出してCheckを失敗させ、Checkが失敗したというアラートを発砲させるのが良いでしょう。

ダッシュボードは例えば次のような二つのチャートを表示させることができます。Syntheticsの実行が1日1回の場合、カスタムイベントも一つのURLにつき1日1件しか登録されないので、デフォルトの表示期間を24hにするのが良いでしょう。

左側は90日以内に失効するURLのリストで次のNRQLで取得できます。

SELECT uniques(Url) FROM SSLCertificateCheck WHERE DaysToExpiration < 90

右側はその中でも一番早く失効する証明書が失効するまでの日数で次のNRQLで取得できます。

SELECT min(DaysToExpiration) AS '日' FROM SSLCertificateCheck

この場合、アラートにはNRQLアラートが使えます。90日以内に失効するURLが一つでも合ったらアラートを発砲させたい場合、次のNRQLを使って設定します。

SELECT uniqueCount(Url) FROM SSLCertificateCheck WHERE DaysToExpiration < 90

このようにSynetheticsはSSL証明書の外形監視にも使えます。また、Syntheticsで取得したデータをカスタムイベントで登録することで、より詳細なダッシュボードを作成できるようになります。


New Relic 担当者にもう少し話を聞いてみたい場合はこちらまで!