(1/2)DNSは広く公開するサービスであるため、その運用には細心の注意が要求される。BINDを攻撃者から守るには何をすればよいか。今回はBINDで行うべきセキュリティ対策を紹介する。});もともとがパブリックなサービスであるDNSは、ゾーン情報を広く知らしめるための手段であり、そこへアクセスする対象も不特定多数です。キャッシュサービスは利用対象者を限定することができます。セキュアなサービスを提供するには、まずBINDの働きを整理し、それに応じた方策と万が一の場合の善後策を準備する必要があります。DNS全般の対策キャッシュサーバとゾーンサーバの分離キャッシュサーバとゾーンサーバとでは、セキュリティに対するアプローチもサービスを利用する対象も違います。サーバを物理的に、できればキャッシュサーバはNAT配下などのクローズドな環境で利用することが望ましいといえます(図1)。キャッシュサーバとゾーンサーバの分離ゾーンサーバでキャッシュサービスを提供しないのであれば、named.confを次のように設定し、一切の再帰問い合わせを無効にします。●専用ユーザーとchrootの利用rootをはじめとするユーザー権限の奪取は、ソースコードに潜むバッファオーバーフローを突くことで行われます。ユーザーには、ソースコードそのものの脆弱性を是正することは簡単にはできません。バッファオーバーフロー脆弱性が報告されたら、問題のBINDのアップデートを行う以外にすべはありません。そこで、ユーザー権限が奪取されてしまった場合を前提とした策として、最小権限のユーザーでnamedプロセスを起動することが考えられます。本連載では第1回以降、一貫してnamedプロセスの起動はnamedユーザー、namedグループを使用しており、この方法はすでに導入済みのはずです。今回はもう一歩踏み込んで、chrootを導入します。chrootはファイルシステムのルートディレクトリの位置を変更する機能で、特定のプロセスに対して任意のディレクトリをルートディレクトリに見せかけることができます。あるディレクトリへchrootすると、そのプロセスとその子プロセスは、chrootしたディレクトリより上の階層のファイルにアクセスできなくなります(注)。ユーザー権限が奪われてしまっても、jail(牢獄)に幽閉してしまおうというわけです(編注)。注:chrootはFTPサービスでは常とう手段となっており、多くの場合ログイン直後のホームディレクトリを「/」にします。編注:本記事で「jail」と呼んでいるのは、chroot環境のことである。FreeBSDのjailコマンドとは無関係であることに注意。BINDはchrootを考慮した実装がすでに行われており、named起動時のオプションの1つとして指定可能です。後は、chrootでルートディレクトリに見せかけるディレクトリを準備するだけです。/var/namedをjailとする場合を例に手順を見ていきましょう(注)。9がインストールされていることを前提にしています。第1回や第2回を参考に、インストールしておきましょう。jailに以下のファイルを用意します。9のログで利用状況を把握する」で使用します。ゾーンファイルの保存先として使用していた/var/namedは、整理しやすいようにリネームして新たな/var/namedを用意します。/var/named$jail下に移動し、必要なディレクトリを用意します。mkdir実行の際は「-p」オプションを指定し、一気に親ディレクトリとサブディレクトリを作成します(参考:親ディレクトリとサブディレクトリを同時に作成するには)。var/named$jail/etc下に、named.confファイルとlocaltimeファイルを用意します。localtimeファイルは、namedプロセスが日付時間関数を使用する場合にローカルなタイムゾーンを取得し、正しい時刻を得るのに必要です。$jail/etc/named.confを用意する際は、オリジナルの/etc/named.confをリネームしておきます。/etc/named.conf.org次に、ゾーンファイルを用意します。ここでは、以前/var/namedで使用していたものをそのまま使用します。/var/named/var/named/.ここで、ファイルのパーミッション/オーナー/グループを整えます。$jail下はnamedユーザー/namedグループで、/var/namedへのアクセスを限定します。/var/named最後に、mknodコマンドを使用して$jail/dev下にデバイスファイルを作成します。*namedの起動の際は、「-t」オプションで$jailを指定します。/var/named注:namedのパスはインストール状況に合わせて変更してください。/var/named」の指定を行います。Linuxは、起動スクリプトを編集しなくても、/etc/sysconfig/namedファイルに下記の行を追加するだけで構いません。ROOTDIR="/var/named"/etc/sysconfig/namedjail利用時は、$jail/etc/named.conf(/var/named/etc/named.conf)がデフォルトで使用されます。起動スクリプトの多くは、named起動の条件として/etc/named.confの有無を確認するため、以下のような修正を加えます(注)。Linuxは「${ROOTDIR}/etc/named.conf」で定義されているため、変更の必要はありません。0/etc/init.d/named(修正後)named.confファイルの修正は特に必要ありません。-tオプションを指定することで、設定ファイル中の各ルート(/)ディレクトリは$jailに変換されます。本稿では、named.confに「include」を用いた外部ファイルの読み込みは紹介しませんが、includeを使用する場合もファイルパスは$jailをルートディレクトリに見立てるため、外部ファイルは$jailに合わせてコピーや移動しておきます。注:このような場合は、rndc.keyファイルを/var/named/etc/に置く必要があります。設定したら、/var/log/messagesに出力されるメッセージやdigコマンドなどを利用して、正常に動作しているかどうかを確認します。/var/namedを実行し、先に紹介したファイル一覧がすべて用意されているか確認しましょう。BINDのバージョンを非表示にする使用しているBINDのバージョンは、外部からでも簡単に引き出すことができます。"9.2.2"(省略)バージョンが分かることで、バージョン特有の脆弱性を攻撃される可能性があるため、意図的にバージョン名を隠ぺいまたは置き換えます。Service)攻撃は、サーバそのものに及ぶ被害より、DNSとして正常なサービスを提供できなくなることに留意する必要があります。PingやAckなどの不特定で大量のパケットを送り付けるため、未然に防ぐことは困難です。そこで、DoS/DDoS攻撃を早期に発見し、攻撃元および攻撃対象を特定して中継装置でのフィルタリングやサーバ自身でのiptablesなどを用いたパケット制限(Linuxで作るファイアウォール[パケットフィルタリング設定編])を実施します。named.confのoptionsステートメント中のblackholeで攻撃元のIPを指定し、一切の問い合わせ要求を無視するようにします。肝心なのは、現在攻撃を受けているのか、被害が出ている場合はどこから攻撃を受けているかを一刻も早く察知することです。9のロギング機能を有効にするなど、日ごろの運用監視が重要になります。9のロギング機能を有効にする方法について説明します。rndcの設定および使用方法については、第5回を参照してください。次にrndcの引数にstatsを指定し、/var/named/下(jailを使用している場合は$jail/var/named/下)に統計情報を出力させます。新しいデータは、ファイルの末尾に追加されます。crontabなどを利用して、必ず等間隔で統計情報を出力するようにし、異常な増加が見られないか確認するようにしましょう。rndcの統計情報は貴重な情報ですが、数字のままで確認するのはあまり効率が良くありません。そこで、数値を基にMRTGなどのグラフ化ユーティリティで視覚的にとらえられるデータを作成するなどの工夫が必要です。9の運用管理の紹介で取り上げます。9のロギングを有効にする方法を見ていきます。9が出力するログはsyslogdを通して/var/log/messagesに記録されます。ところが/var/log/messagesには、BIND以外にも/etc/syslog.confの設定によってさまざまなサービスのログが出力されており、あまり可読性が良いとはいえません。BINDのログももう少しきめ細かいものが望まれます。そこで、named.confにloggingセクションを追加してさまざまなログを出力するようにします。#クライアントログをlog_securityの定義どおりに出力};/etc/named.conf(jailを導入している際には$jail/etc/named.conf)攻撃元を簡単に特定するため、問い合わせクエリーをすべて記録することもできます。全クエリーが出力されるため、サーバリソースの消費に注意します。9の運用監視」で紹介します。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。