3.5.1 DNSの脆弱性
2.6節でも触れたように、DNSについては、次のような脆弱性が指摘されている。
1 ゾーン転送機能によって第三者に登録情報が不正利用される可能性がある。
ゾーン転送要求は、セカンダリDNSサーバとプライマリDNSサーバの登録内容を同期させるため、前者から後者に対して敵機的に実行される。自社の外向けDNSサーバ(プライマリDNSサーバ)に対しては、上位プロバイダのDNSサーバをセカンダリDNSサーバとするのが一般的である。その場合、自社の外向けDNSサーバに対するゾーン転生要求は、上位プロバイダのDNSサーバから行われることになる。しかし、一般的なDNSサーバプログラムの初期設定では、ゾーン転送要求について特に制限がないため、そのままの設定で運用されていると悪意のある第三者が情報収集のために実行することも可能である。
2 不正な情報をキャッシュに登録することができる可能性がある。
いくつかのDNSサーバプログラムの使用上、実装場の脆弱性により、名前解決要求への応答の際に、悪意のあるサイトに誘導するための不正な名前解決情報を返すことで、DNSのキャッシュに登録させるこtができる可能性がある。このような手法はDNSキャッシュポイズニング攻撃と呼ばれる。 DNSキャッシュポイズニング攻撃を成功させるためには、攻撃者は送信ポート番号(名前解決要求の送信元ポート番号であり、応答時の宛先番号となる)、トランザクションIDを本来の応答レコードと合致させる必要がある。しかし、送信ポート番号、宛先ポート番号ともに53番に固定する設定となっているDNSサーバは数多く存在し、DNSキャッシュポイズニング攻撃を容易にさせている。また、トランザクションIDが16ビット(最大65536通り)であることも攻撃を容易にさせている。
3 不正なリクエストによってサービス不能場となる可能性がある。
いくつかのDNSサーバプログラムの実装場の脆弱性により、DOF攻撃やDoS攻撃を受けて正常なサービスが提供できなくなる可能性がある。
3.5.2 DNSの脆弱性への対策
1 DNSサーバプログラムのバージョンアップ
全てのDNSサーバプログラムのバージョンを最新かし、バッチを適用する。
2 DNSの送信元ポート番号のランダム化
ソースポートランダマイゼーションと呼ばれるもので、多くのDNSソフトウェアに実装されている。これを行うことで、仮眠スキー攻撃をはじめとしたDNSキャッシュポイズニング攻撃が成功する確率を大幅に低減することができる。
3 DNSSEC(DNS Security Extensions)
DNSSECはDNSのセキュリティ拡張方式であり、DNSキャッシュポイズニング攻撃への有効な対策となる。DNSSECは、名前解決要求に対して応答を返すDNSサーバが、地震の秘密鍵を用いて応答レコードにディジタル署名を付加して送信する。応答を受け取った川は、応答に返したDNSサーバの公開鍵を用いてディジタル署名を検証することで応答レコードの正当性、関税性を確認する。
4 外部向けゾーン情報と内部向けゾーン情報の分離
- 外向けゾーン情報を登録する公開DNSサーバと、内部向けゾーン情報を登録する内部DNSサーバとに分ける。
- 公開DNSサーバには内部ゾーン情報は一歳登録しない
- 内部DNSサーバには必要に応じて公開DNSサーバに登録されているゾーン情報も登録する。
5 コンテンツサーバとキャッシュサーバの分離
前述に加え、DNSサーバの機能を次の図のように分離し、機能ごとに別個のサーバを設置する(公開用と内部ようで最低4台のDNSサーバを設置)。
DNSサーバの分離運用の例 |
---|
6 ゾーン転送の制限
- インターネットからのゾーン転送要求を受け付ける必要がない場合には、公開DNSサーバに対する53/TCPのアクセスをファイアウォールでフィルタリングする
- ゾーン転送するデータの範囲を最小限に設定する
7 キャッシュサーバのw利用可能なホストの範囲を制限(オープンリゾルバ対策)
キャッシュサーバを利用可能なホストのIPアドレス(ネットワークアドレス、もしくはホストごとの個別のアドレス)を同サーバの設定ファイルに登録する。例えばインターネット場のドメイン名について名前解決を許可するのは自組織のホストのみに制限する。
8 キャッシュサーバへの問い合わせ数を制限
キャッシュサーバに対するクライアントからの問い合わせ(再起的な問い合わせ)数を適切なあたいに設定することで、DoS攻撃に備える。
9 DNSサーバプログラムのバージョン情報の隠蔽
DNSサーバプログラムの設定によって、バージョン情報を任意の文字に置き換える(実際のバージョン情報を隠蔽する)。
3.5.3 512オクテット制限への対応
DNSの名前解決では通常UDP53番ポートを使用するが、この時一つのパケットに格納できるデータは512オクテットに制限されている。データが512オクテットを超えた場合は、DNSサーバはTC(Truncation)ビットをセットして返信することによってデータが切り捨てられたことを問い合わせ元のホストに伝える。それを受け取ったお問い合わせ元のホストは、TCP53番ポートを使用して再度問い合わせをする。この仕組みをTCPフォールバックという。TCPフォールバックでは、コネクション型のTCPを使用するため、UDPを使用する場合と比べ、DNSサーバへの負担が高まるとともに応答時間が遅くなるという問題がある。
この問題を解決するものとして、EDNS0(Extension mechanism for DNS version 0)がある。EDNS0はDNSの拡張機能であり、通信可能であればUDPパケットサイズを最大65535オクテットまで拡張することができる。EDNS0では、OPTリソースレコードによって問い合わせ元のUDPパケットサイズを識別子、DNSサーバ側では指定されたサイズに合わせて応答データのサイズを調整する。当然のことながら、EDNS0を使用するためには、DNS通信を行うサーバ、クライアントの双方がEDNS0に対応している必要がある。
近年IPv6、DNSSEC、SPF、DKIMなどの普及により、DNSで取り扱うデータは拡大傾向にあるため、512オクテット制限の問題がより現実的なものとなって来ている。こうしたことから、IPv6やDNSSECのデータを取り扱うDNSサーバについてはEDNS0をサポートすることが必須とされている。