ファイナンス、情報通信技術のスキル・アグリゲーション・サイト

' . iseeit.jp 情報通信技術 . '
 
暗号と通信 ④(最終回)

名乗りを、どう確かめるか
UA・SNI・IP・署名

User-Agent には、検証する仕組みが規格上ありません。 SNI は Host と突き合わせられる。署名は公開鍵で検証できる。 では UA はどうするのか—— 逆引きと正引きを組み合わせる方法と、 なぜ2段階が必要なのかを確かめます。

User-Agent FCrDNS クローラ検証 なりすまし

[ 1 ]

3本を貫いていた、ひとつの問い

このシリーズでは、別々のテーマを扱ってきたつもりでした。 並べてみると、同じ問いを違う角度から見ていたことが分かります。

暗号と通信 — シリーズ
  1. なぜ HTTPS が要るのか 平文なら、誰でも読めて、誰でも書き換えられる
  2. 証明書は、どう選ばれているのか 名乗りが2つある。食い違いを検出する
  3. ハッシュと署名は、何が違うのか 誰が作ったかを、どう証明するか
  4. 名乗りを、どう確かめるか(この記事) 検証手段のない名乗りを、どう扱うか

すべて「相手が名乗っていることを、どう確かめるか」でした。 最後に User-Agent を置くと、全体像が見えます。

[ 2 ]

名乗りには、種類がある

リクエストには、いくつもの「名乗り」が含まれています。 それぞれ、確かめられる度合いが違います

名乗り詐称検証の手段
IP アドレスIP困難通信が成立していること自体が証拠
SNITLS容易Host ヘッダと突き合わせる
Host ヘッダHTTP容易SNI と突き合わせる
User-AgentHTTP容易規格上、存在しない
RefererHTTP容易存在しない
電子署名アプリ困難公開鍵で検証する

UA と Referer だけ、対応する検証手段がありません。 仕様として「自由に書いてよい文字列」だからです。 嘘をついても、規格には違反しません

User-Agent の位置づけ

もともとはサーバー側が表示を調整するための情報でした。 「この端末なら軽い版を返す」といった用途です。 身元を証明するために作られたものではありません

[ 3 ]

なぜ IP だけは、詐称しにくいのか

表の中で IP アドレスだけ「困難」としました。理由は通信の仕組みにあります。

TCP の接続確立(3ウェイハンドシェイク)
クライアント → サーバー   SYN
サーバー → クライアント   SYN+ACK   ← 名乗ったIPに返される
クライアント → サーバー   ACK       ← これを返せなければ成立しない

偽の IP を名乗ると、サーバーの応答はその偽のIPへ送られます。 攻撃者の手元には届かない。だから3手目を返せず、接続が成立しません

「通信できている」こと自体が、IP の証明になります。 別の仕組みで確かめる必要がありません。 他の名乗りが「言っているだけ」なのに対し、IP は「そこに居ることが確認済み」です。
例外はあります。 UDP のように応答を必要としない通信では、送信元を詐称できます。 経路上に協力者がいる場合も同様です。 ここでの「困難」は、通常の TCP 接続に限った話です。

この性質が重要です。UA は確かめられないが、IP は確かめられる。 なら、IP を手がかりに UA を検証できないか——それが次の話です。

[ 4 ]

UA を、IP で裏づける

主要なクローラは、自社の管理下にある IP から接続してきます。 Googlebot なら Google の、Applebot なら Apple の。

そこで、IP から辿ってドメインを確かめる方法が使われます。 逆引きと正引きを組み合わせる——FCrDNS と呼ばれます。

