3本を貫いていた、ひとつの問い
このシリーズでは、別々のテーマを扱ってきたつもりでした。 並べてみると、同じ問いを違う角度から見ていたことが分かります。
- なぜ HTTPS が要るのか 平文なら、誰でも読めて、誰でも書き換えられる
- 証明書は、どう選ばれているのか 名乗りが2つある。食い違いを検出する
- ハッシュと署名は、何が違うのか 誰が作ったかを、どう証明するか
- 名乗りを、どう確かめるか(この記事) 検証手段のない名乗りを、どう扱うか
すべて「相手が名乗っていることを、どう確かめるか」でした。
最後に User-Agent を置くと、全体像が見えます。
名乗りには、種類がある
リクエストには、いくつもの「名乗り」が含まれています。 それぞれ、確かめられる度合いが違います。
| 名乗り | 層 | 詐称 | 検証の手段 |
|---|---|---|---|
| IP アドレス | IP | 困難 | 通信が成立していること自体が証拠 |
| SNI | TLS | 容易 | Host ヘッダと突き合わせる |
| Host ヘッダ | HTTP | 容易 | SNI と突き合わせる |
| User-Agent | HTTP | 容易 | 規格上、存在しない |
| Referer | HTTP | 容易 | 存在しない |
| 電子署名 | アプリ | 困難 | 公開鍵で検証する |
UA と Referer だけ、対応する検証手段がありません。 仕様として「自由に書いてよい文字列」だからです。 嘘をついても、規格には違反しません。
もともとはサーバー側が表示を調整するための情報でした。 「この端末なら軽い版を返す」といった用途です。 身元を証明するために作られたものではありません。
なぜ IP だけは、詐称しにくいのか
表の中で IP アドレスだけ「困難」としました。理由は通信の仕組みにあります。
クライアント → サーバー SYN サーバー → クライアント SYN+ACK ← 名乗ったIPに返される クライアント → サーバー ACK ← これを返せなければ成立しない
偽の IP を名乗ると、サーバーの応答はその偽のIPへ送られます。 攻撃者の手元には届かない。だから3手目を返せず、接続が成立しません。
この性質が重要です。UA は確かめられないが、IP は確かめられる。 なら、IP を手がかりに UA を検証できないか——それが次の話です。
UA を、IP で裏づける
主要なクローラは、自社の管理下にある IP から接続してきます。 Googlebot なら Google の、Applebot なら Apple の。
そこで、IP から辿ってドメインを確かめる方法が使われます。 逆引きと正引きを組み合わせる——FCrDNS と呼ばれます。
① 逆引き(PTR):IP からホスト名を引く 66.249.73.72 → crawl-66-249-73-72.googlebot.com ② ドメインの照合:名乗りと一致するか googlebot.com は Googlebot の管理ドメイン → 一致 ③ 正引き(A):ホスト名から IP に戻す crawl-66-249-73-72.googlebot.com → 66.249.73.72 元のIPと一致 → 正当
なぜ、①だけでは足りないのか
ここが肝心です。逆引き(PTR)は、IP の管理者が自由に設定できます。
googlebot.com と書くことは、誰にでもできます。
自分が持っている IP アドレスの逆引きに、
好きなホスト名を設定できるからです。
①だけで判定すると、この設定を信じることになります。
そこで③が要ります。
正引きを設定できるのは、そのドメインの管理者だけです。
googlebot.com の DNS を書き換えられるのは Google だけ。
前回の署名と、考え方は似ています。 当人にしかできない操作を、外から確認する。 署名は秘密鍵、こちらは DNS の管理権限です。
デモ:名乗りを検証する
リクエストを選ぶと、3段階の検証が順に実行されます。 とくに「PTR だけ詐称」のケースを見てください。
実測 — 7日間で6件
運用しているサーバーで、Googlebot を名乗る接続を全件検証しました。 その結果です。
| IP アドレス | 名乗り | 逆引きの結果 | 判定 |
|---|---|---|---|
| 66.249.73.72 | Googlebot | crawl-…googlebot.com | 正当 |
| 17.22.237.45 | Applebot | …applebot.apple.com | 正当 |
| 40.77.167.35 | bingbot | msnbot-…search.msn.com | 正当 |
| 108.165.181.162 | Googlebot | …acedatacenter.com | 詐称 |
| 166.88.217.235 | Googlebot | …acedatacenter.com | 詐称 |
| 198.46.246.108 | Googlebot | …colocrossing.com | 詐称 |
詐称は7日間で6件。すべてデータセンター事業者のドメインでした。 サーバーを借りて、そこから Googlebot を名乗っていたことになります。
facebookexternalhit を名乗る接続の逆引きが
LINE のドメインだったことがあります。
これは詐称ではなく、LINE がその UA を使っているためでした。
検証の対象を機械的に広げると、正当なものを弾いてしまいます。
詳しい経緯は botは、3種類いるに書きました。 この記事ではなぜその手順が有効なのかを扱っています。
検証できない相手は、どうするか
FCrDNS が使えるのは、逆引きを整備している事業者だけです。 それ以外の相手には別の方法が要ります。
| 方法 | 内容 | 適用できる範囲 |
|---|---|---|
| 逆引き+正引き | DNS の設定権限を確かめる | 主要クローラ |
| 公開 IP レンジ | 事業者が公開する一覧と照合 | 一覧を出している事業者 |
| 署名による認証 | リクエストに署名を付ける | 標準化が進行中 |
| 行動の観察 | 名乗りと挙動が一致するか | すべて |
署名という方向
前回扱った電子署名を、 リクエストに付ける仕組みが検討されています。 bot が自分の秘密鍵で署名し、サーバーが公開鍵で検証する—— UA の詐称を根本的に防げます。
ただし、bot 側とサーバー側の双方が対応する必要があります。 普及には時間がかかるでしょう。
名乗りが確かめられないなら、行動を見る
最後に残るのは、実際の挙動と照らす方法です。
| 観察する点 | 正規のクローラなら |
|---|---|
| 404 の割合 | 低い。存在するページを辿る |
| アクセスの間隔 | 負荷をかけない程度に抑える |
| robots.txt の取得 | 巡回の前に読みに来る |
| アクセスするパス | 管理画面や設定ファイルを狙わない |
まとめ
4本を通じて見てきたのは、「名乗りは、それだけでは意味を持たない」ということでした。
HTTPS は経路上の書き換えを防ぎ、SNI と Host の照合は食い違いを検出し、 署名は作成者を特定する。 どれも「確かめる仕組み」があって初めて、名乗りに意味が生まれます。
この記事のまとめ
- 名乗りには検証手段のあるものと、ないものがある。UA と Referer には無い。
- UA はもともと表示の調整のためのもの。身元の証明用ではない。
- IP だけは詐称しにくい。応答を返せなければ通信が成立しないため。
- だから IP を手がかりに UA を裏づける——FCrDNS。
- 逆引きだけでは不十分。PTR は IP の持ち主が自由に書けるから。
- 正引きで戻して確かめる。設定権限の違う2つを突き合わせるのが原理。
- 実測では7日間で詐称6件。すべてデータセンター事業者のドメインだった。
- 検証できない相手には行動を見る。名乗りは偽れても、挙動は偽りにくい。