「この接続ではプライバシーが保護されません」という名の恐怖
朝起きたら上司からの着信の嵐……という experienceはありませんか?Webサイトにアクセスできず、ブラウザには「この接続ではプライバシーが保護されません」という真っ赤な警告。SSL証明書の期限切れ一つで、これまでのSEOや広告の努力が水の泡になってしまいます。
駆け出しの頃、私は20ほどのWebサイトを「魔法の」Excelファイルで管理していました。時々ファイルを開いては期限を確認して更新する。しかしある日、決済APIを動かしているサブドメインのことをすっかり忘れてしまったのです。結果、システムは4時間停止し、離脱率は30%も急上昇。上司との「面談」という名の説教タイムが待っていました。
この一件で学んだのは、「人間の記憶力ほどシステム運用において信用できないものはない」ということです。根本的な解決策として、私はPrometheusとBlackbox Exporterを組み合わせた監視に切り替えました。このシステムがあなたの代わりに24時間365日見守ってくれます。
SSL期限管理の3つのパターン:あなたはどこに当てはまりますか?
実務において、ITエンジニアの期限管理は大きく3つのグループに分けられます。
1. 手動管理派(Excel、Googleカレンダー)
- メリット: サーバーリソースを消費せず、誰でもすぐに始められる。
- デメリット: ドメイン数が数十件になると、非常に漏れが発生しやすくなる。リアルタイム性がなく、誰かがプロバイダーを変更してExcelの更新を忘れたら終わりです。
2. スクリプト派(Bash/Python + Cronjob)
- メリット: 自動化が可能で、Telegramなどに通知を送れる。
- デメリット: 集中管理が難しい。スクリプトが密かに停止していても気づきにくい。稼働率(uptime)をグラフ化するための履歴保存も手間がかかります。
3. モダン監視派(Prometheus & Blackbox Exporter)
- メリット: Grafanaダッシュボードで一元管理。Slack、Telegram、PagerDutyなど多チャネルで通知可能。外側からのチェック(external check)により、実際のユーザー体験を正確にシミュレーションできる。
- デメリット: 初回セットアップに少し時間がかかる。
なぜBlackbox Exporterが最適なのか?
すでにCPUやRAMの監視でPrometheusを使っているなら、Blackbox Exporterの導入はわずか5分で終わります。
仕組みは非常にシンプルです。Blackbox Exporterは「仮想ユーザー」として機能します。WebサイトにHTTP/HTTPSリクエストを送り、返ってきたSSL証明書からデータを抽出します。手動でコマンドを打つことなく、正確な期限や発行機関を把握できます。
現場での経験談: 各サーバーにSSHでログインしてopenssl x509 -enddateを叩く代わりに、今ではダッシュボードをチラッと見るだけです。30日以内に期限が切れるドメインは、自動的に優先リストのトップに表示されます。
クイック導入ガイド
ステップ1:DockerでBlackbox Exporterをインストール
環境を汚さないために、Dockerを使うのが最も速い方法です。まず、設定ファイルを作成します:
mkdir -p /etc/blackbox_exporter
vi /etc/blackbox_exporter/blackbox.yml
blackbox.ymlの内容:
modules:
http_2xx:
prober: http
timeout: 5s
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
method: GET
fail_if_not_ssl: true # SSLが必須(ない場合は失敗とみなす)
コンテナを起動します:
docker run -d \
--name blackbox_exporter \
-p 9115:9115 \
-v /etc/blackbox_exporter:/config \
prom/blackbox-exporter:latest \
--config.file=/config/blackbox.yml
ステップ2:Prometheus의 データ収集設定
次に、PrometheusがBlackbox Exporterを見つけられるように設定します。prometheus.ymlに以下を追記します:
scrape_configs:
- job_name: 'ssl_expiry'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://itfromzero.com
- https://google.com
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9115 # Blackbox ExporterのIPアドレス
再起動後、メトリクスprobe_ssl_earliest_cert_expiryを確認してください。タイムスタンプの数値が表示されていれば、データの取得は成功です。
ステップ3:Alertmanagerで「アラーム」を設定
グラフをずっと監視している必要はありません。Alertmanagerに任せましょう。ssl_rules.ymlを作成します:
groups:
- name: ssl_expiry_rules
rules:
- alert: SSLCertExpiringSoon
expr: (probe_ssl_earliest_cert_expiry - time()) / 86400 < 15
for: 1h
labels:
severity: warning
annotations:
summary: "SSL期限間近: {{ $labels.instance }}"
description: "SSL証明書の期限まであと15日を切りました。早急に更新してください!"
ここでは、タイムスタンプを読みやすい日数に変換するために86400(1日の秒数)を使用しています。15日前という警告設定は、支払い手続きや更新作業を行うための「ゴールデンタイム」と言えるでしょう。
ステップ4:ドメインの有効期限(Domain Expiry)も忘れずに
Blackbox Exporterが監視するのはSSLのみです。WHOIS情報に基づいたドメイン自体の期限については、domain_exporter(例:caarlos0氏のもの)を併用するのがおすすめです。使い方はほぼ同じですが、更新料の払い忘れでドメインを「ドメイン転売屋」に奪われるという悲劇を防げます。
おわりに
SSLやドメインの期限切れは非常に初歩的なミスですが、その代償は高くつきます。PrometheusとBlackbox Exporterのコンビを使えば、更新忘れの問題を解決できるだけでなく、レスポンス速度(latency)やシステム深部のHTTPエラーコードまで監視できるようになります。
サイトがダウンしてから慌てて修正するのではなく、今日のうちに30分だけ時間を割いて設定してしまいましょう。そうすれば、上司からの電話に怯えることなく、ぐっすり眠れる夜が手に入ります。皆さんの健闘を祈ります!

