HTTPSでドメインを公開すると即座にボットに発見される仕組みと対策
まとめ
- HTTPS証明書を発行すると CT Log(証明書透明性ログ) に即座に記録され、誰でも検索できる
- 攻撃者はcertstreamでCT Logをリアルタイム監視しており、証明書発行から数分以内にスキャンが来る
- 開発・ステージング環境はBasic認証+IP制限で守る。本番はWAF
- サブドメイン名を隠すにはワイルドカード証明書。
workers.dev等のプラットフォームドメインを使うと大量エントリに埋もれてさらに発見されにくい
CT Log とは
HTTPS証明書を発行すると、CAは Certificate Transparency Log(CT Log) にその証明書情報を登録する。ブラウザ(Chrome・Safari等)が要求する仕組みで、回避するとブラウザエラーになるため事実上強制。
CT LogはAPIで誰でも検索できる(crt.sh、certstreamなど)。
発見されるまでの速度
証明書発行 → CT Log記録(数秒〜1分)→ certstream検知(数秒)→ ボットスキャン開始(数分〜1時間以内)という流れ。
certstreamはWebSocketで新規証明書をリアルタイム配信する。攻撃者はこれを監視して「staging」「dev」「admin」等のキーワードにマッチしたドメインを即スキャンする。証明書発行から30分以内にボットが来ると思っておくのが安全。
対策
開発・ステージング環境はBasic認証・IP制限を即時適用
本番環境にBasic認証は不向き(ユーザーが入れなくなる)。開発環境専用の対策。
ワイルドカード証明書でサブドメイン名を隠す
個別証明書を発行するとCT Logにサブドメイン名がそのまま記録される。ワイルドカード証明書(*.example.com)にするとCT Logには *.example.com とだけ記録され、具体的なサブドメイン名が隠れる。親ドメイン自体は隠せない点に注意。
Cloudflareを使っている場合はOrigin Certificateがワイルドカードに対応しており、ダッシュボードから数クリックで発行できる(無料・有効期限15年)。Let’s Encryptでワイルドカードを取得する場合はDNS-01チャレンジが必要。
# certbot-dns-cloudflare プラグインで自動化
certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/cloudflare.ini \
-d "*.example.com" -d "example.com"workers.dev 等のプラットフォームドメインを活用する(ベスト)
*.workers.dev や *.run.app 等のプラットフォーム標準ドメインを使うと、CT Logに無数の類似エントリが存在するため自分のサブドメインが埋もれる。開発環境であればプラットフォームドメイン+Basic認証が最も手軽で効果的な組み合わせ。
前提として持つべき認識
「まだ誰にも教えていないから大丈夫」は通用しない。公開 = 即発見 を前提に設計する。