chroot/jailでbindに不正侵入対策


DNSサービスへのDoS攻撃等により万一ホストへ不正侵入された場合に備えて、chrootにより他のファイルへのアクセスを防止する手順を概説します。

DNSは狙われている

DNSサービスは、TCP/IPネットワークを支える必要不可欠な機能であり、外部向けDNSサービス(UDP ポート53)は任意の外部ホストに対して解放しなければならないため、クラッカーの攻撃の格好の標的となります。DNSサービスに対するクラッキングの結果以下のような重大な被害をこうむる可能性があります。

  • キャッシュ内に「汚染情報」(虚偽のデータ)をもぐりこませることによって、ホストのなりすましを行う。
  • DNSサーバソフトウェアの脆弱性を狙ったDoS攻撃により特権ユーザとしてプログラムを実行し、DNSホストを乗っ取る。

DNSサービスのデファクト・スタンダードであるBINDは、Ver.8.8以前のリリースにDoS攻撃によりアクセス権を取得することができるというセキュリティ・ホールがあり、実際HTTPについでクラッカーの格好の攻撃対象になっています。対策後のバージョン(8.8以降)ではこの脆弱性は除去されていますが、露出度の高いサービスである以上、今後も新たな攻撃の対象となる潜在的なリスクは否定できません。万一、新たな脆弱性により不正にアクセス権を取得された場合に備えて、「CHROOT」機能を利用してBINDネームサーバの実行ファイル、設定ファイル、ゾーンファイルを、他のファイルシステムから完全に隔離された特別なファイル・システム(通称”jail”)に収容することにより、被害を「JAIL」内にとどめることができます。(EIS 「DNS構築サービス」ではCHROOTによるセキュリティを標準的に採用しています)。

BINDのCHROOT設定

“CHROOT”機能は、ファイル・システム内の特定のサブディレクトリを、プロセス対してルート・ディレクトリとして見えるようにすることにより、そのサブディレクトリの外部へのファイル・アクセスを防止する機能です。限定的なアクセス権限のみを与えたそのプロセス実行専用のユーザを作成し、その権限でプロセスを実行することにより攻撃に対する耐久性が向上します。 BINDの場合、以下のようにnamedデーモン起動時に -t オプションでディレクトリを指定することにより、CHROOT機能を利用することができます(-t で指定されたディレクトリをルートディレクトとして動作します)。これによって、DoS攻撃等の結果namedのアクセス権を取得されても、被害はそのディレクトリ内のファイルのみに限定されますので、ファイア・ウォール等、ネットワーク的な手段による攻撃対策と併用することにより高度な安全性を確保することができます。

chrootを使用するnamedの起動方法

以下は、namedをchroot指定で起動する際のコマンドラインパラメータの例です。

usr/local/sbin/named -u named -t /chroot/named -c /etc/named.conf &

-t で指定された/chroot/namedがデーモン起動後 “/”として参照される。従って、namedデーモンからアクセスできるファイルシステムは”/chroot/named”以下のみとなり、本来の”/”以下のファイルシステムはまったくアクセス不能となります。たとえば、-c で指定されたBINDの設定ファイル”/etc/named.conf”については、実際には”/chroot/named/etc/named.conf”が参照されるが、デーモンにとってこのファイルは、”/etc/named.conf”にしか見えません。 /chrootに独立したパーティションを与え、アクセス権、オーナシップを最大限厳しいものとしておけば、万一、DoS攻撃によりアクセス権を取得されてしまったとしても、侵入者はこの「JAIL(牢屋)」の外に出て、更に貴重な資源に危害を加えることができず、被害を最小限にとどめることができます。

参考: RedHat系のLinuxで既存のrcスクリプトを使用している場合、/etc/sysconfig/namedファイルの中に”ROOTDIR=<物理パス>”を記述することにより、chrootの対象ディレクトリを指定することができます

また、ファイルシステムを/chrootにRead Onlyでマウントしておけば、ファイルの改竄ももほぼ回避できます(Dynamic DNSなどのように、ファイルへの更新を必要とする場合には工夫が必要です)。

chrootディレクトリを構成する

chrootした場合、namedデーモンから参照・実行できるのは/chrootディレクトリ以下のディレクトリやファイルだけです。このため、/chrootディレクトリ以下には、null,randomなどのディバイスファイルを含むnamedデーモンの処理に必要なすべてのディレクトリとファイルを再現しておく必要があります。以下は、/chrootディレクトリ以下のファイル構造を構成する手順です。

ディレクトリの作成とパーミッションの設定

#mkdir -p /chroot/named
#cd /chroot/named
#mkdir -p dev etc var/run var/log var/named
#mknod dev/null c 1 3
#mknod dev/random c 1 8
#chmod 666 /chroot/named/dev/{null,random}
#cp /etc/localtime etc/
#chown root /chroot
#chmod 700 /chroot
#chown named:named /chroot/named
#chmod 700 /chroot/named

  このように/chroot/named以下に必要なディレクトリとファイルの構成が終了したら、あとは、/chroot/namedディレクトリが通常のルートディレクトリ(“/”)なのだと意識しながら、通常通り、bind.conf、zoneファイル等の作成・編集をおこなってください。

2009年7月16日 | カテゴリー : DNS, BIND | 投稿者 : eurotec