【基礎編1】DNSサーバ群構成に関する比較検討
DNSはインターネット黎明期から使われているプロトコルで、ホスト名とIPアドレスを関連付ける役割を担っています。
近年ではBOTネットからのDNSサーバに対するDoS攻撃等の脅威、またDNS自体の抱える実装上のセキュリティの課題、また広く普及しているDNSミドルウェアであるbindの脆弱性に対する問題などDNSが抱える課題が浮き彫りとなり、以前よりもDNSに対して多層防衛/セキュリティ性向上の必要性が増加しています。
今回は、これらの脅威から防衛可能な比較的安全であるDNSサーバの構成に関して検討/比較を行います。
DNSを取り巻くセキュリティの脅威
中規模以上のNW/ITインフラを持つ企業/組織はファイヤーウォール、UTM、IPSなどのNWセキュリティ機器/機能を導入しています。しかしながらDNSという仕組み単体を見ればDNS自体のセキュリティに注視しているケースは少ないです。DNSはインターネットの根幹に近い仕組みであるため、万が一DNS経由でセキュリティの問題が発生した際に深刻な問題となります。
DNSサーバに対する攻撃にもいくつかあり、攻撃の種類はDNSその物に対する攻撃の場合、別の攻撃を行うための中間として利用するための攻撃である場合の2種類に分類されます。
特にDNSサーバ自体に対するDoSであればまだマシですが、DNSサーバのデータが書き換えられる攻撃は企業/組織内の機密データの流出、ランサムウェアの被害などの可能性となりうるため非常に危険です。
DNSを取り巻くセキュリティ攻撃の種類に関する詳細は「基礎編2」で展開予定です。
DNSサーバ構成の比較検討
企業/組織ITインフラにおけるDNSサーバの構成は大きく以下の2つのパターンに分けられます。
DMZにDNSサーバを置く構成
この構成は小規模/中小企業のITインフラにおけるDNSサーバの構成で、ITに対する理解が不十分な社内IT担当者が独自に構成しうるケースです。
非常にセキュリティリスクのある構成となり外部の攻撃者の格好の的の構成といえます。

運用の観点では非常に扱いやすいと言えますが、セキュリティは最悪です。
DMZ/内部ネットそれぞれDNSサーバを置く構成
この構成は中規模以上のITインフラにおけるDNSサーバの構成です。
外部用DNSと内部用DNSに分けることでセキュリティ性向上と社内用DNS機能の分離が見込めるオーソドックスな構成です。