3段階の確認
① 逆引き(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 の管理者が自由に設定できます

PTR に googlebot.com と書くことは、誰にでもできます。 自分が持っている IP アドレスの逆引きに、 好きなホスト名を設定できるからです。 ①だけで判定すると、この設定を信じることになります

そこで③が要ります。 正引きを設定できるのは、そのドメインの管理者だけです。 googlebot.com の DNS を書き換えられるのは Google だけ。

設定権限の違う2つを、突き合わせています。 PTR は IP の持ち主が、A レコードはドメインの持ち主が設定する。 両方が一致するということは、 そのドメインの管理者が、この IP を自分のものだと認めている—— それが FCrDNS の原理です。

前回の署名と、考え方は似ています。 当人にしかできない操作を、外から確認する。 署名は秘密鍵、こちらは DNS の管理権限です。

[ 5 ]

デモ:名乗りを検証する

リクエストを選ぶと、3段階の検証が順に実行されます。 とくに「PTR だけ詐称」のケースを見てください。

Interactive · claim verification
この名乗りは、確かめられるか
DNS の応答は、実測データをもとにした再現です。実際の問い合わせは行いません。
受け取ったリクエスト
[ 6 ]

実測 — 7日間で6件

運用しているサーバーで、Googlebot を名乗る接続を全件検証しました。 その結果です。

IP アドレス名乗り逆引きの結果判定
66.249.73.72Googlebotcrawl-…googlebot.com正当
17.22.237.45Applebot…applebot.apple.com正当
40.77.167.35bingbotmsnbot-…search.msn.com正当
108.165.181.162Googlebot…acedatacenter.com詐称
166.88.217.235Googlebot…acedatacenter.com詐称
198.46.246.108Googlebot…colocrossing.com詐称

詐称は7日間で6件。すべてデータセンター事業者のドメインでした。 サーバーを借りて、そこから Googlebot を名乗っていたことになります。

判定が難しい例もありました。 facebookexternalhit を名乗る接続の逆引きが LINE のドメインだったことがあります。 これは詐称ではなく、LINE がその UA を使っているためでした。 検証の対象を機械的に広げると、正当なものを弾いてしまいます

詳しい経緯は botは、3種類いるに書きました。 この記事ではなぜその手順が有効なのかを扱っています。

[ 7 ]

検証できない相手は、どうするか

FCrDNS が使えるのは、逆引きを整備している事業者だけです。 それ以外の相手には別の方法が要ります。

方法内容適用できる範囲
逆引き+正引きDNS の設定権限を確かめる主要クローラ
公開 IP レンジ事業者が公開する一覧と照合一覧を出している事業者
署名による認証リクエストに署名を付ける標準化が進行中
行動の観察名乗りと挙動が一致するかすべて

署名という方向

前回扱った電子署名を、 リクエストに付ける仕組みが検討されています。 bot が自分の秘密鍵で署名し、サーバーが公開鍵で検証する—— UA の詐称を根本的に防げます。

ただし、bot 側とサーバー側の双方が対応する必要があります。 普及には時間がかかるでしょう。

名乗りが確かめられないなら、行動を見る

最後に残るのは、実際の挙動と照らす方法です。

観察する点正規のクローラなら
404 の割合低い。存在するページを辿る
アクセスの間隔負荷をかけない程度に抑える
robots.txt の取得巡回の前に読みに来る
アクセスするパス管理画面や設定ファイルを狙わない
名乗りは自己申告でも、行動は隠せません。 「Googlebot です」と言いながら 存在しない管理画面を1秒間隔で叩くなら、 名乗りが何であれ判断できます。 確かめられないものに頼らず、確かめられるものを見る
[ 8 ]

まとめ

4本を通じて見てきたのは、「名乗りは、それだけでは意味を持たない」ということでした。

HTTPS は経路上の書き換えを防ぎ、SNI と Host の照合は食い違いを検出し、 署名は作成者を特定する。 どれも「確かめる仕組み」があって初めて、名乗りに意味が生まれます

この記事のまとめ

  • 名乗りには検証手段のあるものと、ないものがある。UA と Referer には無い。
  • UA はもともと表示の調整のためのもの。身元の証明用ではない。
  • IP だけは詐称しにくい。応答を返せなければ通信が成立しないため。
  • だから IP を手がかりに UA を裏づける——FCrDNS。
  • 逆引きだけでは不十分。PTR は IP の持ち主が自由に書けるから。
  • 正引きで戻して確かめる。設定権限の違う2つを突き合わせるのが原理。
  • 実測では7日間で詐称6件。すべてデータセンター事業者のドメインだった。
  • 検証できない相手には行動を見る。名乗りは偽れても、挙動は偽りにくい。

関連記事