DNS-Server · 3 min read · Oct 02, 2025

Bind-Chroot-Howto (Debian)

Bind-Chroot-Howto (Debian)

Version 1.3
Autor: Falko Timme

Dieses Dokument beschreibt, wie man den DNS-Server Bind auf Debian installiert, sodass er aus einem Chroot-Jail aus Sicherheitsgründen läuft.

Dieses Howto ist als praktische Anleitung gedacht; es behandelt nicht die theoretischen Hintergründe. Diese werden in vielen anderen Dokumenten im Web behandelt.

Dieses Dokument kommt ohne jegliche Gewährleistung!

Installieren Sie Bind und chrooten Sie es

apt-get install bind9

Aus Sicherheitsgründen möchten wir BIND chrooted ausführen, daher müssen wir die folgenden Schritte durchführen:

/etc/init.d/bind9 stop


Auf Debian Sarge (3.1):

Bearbeiten Sie die Datei /etc/default/bind9, sodass der Daemon als unprivilegierter Benutzer ‘bind‘ chrooted zu /var/lib/named läuft. Ändern Sie die Zeile: OPTS=” -u bind so, dass sie lautet OPTS=”-u bind -t /var/lib/named”:

| OPTIONS="-u bind -t /var/lib/named" |

Auf Debian Woody (3.0):

Bearbeiten Sie das Startskript /etc/init.d/bind9, sodass der Daemon als unprivilegierter Benutzer ‘nobody‘ chrooted zu /var/lib/named läuft. Ändern Sie die Zeile: OPTS=”” so, dass sie lautet OPTS=”-u nobody -t /var/lib/named”:

| #!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin # für einen chrooted Server: "-u nobody -t /var/lib/named" OPTS="-u nobody -t /var/lib/named" test -x /usr/sbin/named || exit 0 case "$1" in start) echo -n "Starte den Domainnamen-Dienst: named" start-stop-daemon --start --quiet \ --pidfile /var/run/named.pid --exec /usr/sbin/named -- $OPTS echo "." ;; stop) echo -n "Stoppe den Domainnamen-Dienst: named" /usr/sbin/rndc stop echo "." ;; reload) /usr/sbin/rndc reload ;; restart|force-reload) $0 stop sleep 2 $0 start ;; *) echo "Verwendung: /etc/init.d/bind {start|stop|reload|restart|force-reload}" >&2 exit 1 ;; esac exit 0 |


Erstellen Sie die erforderlichen Verzeichnisse unter /var/lib:

mkdir -p /var/lib/named/etc
mkdir /var/lib/named/dev
mkdir -p /var/lib/named/var/cache/bind
mkdir -p /var/lib/named/var/run/bind/run

Verschieben Sie dann das Konfigurationsverzeichnis von /etc nach /var/lib/named/etc:

mv /etc/bind /var/lib/named/etc

Erstellen Sie einen Symlink zum neuen Konfigurationsverzeichnis vom alten Standort (um Probleme zu vermeiden, wenn Bind in Zukunft aktualisiert wird):

ln -s /var/lib/named/etc/bind /etc/bind

Erstellen Sie Null- und Zufallsgeräte und setzen Sie die Berechtigungen der Verzeichnisse:

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 /var/lib/named/dev/random


Auf Debian Sarge (3.1):

chown -R bind:bind /var/lib/named/var/
chown -R bind:bind /var/lib/named/etc/bind*

Auf Debian Woody (3.0):

chown -R nobody:nogroup /var/lib/named/var/
chown -R nobody:nogroup /var/lib/named/etc/bind*


**

Wir müssen das Startskript /etc/init.d/sysklogd von sysklogd ändern, damit wir weiterhin wichtige Nachrichten in die Systemprotokolle protokollieren können. Ändern Sie die Zeile: SYSLOGD=”” so, dass sie lautet: SYSLOGD=”-a /var/lib/named/dev/log”:

| #! /bin/sh # /etc/init.d/sysklogd: startet den Systemprotokolldämon. PATH=/bin:/usr/bin:/sbin:/usr/sbin pidfile=/var/run/syslogd.pid binpath=/sbin/syslogd test -x $binpath || exit 0 # Optionen zum Starten/Neustarten der Daemons # Für Remote-UDP-Protokollierung verwenden Sie SYSLOGD="-r" # SYSLOGD="-a /var/lib/named/dev/log" create_xconsole() { if [ ! -e /dev/xconsole ]; then mknod -m 640 /dev/xconsole p else chmod 0640 /dev/xconsole fi chown root.adm /dev/xconsole } running() { # Keine pidfile, wahrscheinlich kein Daemon vorhanden # if [ ! -f $pidfile ] then return 1 fi pid=`cat $pidfile` # Keine pid, wahrscheinlich kein Daemon vorhanden # if [ -z "$pid" ] then return 1 fi cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -1` # Kein syslogd? # if [ "$cmd" != "$binpath" ] then return 1 fi return 0 } case "$1" in start) echo -n "Starte den Systemprotokolldämon: syslogd" create_xconsole start-stop-daemon --start --quiet --exec $binpath -- $SYSLOGD echo "." ;; stop) echo -n "Stoppe den Systemprotokolldämon: syslogd" start-stop-daemon --stop --quiet --exec $binpath --pidfile $pidfile echo "." ;; reload|force-reload) start-stop-daemon --stop --quiet --signal 1 --exec $binpath --pidfile $pidfile ;; restart) echo -n "Stoppe den Systemprotokolldämon: syslogd" start-stop-daemon --stop --quiet --exec $binpath --pidfile $pidfile echo "." sleep 1 echo -n "Starte den Systemprotokolldämon: syslogd" start-stop-daemon --start --quiet --exec $binpath -- $SYSLOGD echo "." ;; reload-or-restart) if running then start-stop-daemon --stop --quiet --signal 1 --exec $binpath --pidfile $pidfile else start-stop-daemon --start --quiet --exec $binpath -- $SYSLOGD fi ;; *) echo "Verwendung: /etc/init.d/sysklogd {start|stop|reload|restart|force-reload|reload-or-restart}" exit 1 esac exit 0 |

Starten Sie den Protokolldämon neu:

/etc/init.d/sysklogd restart

Starten Sie BIND und überprüfen Sie /var/log/syslog auf Fehler:

/etc/init.d/bind9 start

Viel Glück!

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.