5.7.1. Bind configuration to avoid misuse
あなたの組織のもらしたくない貴重な情報を引きだすのに使えないように DNS サーバから外部のクライアントへ提供される情報を制限するべきです。これには 以下のオプションを追加することが含まれます: allow-transfer、allow-query、 allow-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
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
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 への読み書き許可を与える必要があります。
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
:
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
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.