規模の大きいNWでは内部DNSサーバを権威サーバ/キャッシュサーバと分ける構成にしたり、キャッシュサーバを冗長化する構成案も検討されます。こういった細かな要件は企業/組織内のクライアント数や求める非機能要件(冗長性/耐障害性など)にもよるため、適宜合わせて構成することになります。
権威DNSサーバとDNSキャッシュサーバを同居する危険性
これまでのDNSサーバの構築/運用ではDNSサーバの権威サーバ機能、キャッシュサーバ機能を同居させて運用するケースが非常に多いです。
実はこの構成はDNSキャッシュポイズニングと呼ばれる、偽の情報をDNSサーバにキャッシュさせる攻撃に対して脆弱性が生じ得ます。これはDNSキャッシュサーバが外部からの不正な応答を信じてしまうことに原因があります。
そのため、この攻撃を防ぐためには、キャッシュサーバを外部の脅威から隔離することが最も重要となります。
具体的にはスプリットDNS/スプリット・ホライズンDNSと呼ばれる手法により実現します。
この手法では権威DNSサーバとDNSキャッシュサーバをOSレベルでの分離(サーバ分離)、もしくはサービス単位での分離(異なるソフトウェアでの実装)を行います。
大規模なITインフラ環境ではサーバ分離レベル、事情がある場合等はサービス単位の分離レベルでの実装が推奨されます。
DNSサーバソフト(OSS)の比較検討
BIND
BINDはDNSサーバソフトとしてもっとも有名なソフトウェアです。アメリカのISCが開発しています。
多くのUNIX/オープン系では標準のDNSサーバとなっており、権威DNSサーバ/キャッシュサーバ機能が1つのプログラム(named)で兼用するという設計上の仕様から脆弱性が多く報告されていることでも有名です。
大規模なITインフラ環境では、BINDを権威DNSサーバとして利用し、再帰的な問い合わせ(キャッシュサーバ機能)は無効にする運用が一般的となっています。
WebUIによる管理を行う場合はWebminやBIND Administratorなどのサードパーティツールで実現可能です。
PowerDNS
PowerDNSはPowerDNS Authoritative Server(権威サーバ)とPowerDNS Recursor(キャッシュサーバ)という2つのコンポーネントに分かれて構成されているDNSソフトウェアです。
コードがシンプルで脆弱性が少ないと評価されており、セキュリティが高いとされています。 RDBMSやLDAPをバックエンドとして利用できるほか、大量のゾーンを効率的に管理可能です。
また、PoweradminというサードパーティのWebUIがあり、ゾーン管理をGUIで簡単に行えるのが大きな特徴です。
NSD
権威DNSサーバー機能に特化しているDNSサーバです。
https://nlnetlabs.nl/projects/nsd/about/
シンプルで高速な設計が特徴で、セキュリティを最優先に開発されています。設定ファイルも分かりやすくく、権威サーバとして、高速かつ安定した運用が求められる環境で使用されます。
Knot DNS
Knot DNSが権威サーバ、Knot Resolverがキャッシュサーバと、機能が分離して提供されているDNSサーバです。
NSDと同様に高速で、特にDNSSECの運用がしやすいのが特徴です。設定ファイルもシンプルに保つことができ、大規模なゾーン管理に適しています。
dnsmasq
dnsmasqは主にDNSキャッシュサーバーとして機能しますが、小規模な環境では簡易的な権威サーバーとしても利用できます。またDHCPサーバ機能も保有しています。
小規模ネットワーク向けに特化しているため。設定が非常に簡単で、SOHOや家庭内ネットワークでよく使われます。
Unbound
DNSキャッシュサーバに特化した権威サーバー機能がないDNSサーバソフトです。
https://nlnetlabs.nl/projects/unbound/about/
DNSSEC検証を重視した設計で、DNSキャッシュポイズニング攻撃に強いと評価されています。設定は比較的シンプルで、高速かつセキュアなキャッシュサーバーとして広く利用されています。
CoreDNS
プラグインベースのDNSサーバで、権威サーバ/DNSキャッシュサーバ機能を実装可能です。
必要な機能だけを組み合わせて構築できるのが特徴で、特にKubernetesのクラスター内でDNSサービスを提供する際のデファクトスタンダードとなっています。設定はCorefileという独自の形式で行います。
DNSのセキュリティ技術
以下の2つの技術(DNSSEC, DNSクッキ)はDNSキャッシュポイズニングという攻撃手法に対する耐性を高め、データの信頼性を高める技術です。
両方とも多くのDNSサーバソフトウェアで実装されていますが、DNSSECの包括的な対策性とDNSクッキの運用上の課題の観点からDNSSECの方が広く普及しています。
DNSSEC
DNNSECはDNSの応答に偽造が難しい電子署名を追加し、応答の受け手側で検証できる機能を追加したものです。 DNSSECの機能は受け取った応答のオリジンと完全性を問い合わせ側で追加できるようにします。
DNSクッキ
DNSクッキはHTTPで利用されているクッキーの技術と同等の仕組みをDNSのやり取りにおいても実現するための仕組みです。
https://tex2e.github.io/rfc-translater/html/rfc7873.html
HTTP/HTTPSにおけるクッキー(FirstPartyCookie)は通信相手が前に通信を送った相手か同じ相手かどうかを判断するためのもの(主にサーバ側が検証するために使用)ですが、DNSクッキにはお問い合わせに付加するクライアントクッキーと応答に付加するサーバクッキーの2種類があり、問い合わせ側/応答側が双方で相手を確認できます。これはHTTP/HTTPSのクッキーにはない特徴/特性といえます。
総括
今後はサイバーセキュリティ上の脅威の増大に伴い、DNSサーバもセキュリティ構成を意識した実装/構築が求められます。具体的には以下内容が必要になるでしょう。
- 外部用DNS/内部用DNSを必ず分離する
- 権威DNSサーバ/キャッシュDNSサーバ機能の分離をOS/ソフトウェアレベルで行う
- bindは運用上/脆弱性対応の観点からbindを主DNSサーバとして用いない(使用してもキャッシュサーバなど機能を限定する)
- DNSSEC機能をDNSサーバに実装する
次回はDNSをとりまくセキュリティ上の脅威に関してまとめます。