BIND9 unter Debian Etch (4.0) im chroot - Howto
Bei vielen Diensten - insbesondere von aussen erreichbaren - ist es sinnvoll, diese in einem chroot laufen zu lassen, damit ein erfolgreicher Angreifer nur begrenzten Schaden anrichten kann, oder im weiteren Vorgehen zumindest stark behindert wird. Wichtig ist dabei, das der Dienst im chroot als nicht priviligierter User laeuft, Ausfuehrung als root im chroot bringt keine zusaetzliche Sicherheit, da root ein chroot per Definition aushebeln kann.
BIND9 in Debian stable 4.0 ist fuer ein chroot vorbereitet, die Konfiguration ist ziemlich einfach. Auf die Konfiguration des Dienstes selbst geht diese Howto nicht ein, lediglich die chroot Aspekte werden angesprochen.
BIND9 installieren:
apt-get install bind9
Zunaechst wird dem Prozess named der zusaetzliche Parameter -t mitgegeben, der das chroot festlegt. Bei Debian finden sich solche (Start-)Parameter fuer Dienste in /etc/default. Ich bevorzuge eine Kapselung innerhalb von /var/lib:
vi /etc/default/bind
OPTIONS="-u bind -t /var/lib/named"
# Set RESOLVCONF=no to not run resolvconf
RESOLVCONF=yes
Nun muessen die erforderlichen Verzeichnisse vorbereitet werden. cache/bind benoetigt named zur Laufzeit, die named.stats werden zB. per Default hier abgelegt. In var/run legt bind die ProzessID ab. Zur Laufzeit werden weiterhin dev/null und dev/random genutzt. Mein bind schien zwar auch ohne diese beiden Devices zu laufen, aber ich gebe die trotzdem mal mit an. Vorgehen also:
mkdir /var/run/named
mkdir /var/run/named/etc
mkdir /var/run/named/dev
mkdir -p /var/lib/named/var/cache/bind
mkdir -p /var/lib/named/var/run/bind/run
chmod 750 /var/lib/named
chgrp bind /var/lib/named
chown bind:bind /var/lib/named/var/cache/bind
chown bind:bind /var/lib/named/var/run/bind
mknod /var/lib/named/dev/null c 1 3
mknod /var/lib/named/dev/random c 1 8
chmod 666 /var/lib/named/dev/null
chmod 666 /var/lib/named/dev/random
Die Konfigurationsdateien werden erst nach dem chroot() Aufruf geparst und muessen daher named im chroot zugaenglich sein. Ein Link aus dem chroot raus nach /etc/bind funktioniert natuerlich nicht. Daher verschieben wir /etc/bind nach /var/lib/named/etc, und setzen stattdessen einen Link von /etc in das chroot. Dies hat Vorteile bei Updates, und ist auch fuer den Admin recht praktisch, der Konfigs in /etc erwartet:
mv /etc/bind /var/lib/named/etc
ln -s /var/lib/named/etc/bind /etc/bind
Jetzt kann man den Daemen neu starten:
/etc/init.d/bind9 stop
/etc/init.d/bind9 start
named logt ueber den Logdaemen nach /var/log/daemon.log. Der Start sollte dort vermerkt sein. Wenn dort nichts ankommt, muss der Logdaemen noch auf dem log-Device im chroot (wird automatisch angelegt) zusaetzlich horchen. Fuer den syslogd kann man das so machen:
vi /etc/default/syslogd
SYSLOGD="-a /var/lib/named/dev/log"
/etc/init.d/sysklogd restart
Fuer syslog-ng geht es durch eine Zeile in der Sektion source s_all:
vi /etc/syslog-ng/syslog-ng.conf
source s_all {
...
unix-stream("/var/lib/named/dev/log");
...
}
Etwas testen kann man mit "ps xawu | grep named", das ergibt etwas wie "/usr/sbin/named -u bind -t /var/lib/named" ausgefuehrt vom User bind. Wenn das Paket dnsutils installiert, und bind sonst bereits fertig konfiguriert ist, sollte man mit dig noch die wunschgemaesse Funktion sicherstellen.
Ein Ruf von "rndc stats" erzeugt, sofern nicht vorhanden, in /var/lib/named/var/cache/bind die Datei named.stats mit ein paar Statistiken.
Das sollte es gewesen sein. Feedback ist willkommen.
Bei mir hat er allerdings noch das ganze im chroot im verzeichnis etc/bind erwartet und nicht mit flat files ...
zudem mussten noch die berechtigungen von $chroot/var/lib/run/... auf den bind user gesetzt werden.
besten dank
gruss
sven
mkdir /var/lib/named/etc
und mkdir /var/lib/named/dev heißen?!