Product SiteDocumentation Site

5.7. BIND を安全にする

Domain サーバデーモンを安全にするために取り組まなければならない問題がいくつか あります。これは他のどのサービスを安全にするときも検討されることです:
  • 外部から乱用されないようにデーモン自体を適切に設定しましょう。 これにはクライアントから可能な問いあわせの個数を制限すること (zone transfers や逆引きの問いあわせ) が含まれます。
  • サーバへ侵入するのに使われたときシステムへの損害が限られるように デーモンからサーバそのものへのアクセスを制限しましょう。これにはデーモンを 非特権ユーザで動かすことや chroot することが含まれます。

5.7.1. Bind configuration to avoid misuse

あなたの組織のもらしたくない貴重な情報を引きだすのに使えないように DNS サーバから外部のクライアントへ提供される情報を制限するべきです。これには 以下のオプションを追加することが含まれます: allow-transferallow-queryallow-recursive、そして version です。これを (提供される すべてのゾーンに適用されるように) グローバルセクションで制限することも できますし、ゾーンごとに制限することもできます。この情報は bind-doc で文書化されています。このことについて くわしくはそのパッケージをインストールしたあと /usr/share/doc/bind/html/index.html をごらんください。
あなたのサーバがインターネットと内部の (あなたの内部 IP は 192.168.1.2 だと します) ネットワークに接続されていて (基本的なマルチホームのサーバです)、 インターネットにはサービスを何も提供したくはなく、内部のホストからだけ DNS 参照ができるようにしたいとしましょう。 /etc/bind/named.conf にこれを追加することによって DNS 参照を 制限できます:
options {
            allow-query { 192.168.1/24; } ;
            allow-transfer { none; } ; 
            allow-recursion { 192.168.1/24; } ;
            listen-on { 192.168.1.2; } ;
            forward { only; } ;
            forwarders { A.B.C.D; } ;
};
listen-on オプションは DNS が内部アドレスを持つインターフェイスだけを バインドするようにしますが、このインターフェイスがインターネットに接続されて いるインターフェイスと同じでも (たとえば NAT を使っているときなど)、 問いあわせは内部のホストから来たときのみ受けいれられます。システムに インターフェイスが複数あって、listen-on がないときは、内部ユーザ だけが問いあわせることができますが、このポートは外部の攻撃者からもアクセス できるので、攻撃者は DNS サーバをクラッシュさせようと (またはバッファ オーバーフロー攻撃を行おうと) するかもしれません。自分自身以外のどの システムにも DNS サービスを提供しないなら 127.0.0.1 にだけ応答するように することさえできます。
chaos クラスの version.bind レコードは現在動いている bind プロセスの バージョンを含みます。この情報はしばしば自動スキャナや、bind が特定の攻撃に 対して脆弱であるか調べたい、悪意ある人に利用されます。version.bind レコードでうその情報を提供したり、情報を何も提供しないことによって、 公開されているバージョンにもとづいてサーバが攻撃される確率を制限することが できます。独自のバージョンを提供するには、version ディレクティブを 次のように使ってください:
options {
        ... various options here ...
        version "Not available.";
};
version.bind レコードを変更することは攻撃に対する実際の保護にはなりませんが、 役に立つ防御策と考えられるべきです。
A sample named.conf configuration file might be the following:
acl internal {
        127.0.0.1/32;           // localhost
        10.0.0.0/8;             // internal
        aa.bb.cc.dd;            // eth0 IP
};

acl friendly {
        ee.ff.gg.hh;            // slave DNS
        aa.bb.cc.dd;            // eth0 IP
        127.0.0.1/32;           // localhost
        10.0.0.0/8;             // internal
};

options {
        directory "/var/cache/bind";
        allow-query { internal; };
        allow-recursion { internal; };
        allow-transfer { none; };
};
// From here to the mysite.bogus zone 
// is basically unmodified from the debian default
logging {
        category lame-servers { null; };
        category cname { null; };   
};

zone "." {
        type hint;
        file "/etc/bind/db.root";
};

zone "localhost" {
        type master;
        file "/etc/bind/db.local";
};

zone "127.in-addr.arpa" {
        type master;
        file "/etc/bind/db.127";
};

zone "0.in-addr.arpa" {
        type master;
        file "/etc/bind/db.0";
};

zone "255.in-addr.arpa" {
        type master;
        file "/etc/bind/db.255";
};

// zones I added myself
zone "mysite.bogus" {
        type master;
        file "/etc/bind/named.mysite";
        allow-query { any; };
        allow-transfer { friendly; };
};
Please (again) check the Bug Tracking System regarding Bind, specifically http://bugs.debian.org/94760. Feel free to contribute to the bug report if you think you can add useful information.

5.7.2. Changing BIND's user

BIND の権限を制限することについては、もし root でないユーザが BIND を 動かしたら、BIND は新しいインターフェイスを自動的に検知できなくなるという ことを知っておかなければなりません。たとえば、PCMCIA カードをラップトップに さしこんだときです。このことについてくわしくは named 文書ディレクトリの README.Debian (/usr/share/doc/bind/README.Debian) を ごらんください。BIND に関するセキュリティ問題が最近多くあります。よって ユーザを切りかえることは可能ならば役に立ちます。
Notice, in any case, that this only applies to BIND version 8. In the Debian packages for BIND version 9 (since the 9.2.1-5 version, available since sarge) the bind user is created and used by setting the OPTIONS variable in /etc/default/bind9. If you are using BIND version 9 and your name server daemon is not running as the bind user verify the settings on that file.
BIND を異なるユーザで動かすには、まずそのために別個のユーザおよびグループを 作ってください (root として動いていないサービスすべてに nobody または nogroup を使うのはよい考えではありません)。この例では、 named というユーザおよびグループが使われます。これはこう入力する ことによって可能です:
addgroup named
adduser --system --home /home/named --no-create-home --ingroup named \
      --disabled-password --disabled-login named
