サイトの前面に CDN やリバースプロキシを置くとトラフィックを吸収し、サーバーのアドレスも隠せますが、それは実際の IP が知られていない間だけです。攻撃者が CDN を破ることはまれで、オリジンを直接探します。このガイドでは、オリジンが漏れる場所と、プロキシ以外からの通信をすべて拒否させる方法を解説します。
オリジンが見つかる経路
- DNS の履歴:サービスは古いレコードを保存しているため、CDN を導入する前に使っていた IP が今も残っています。
- サブドメイン:サーバーを直接指す
mail.、ftp.、dev.のレコード。 - メールヘッダー:同じホストから送信したメールのヘッダーに IP が表示されます。
- 証明書の透明性とインターネットスキャン:スキャナーは証明書を、それを提供しているすべての IP と照合します。
- アプリケーションの挙動:Webhook、画像取得機能、「この URL を確認する」機能は、オリジンから外部へ接続します。
ステップ 1:クリーンな状態から始める
サーバーがすでに露出している場合、最も安全な対処法は新しい IP を取得するか、新しいサーバーへ移行することです。すでに公開されたアドレスを隠すことはできません。移行はダウンタイムなし移行ガイドを参考に計画してください。
ステップ 2:プロキシからの通信だけを受け付ける
Web ポートへは、プロキシが公開しているレンジからのみ許可し、それ以外は許可しません。UFW では次のようになります(プロバイダーが公開しているレンジを使用してください)。
sudo ufw default deny incoming
sudo ufw allow OpenSSH
for ip in $(cat proxy-ranges.txt); do sudo ufw allow from "$ip" to any port 443 proto tcp; done
sudo ufw enable
レンジは変更されるため、定期的に一覧を更新してください。より確実にするには、認証付きオリジンプル(相互 TLS)を使い、プロキシの証明書を持たないクライアントを Nginx が拒否するようにします。
ステップ 3:漏れる可能性のあるものをすべて分離する
- メールはオリジンからではなく、別のホストまたはリレー経由で送信します。
- Web 以外のサブドメインはオリジンの IP に向けないでください。
- アプリケーションからの外部取得は、プロキシまたは別のワーカーを経由させます。
- 未知の
Hostに対して空の応答を返すデフォルトの Nginx サーバーブロックを用意し、IP 直指定のスキャンで何も表示されないようにします。
server {
listen 443 ssl default_server;
ssl_reject_handshake on;
}
ステップ 4:攻撃者の視点でテストする
DNS 履歴ツールでドメインを検索し、自分の IP レンジを証明書でスキャンし、テストメールのヘッダーを確認します。いずれかでオリジンが見つかったら、IP を変更してやり直してください。
この対策が守るのはアドレスの可用性とプライバシーであり、アカウントの所有者が誰かまでは隠せない点に注意してください。それについては匿名ホスティングの本当の匿名性を、ネットワーク層を突破する攻撃については Layer 7 防御をご覧ください。