そらとぶへび

仕事・プライベートを通しての気づき、JavaやPHP、データベースやサーバの話などこつこつと書いていきます

DNSに関するあれこれ

f:id:lue4881:20160926231339j:plain

ここでは、DNSに関する基本とDNSキャッシュポイズニングに対する対策を紹介します。

DNSサーバの基本

DNSサーバはコンテンツサーバとキャッシュサーバに分類できます。

コンテンツサーバ・・・オリジナルのDNS情報を補完するサーバ
キャッシュサーバ・・・コンテンツサーバから得られたDNS情報を一時的に保管するサーバ

名前解決の問い合わせがあった場合、以下のような流れで、処理を行います。

  1. クライアントは通常、自組織のキャッシュサーバに再帰的な問い合わせを行う。
  2. キャッシュサーバは問い合わせを受けて、コンテンツサーバに問い合わせを行う。
  3. キャッシュサーバはコンテンツサーバから得られたDNS情報をクライアントに返答する。
  4. それと同時に、DNS情報のコピーを一定期間保存する。

問題点として、コンテンツサーバからの回答は、とくに認証を必要としないことです。つまり本物の回答の前に、偽の回答を返答してしまえば、うそのDNS情報をキャッシュサーバに記憶させることができてしまいます。これを、DNSキャッシュポイズニングといいます。

DNS情報を汚染されたキャッシュサーバに問い合わせをすると、攻撃者が設置した悪意のあるサーバに通信を誘導されます。また、大きなDNS情報を記憶させたうえで、キャッシュサーバに送信元を詐称した問い合わせを行うことで、DNSリフレクション(DNS amp攻撃)が行われます。

DNSサーバを運用する際には、自社が最終ターゲットでないとしても、踏み台にならないように対策が必要になってきます。

DNSレコード

DNSに保存されている名前解決情報尾をDNSレコードと呼び、以下の種類があります。

Aレコード   ・・・ホストのIPアドレス(IPv4)情報(例:dns IN A 192.186.0.1)
AAAAレコード ・・・ホストのIPアドレス(IPv6)情報(例:local IN AAAA ::1)
NSレコード  ・・・DNSサーバを指定する。(例;IN NS dns.xeample.com)
CNAMEレコード・・・別名を指定する。(例:www IN CNAME dns)   
SOAレコード  ・・・ドメイン情報(ドメイン名、管理者連絡先、レコードの有効期限など)
PTRレコード  ・・・逆引き(IPアドレスからホスト名)に使う。
MXレコード  ・・・メールサーバを指定する。メールサーバが複数ある場合は、プレファレンス値の小さいほうを優先する。
TXTレコード ・・・文字情報を書く。様々な用途があり、SPFレコード*1を書く、DKIM*2を署名するなどにも使える。

DNSSEC

下記記事で記載したように、DNSキャッシュポイズニング対策としてDNSSECがあります。
flyingsnake.hatenablog.com


DNSSECではコンテンツサーバがDNSレコードを返答するとき、ディジタル署名を行います。返答を受け取ったキャッシュサーバは、これを公開鍵で複合することで、正当なサーバであることを認証できます。

DNSSECで追加されるDNSレコード
DNSKEY ・・・公開鍵。キャッシュサーバはこれを使ってディジタル署名の復号をする。
DS    ・・・DNSKEYのハッシュ値
RRSIG  ・・・DNSレコードに対するディジタル署名

*1:SPF IPアドレスを利用した送信ドメイン認証。受信者はDNSサーバにSPFレコードを参照して、正当性を確認する。

*2:DKIM(Domainkeys Identified Mail ) ディジタル署名方式の送信ドメイン認証。受信者はDNSサーバから公開鍵を取得し、受信メールのディジタル署名の正当性を確認する。