Notice that the user named will be quite restricted. If you want, for whatever reason, to have a less restrictive setup use:
adduser --system --ingroup named named
そこであなたのすきなエディタで /etc/init.d/bind を編集し、
start-stop-daemon --start
to[39]
start-stop-daemon --start --quiet --exec /usr/sbin/named -- -g named -u named
Or you can change (create it if it does not exit) the default configuration file (/etc/default/bind for BIND version 8) and introduce the following:
OPTIONS="-u named -g named"
Change the permissions of files that are used by Bind, including /etc/bind/rndc.key:
-rw-r-----    1 root     named          77 Jan  4 01:02 rndc.key
and where bind creates its pidfile, using, for example, /var/run/named instead of /var/run:
$ mkdir /var/run/named
$ chown named.named /var/run/named
$ vi /etc/named.conf
[ ... update the configuration file to use this new location ...]
options { ...
        pid-file "/var/run/named/named.pid";
};
[ ... ]
Also, in order to avoid running anything as root, change the reload line in the init.d script by substituting:
reload)
       /usr/sbin/ndc reload
こう変更します:
reload)
        $0 stop
        sleep 1
        $0 start
Note: Depending on your Debian version you might have to change the restart line too. This was fixed in Debian's bind version 1:8.3.1-2.
あと必要なのは「/etc/init.d/bind restart」で bind を再起動し、こういう 2 行が syslog にないかさがすだけです。
Sep  4 15:11:08 nexus named[13439]: group = named
Sep  4 15:11:08 nexus named[13439]: user = named
Voilà! Your named now does not run as root. If you want to read more information on why BIND does not run as non-root user on Debian systems, please check the Bug Tracking System regarding Bind, specifically http://bugs.debian.org/50013 and http://bugs.debian.org/132582, http://bugs.debian.org/53550, http://bugs.debian.org/52745, and http://bugs.debian.org/128129. Feel free to contribute to the bug reports if you think you can add useful information.

5.7.3. Chrooting the name server

To achieve maximum BIND security, now build a chroot jail (see 「一般的な chroot および suid のパラノイア」) around your daemon. There is an easy way to do this: the -t option (see the named(8) manual page or page 100 of http://www.nominum.com/content/documents/bind9arm.pdf). This will make Bind chroot itself into the given directory without you needing to set up a chroot jail and worry about dynamic libraries. The only files that need to be in the chroot jail are:
dev/null
etc/bind/       - should hold named.conf and all the server zones
sbin/named-xfer - if you do name transfers
var/run/named/  - should hold the PID and the name server cache (if
                  any) this directory needs to be writable by named user
var/log/named   - if you set up logging to a file, needs to be writable
                  for the named user
dev/log         - syslogd should be listening here if named is configured to
                  log through it
Bind デーモンが適切に動くためには named ファイルのパーミッションが必要です。 設定ファイルがいつも /etc/named/ にあるのでこれは容易な作業です。 セカンダリまたはキャッシュネームサーバでなければ、zone ファイルへは 読みとり専用のアクセスだけでいいことを考慮してください、セカンダリまたは キャッシュネームサーバの場合は、(プライマリサーバからの zone transfer が うまくいくように) 必要な zone への読み書き許可を与える必要があります。
さらに、Bind を chroot することについては http://www.linuxdoc.org/HOWTO/Chroot-Bind-HOWTO.html (Bind 9 について) と http://www.linuxdoc.org/HOWTO/Chroot-Bind8-HOWTO.html (Bind 8 について) にくわしい情報があります。この文書は doc-linux-text (テキスト版) または doc-linux-html (html 版) をインストールすることに よっても利用できます。
If you are setting up a full chroot jail (i.e. not just -t) for Bind in Debian, make sure you have the following files in it[40]:
dev/log - syslogd should be listening here
dev/null
etc/bind/named.conf 
etc/localtime
etc/group - with only a single line: "named:x:GID:"
etc/ld.so.cache - generated with ldconfig 
lib/ld-2.3.6.so
lib/libc-2.3.6.so
lib/ld-linux.so.2 - symlinked to ld-2.3.6.so
lib/libc.so.6 - symlinked to libc-2.3.6.so
sbin/ldconfig - may be deleted after setting up the chroot
sbin/named-xfer - if you do name transfers
var/run/
And modify also syslogd listen on $CHROOT/dev/log so the named server can write syslog entries into the local system log.
If you want to avoid problems with dynamic libraries, you can compile bind statically. You can use apt-get for this, with the source option. It can even download the packages you need to properly compile it. You would need to do something similar to:
$ apt-get source bind
# apt-get build-dep bind
$ cd bind-8.2.5-2
  (edit src/port/linux/Makefile so CFLAGS includes the '-static'
   option)
$ dpkg-buildpackage -rfakeroot -uc -us
$ cd ..
# dpkg -i bind-8.2.5-2*deb
After installation, you will need to move around the files to the chroot jail[41] you can keep the init.d scripts in /etc/init.d so that the system will automatically start the name server, but edit them to add --chroot /location_of_chroot in the calls to start-stop-daemon in those scripts or use the -t option for BIND by setting it in the OPTIONS argument at the /etc/default/bind (for version 8) or /etc/default/bind9 (for version 9) configuration file.
For more information on how to set up chroots see 「一般的な chroot および suid のパラノイア」.


[39] Note that depending on your bind version you might not have the -g option, most notably if you are using bind9 in sarge (9.2.4 version).
[40] This setup has not been tested for new release of Bind yet.
[41] Unless you use the instdir option when calling dpkg but then the chroot jail might be a little more complex.