Installer un serveur DNS bind9.x dans un chroot
Auteur : Olivier BOYER - oboyer () ajoute ! org
Mots clés
NetBSD 1.6, NetBSD 2.0, DNS, bind, bind9, chroot
Introduction
Ce document présente comment installer un serveur de noms bind9 dans une cage (chroot), sur un système NetBSD-1.6.x (idem sur un 2.0) Le daemon named doit s'exécuter sous l'identité d'utilisateur non-privilegié.
Présentation de la maquette
- L'installation de bind9 est faite via l'arbre des packages.
- La cage est située sous
/var/chroot/named. - Le processus
namedfonctionne sous l'identité de l'utilisateur “named”
Note
Toutes les commandes présentées ici, sont à executer,sauf mention contraire, en tant qu'administrateur de la machine.
Avant-propos
Le système NetBSD-1.6.x (et 2.x) est fourni avec un bind8 (/usr/sbin/named). Le présent document n'utilise pas cette version, et lui préfère la version 9, installée depuis l'arbre des packages.
La version installée est la dernière en date à ce jour, la 9.2.3
Sur un système NetBSD-1.6.x (et 2.x), sont déjà crées :
- l'utilisateur et le group
named
# grep named /etc/passwd named:*:14:14:& pseudo-user:/var/chroot/named:/sbin/nologin # # grep named /etc/group named:*:14:
- la cage
/var/chroot/named
# ls -Rl /var/chroot/named total 8 drwxr-xr-x 2 root wheel 512 Apr 9 2003 dev drwxr-xr-x 3 root wheel 512 Apr 9 2003 etc drwxr-xr-x 3 root wheel 512 Apr 9 2003 usr drwxr-xr-x 4 root wheel 512 Apr 9 2003 var /var/chroot/named/dev: /var/chroot/named/etc: total 2 drwxr-xr-x 3 root wheel 512 Apr 9 2003 namedb /var/chroot/named/etc/namedb: total 2 drwxrwxr-x 2 named named 512 Apr 9 2003 cache /var/chroot/named/etc/namedb/cache: /var/chroot/named/usr: total 2 drwxr-xr-x 2 root wheel 512 Apr 9 2003 libexec /var/chroot/named/usr/libexec: /var/chroot/named/var: total 4 drwxrwxr-x 2 root named 512 Apr 9 2003 run drwxrwxr-t 2 root named 512 Apr 9 2003 tmp /var/chroot/named/var/run: /var/chroot/named/var/tmp:
Installer bind9
Compilation du package bind9 (via les packages)
Le package sera installé sous l'arborescence /usr/pkg
Pour s'en assurer, executer la commande suivante :
# cd /usr/pkgsrc/net/bind9 # make show-var VARNAME=PREFIX /usr/pkg # # make show-var VARNAME=LOCALBASE /usr/pkg
Voici les options de compilations extraites du fichier /usr/pkgsrc/net/bind9/Makefile :
CONFIGURE_ARGS+=--with-libtool=yes \
--sysconfdir=/etc \
--localstatedir=/var \
--with-openssl=${SSLBASE}
BUILD_DEFS+= USE_INET6
Lancer la compilation :
# cd /usr/pkgsrc/net/bind9 # make install clean clean-depends
Apres installation, les binaires et scritps suivants sont ajoutés au système :
/usr/pkg/bin/dig /usr/pkg/bin/host /usr/pkg/bin/isc-config.sh /usr/pkg/bin/nslookup /usr/pkg/bin/nsupdate /usr/pkg/etc/rc.d/lwresd /usr/pkg/etc/rc.d/named9 /usr/pkg/sbin/dnssec-keygen /usr/pkg/sbin/dnssec-makekeyset /usr/pkg/sbin/dnssec-signkey /usr/pkg/sbin/dnssec-signzone /usr/pkg/sbin/lwresd /usr/pkg/sbin/named /usr/pkg/sbin/named-checkconf /usr/pkg/sbin/named-checkzone /usr/pkg/sbin/rndc /usr/pkg/sbin/rndc-confgen
Note : les autres fichiers ne sont pas listés ici, pour obtenir la liste complète, executez la commande :
$ pkg_info -L bind-9.2.3nb1
Fin de l'installation
Depuis la version 9.2.0, bind utilise le device /dev/random. Plus précisemment, c'est rndc(1) qui l'utilise.
Pour créer le device /dev/random dans la cage, exécutez les commandes suivantes :
# cd /var/chroot/named/dev/ # /dev/MAKEDEV random # ls random urandom
Modification des fichiers de démarrage
/etc/rc.conf
Vérifier que le bind livré avec le système (/usr/sbin/named) est bien inactif, et qu'il n'est pas lancé au démarrage. Ajouter pour ce faire, les lignes suivantes au fichier /etc/rc.conf :
# Do not use sytem'bind, use package'one (bind9) #bind9 is loaded at boot time via /etc/rc.local named=NO
/etc/rc.conf.d/named9
Pour activer le démarrage bind9 et lui passer les arguments adequats, créer le fichier : /etc/rc.conf.d/named9 avec les permissions suivantes : 644, root wheel
# cat /dev/null > /etc/rc.conf.d/named9 # chown root:wheel /etc/rc.conf.d/named9 # chmod 644 /etc/rc.conf.d/named9
Voici un exemple de fichier /etc/rc.conf.d/named9 :
#/etc/rc.conf.d/named9 # # Used by third party script: /usr/pkg/etc/rc.d/named9 # Start bind9 in a chroot compartment with a non-priviledged user named9=YES named_flags="-t /var/chroot/named -c /etc/named.conf -u named" #EOF
/usr/pkg/etc/rc.d/named9
Ce fichier permet de démarrer, arréter le daemon automatiquement au demarrage et à l'arrêt du système. Cependant, dans sa configuration par défaut, ce fichier ne prevoit pas que named tourne dans une cage.
Il faut modifier la variable pidfile pourqu'elle prenne en compte la cage.
#default# pidfile="/var/run/${name}.pid"
pidfile="/var/chroot/named/var/run/${name}.pid"
/etc/rc.local
Pour lancer bind9 au démarrage de la machine, ajouter à la fin du fichier /etc/rc.local les lignes suivantes :
# Start bind9
if [ -x /usr/pkg/etc/rc.d/named9 ]; then
/usr/pkg/etc/rc.d/named9 start
fi
Créer les fichiers de la base de noms
Le systeme NetBSD-1.6.x (et 2.x) est fourni avec un exemple de base de données de noms, situé sous /etc/namedb. Ces fichiers pourront servir de base de travail.
Sinon, vous trouverez en Annexe les fichiers :
etc/named.confstandard/root.hintstandard/localhoststandard/loopbackstandard/loopback6.arpastandard/loopback6.int
# cd /etc # ls -l namedb/ total 8 -rw-r--r-- 1 root wheel 259 Apr 9 2003 127 -rw-r--r-- 1 root wheel 286 Apr 9 2003 localhost -rw-r--r-- 1 root wheel 262 Apr 9 2003 loopback.v6 -rw-r--r-- 1 root wheel 1085 Apr 9 2003 named.conf -rw-r--r-- 1 root wheel 2563 Apr 9 2003 root.cache # # mkdir -p /var/chroot/named/namedb/standard # mkdir /var/chroot/named/namedb/master # mkdir /var/chroot/named/namedb/slave # cp /etc/namedb/* /var/chroot/named/namedb/standard # mv /var/chroot/named/namedb/standard/named.conf /var/chroot/named/etc #
Utiliser rndc pour gérer bind9 dans la cage
La commande rndc(8) [remote name daemon control] permet à l'administateur sytème de contrôler les opérations du daemon named. Elle remplace la commande ndc(8) des anciennes versions de named.
rndc(8) communique avec le serveur via le port tcp 945 (par défaut).
Un fichier de configuration est nécessaire. En effet, toutes les communications avec le serveur sont authentifiées par des signatures numériques qui reposent sur un secret partagé. Ce secret n'est accessible QUE par un fichier de configuration (par défaut : /etc/rndc.conf).
Si le fichier /etc/rndc.conf n'existe pas, rndc examine le contenu du fichier /etc/rndc.key.
Ce fichier a été crée pour des raisons de compatibilités avec bind8. En effet cette version n'implemente pas la signature numérique de ses messages dans le canal de commande. Le fichier rndc.key permet d'utiliser un fichier de configuration bind8 avec un serveur en bind9 sans modification. La commande rndc fonctionnera de la meme facon que ndc.
La commande rndc(8) utilise 2 fichiers de configuration :
/etc/rndc.conf/etc/rndc.key(pour compatibilité avec bind8)
La commande rndc-confgen(8) permet de générer ces deux fichiers.
Créer le fichier /etc/rndc.conf
Exécuter la commande suivante :
# cd /tmp # rndc-confgen > out # cp out rndc.conf
Note : Sur certaine plateforme, cette commande peut prendre de longues minutes
Garder le contenu du fichier placé entre les balises :
'# Start of rndc.conf'
et
'# End of rndc.conf'
Supprimer les balises et le reste du fichier.
Exemple de fichier /etc/rndc.conf :
#/etc/rndc.conf
# generated by : rndc-confgen
key "rndc-key" {
algorithm hmac-md5;
secret "le_secret_genere";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
#EOF
Copier ce fichier à la racine du système :
# cp /tmp/rndc.conf /etc # chown 600 /etc/rndc.conf # chmod root:wheel /etc/rndc.conf
Insérer les entéees "controls" et "key" dans le fichier named.conf
Extraire du fichier précédement crée (/tmp/out) la section concernant le fichier named.conf, comprise entre les balises :
'# Use with the following in named.conf, adjusting the allow list as needed:'
et
'# End of named.conf'
Effacer tout le reste du fichier.
Supprimer les balises et les caractères # du debut de chaque ligne.
Intégrer ce contenu au fichier : /var/chroot/named/etc/named.conf
Creer le fichier /etc/rndc.key (facultatif)
Pour générer le fichier /etc/rndc.key, exécuter la commande suivante :
# rndc-confgen -a
Note : sur certaine plateforme, cette commande peut prendre de longues minutes
Permissions à appliquer
A la cage
# cd /var/chroot/named
#
# chown -R root:named etc
# chmod 750 etc
# chmod 600 etc/rndc.*
# chmod 640 etc/named.conf
#
# chown -R root:named namedb
# chmod 755 namedb
# find ./namedb -type d -exec chmod 755 {} \;
# find ./namedb -type f -exec chmod 644 {} \;
# chmod 775 namedb/slave
#
# chown -R root:named var
# chmod 770 var
# chmod 770 var/log
# chmod 660 var/log/named.log
Aux fichiers /etc/rndc.*
# chown root:wheel /etc/rndc.* # chmod 600 /etc/rndc.*
Au binaire bind8
Voici les permissions appliquées par le système :
# ls -l /usr/sbin/named -r-xr-xr-x 1 root wheel 585656 Nov 11 11:54 /usr/sbin/named
Pour être sûr que ce binaire ne soit pas utilisé, exécuter :
# chown root:wheel /usr/sbin/named # chmod 000 /usr/sbin/named
Gestion du daemon
Démarrer/arrêter bind
Démarrer bind9 :
# /usr/pkg/etc/rc.d/named9 start
Arréter bind9 :
# /usr/pkg/etc/rc.d/named9 stop
Redémarrer bind9 :
# /usr/pkg/etc/rc.d/named9 restart
Recharger la base
# rndc reload
Liens
* Bind9 Reference Manual : http://www.bind9.net/Bv9ARM.html
* Bind Faq : http://www.nominum.com/getOpenSourceResource.php?id=6
ANNEXES
Tous les fichiers sont relatifs à l'arborescence : /var/chroot/named
etc/named.conf
# /etc/named.conf
# boot file for master name server
# Note that there should be one primary entry for each SOA record.
//
//// ACL
//
/* local networks */
acl clients {
localnets;
::1;
};
acl "internal_nets" {
127.0.0.1; 192.168.1.0/24;
};
/* secondary name servers */
acl "2nd_dns" {
192.168.1.2; /* ns2.leaves.org */
};
//
//// OPTIONS
//
options {
directory "/namedb";
version ""; // remove this to allow version queries
listen-on { any; };
listen-on-v6 { any; };
allow-recursion { internal_nets; };
forwarders { 192.168.1.2; };
// blackhole { "iana"; };
notify yes; /* advice 2nd ns when this zone is updated */
};
//
//// RNDC
//
// generated by rndc-confgen(8)
key "rndc-key" {
/* the same conf the one in /etc/rndc.conf */
algorithm hmac-md5;
secret "le_secret_genere";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
//
//// LOGGING
//
/* logging {
* category lame-servers { null; };
*};
*/
logging { channel default_syslog {
file "/var/log/namedlog" versions 3 size 800k;
severity info;
};
};
//
//// ZONES
//
// Standard zones
zone "." {
type hint;
file "standard/root.hint";
};
zone "localhost" {
type master;
file "standard/localhost";
allow-transfer { localhost; };
};
zone "127.in-addr.arpa" {
type master;
file "standard/loopback";
allow-transfer { localhost; };
};
/*
*zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.int" {
* type master;
* file "standard/loopback6.int";
* allow-transfer { localhost; };
*};
*
*zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" {
* type master;
* file "standard/loopback6.arpa";
* allow-transfer { localhost; };
*};
*
*/
// Master zones
zone "leaves.org" {
type master;
file "master/leaves.org";
// allow-transfer { localnets; };
};
zone "1.168.192.in-addr.arpa" {
type master;
file "master/1.168.192.leaves.org";
// allow-transfer { localnets; };
};
//#EOF
namedb/localhost
$ORIGIN localhost. $TTL 6h @ IN SOA localhost. root.localhost. ( 1 ; serial 1h ; refresh 30m ; retry 7d ; expiration 1h ) ; minimum NS localhost. A 127.0.0.1 AAAA ::1 ;#EOF
namedb/loopback
$ORIGIN 127.in-addr.arpa. $TTL 6h @ IN SOA localhost. root.localhost. ( 1 ; serial 1h ; refresh 30m ; retry 7d ; expiration 1h ) ; minimum NS localhost. 1.0.0 PTR localhost. ;#EOF
namedb/loopback6.arpa
$ORIGIN 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa. $TTL 6h @ IN SOA localhost. root.localhost. ( 1 ; serial 1h ; refresh 30m ; retry 7d ; expiration 1h ) ; minimum NS localhost. 1 PTR localhost. ;#EOF
namedb/loopback6.int
$ORIGIN 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.int. $TTL 6h @ IN SOA localhost. root.localhost. ( 1 ; serial 1h ; refresh 30m ; retry 7d ; expiration 1h ) ; minimum NS localhost. 1 PTR localhost. ;#EOF
namedb/root.hint
; $OpenBSD: root.hint,v 1.1 2003/01/20 22:30:13 jakob Exp $ ; ; This file holds the information on root name servers needed to ; initialize cache of Internet domain name servers ; (e.g. reference this file in the "cache . <file>" ; configuration file of BIND domain name servers). ; ; This file is made available by InterNIC ; under anonymous FTP as ; file /domain/named.root ; on server FTP.INTERNIC.NET ; ; last update: Nov 5, 2002 ; related version of root zone: 2002110501 ; ; ; formerly NS.INTERNIC.NET ; . 3600000 IN NS A.ROOT-SERVERS.NET. A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4 ; ; formerly NS1.ISI.EDU ; . 3600000 NS B.ROOT-SERVERS.NET. B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107 ; ; formerly C.PSI.NET ; . 3600000 NS C.ROOT-SERVERS.NET. C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12 ; ; formerly TERP.UMD.EDU ; . 3600000 NS D.ROOT-SERVERS.NET. D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90 ; ; formerly NS.NASA.GOV ; . 3600000 NS E.ROOT-SERVERS.NET. E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10 ; ; formerly NS.ISC.ORG ; . 3600000 NS F.ROOT-SERVERS.NET. F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241 ; ; formerly NS.NIC.DDN.MIL ; . 3600000 NS G.ROOT-SERVERS.NET. G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4 ; ; formerly AOS.ARL.ARMY.MIL ; . 3600000 NS H.ROOT-SERVERS.NET. H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53 ; ; formerly NIC.NORDU.NET ; . 3600000 NS I.ROOT-SERVERS.NET. I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17 ; ; operated by VeriSign, Inc. ; . 3600000 NS J.ROOT-SERVERS.NET. J.ROOT-SERVERS.NET. 3600000 A 192.58.128.30 ; ; housed in LINX, operated by RIPE NCC ; . 3600000 NS K.ROOT-SERVERS.NET. K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129 ; ; operated by IANA ; . 3600000 NS L.ROOT-SERVERS.NET. L.ROOT-SERVERS.NET. 3600000 A 198.32.64.12 ; ; housed in Japan, operated by WIDE ; . 3600000 NS M.ROOT-SERVERS.NET. M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33 ; End of File ;#EOF