DNS
DNSの役割
名前解決を行う。
- IPアドレス→ホスト名 正引きという
- ホスト名→IPアドレス 逆引きという
どのホスト名をどのIPアドレスにマッピングするかが書かれたファイル(名前解決に使用する情報)をゾーンファイルという。
DNSの種類
- コンテンツサーバ
- キャッシュサーバ
の2種類に分かれる。
コンテンツサーバはゾーンファイルを使って名前解決を行う。一方、キャッシュサーバは自身のコンテンツは持たず、コンテンツサーバへの過去の問い合わせ情報をキャッシュとして格納し問い合わせに対応する。
DNSの問い合わせフロー
DNSに対して問い合わせする場合はトップレベルドメインと呼ばれるURLの末尾のドメインから順番に問い合わせを行う。 ※キャッシュが存在しない場合
例えばwww.google.com
を名前解決したい場合には以下のフローとなる。
.
を管理するDNSに問い合わせ.com
を管理するDNSを取得する.com
を管理するDNSに問い合わせgoogle.com
を管理するDNSを取得するgoogle.com
ドメインに問い合わせwww.google.com
を管理するDNSを取得する
ただし実際は全てのパソコンがこのような挙動をすると.
や.com
などを管理するDNSに通信が集中してしまったり、レスポンスまでに時間がかかるためキャッシュサーバを置くことで対応する。キャッシュサーバ内に過去問い合わせた履歴が残っていれば再度問い合わせする必要がなくなるのである。
2種類の問い合わせ方法
DNS情報を問い合わせる時には2種類の方法がある。
- 再帰的問い合わせ(recursive query)
- 非再帰的問い合わせ(non recursive query)
両者の違いはどこまで責任を負うかである。再帰的問い合わせは名前解決が行われるまで続くが、非再帰的問い合わせは自分が持っているゾーンファイル内の情報になければ他のDNSのアドレスを返却する。
具体的にいえば「クライアント→キャッシュDNS」という構成があった場合にクライアントが名前解決を求める場合はキャッシュDNSに再帰的問い合わせを行う。すなわち名前解決の結果を教えろという命令だ。そしてキャッシュDNSは自身にキャッシュされている情報であればそのまま返すが、そうではない場合は先ほど説明したようにそれぞれのドメイン情報をコンテンツサーバーへ問い合わせに行く。
コンテンツサーバーは自身が管理する範囲でしか名前解決を行わず、それ以外の場合は別のDNSのアドレスを返すため責任を負わない非再帰的問い合わせとなる。
DNS関連の攻撃(セキュリティ)
DNSキャッシュポイズニング
DNSのキャッシュポイズニングは、キャッシュサーバーに登録される情報を書き換えることでユーザが意図しないサイトへ飛ばす攻撃である。
この攻撃の回避策としては
- インターネットからの再帰的な要求を禁止する
- DNSのレコード情報を更新する間隔(TTL)を長くする
- 送信元ポートをランダムにすることで攻撃されにくくする
- DNSSECを使って送信元を保証する
カミンスキー攻撃
DNSのキャッシュポイズニングを効果的に行うための手法。
攻撃者はキャッシュサーバに対して存在しないドメイン名の再帰的問い合わせを行う。リクエストを受け取ったキャッシュサーバは他のサーバに非再帰的問い合わせを行うが、そのタイミングで攻撃者が存在しないドメインのレコードを返却することで不正な情報をDNSにキャッシングさせることが可能になる。
DNS増幅攻撃(DNS Amplification Attack)
再帰的問い合わせの処理を制限していないDNSサーバを踏み台にした攻撃です。送信元アドレスをターゲットのIPに偽装し、DNSへ問い合わせを大量に行うことでターゲットへのDDoS攻撃を実現する。
この攻撃の回避策としては
- インターネットからの再帰的な要求を禁止する
があります。攻撃を受ける側としてはISPやCDNのDDoSに関する防御プランを使用することで回避できる。