Le système de base OpenBSD utilise la version 4 de bind. Ses versions 8 et 9 sont en revanche disponibles dans les ports.
Je ne me permettrai pas de conseiller une version plutôt qu'une autre. Disons que de manière simpliste, le Bind4 du système de base a la réputation d'être plus fiable, Bind8 le plus répandu et aussi le plus cribblé de failles, Bind9 le plus séduisant en termes de fonctionnalités, à vous de juger :). Contrairement à une idée reçue, Bind4 n'est pas une version antédéluvienne de Bind, c'est une branche qui évolue en parallèle, en ayant simplement comme principal objectif la sécurité. Sa syntaxe est sensiblement différente ainsi que les fichiers de conf, mais il évolue et sait même gérer IPv6 à partir de sa version 4.9.5.
Bind9 est une réécriture complète de Bind, conçue pour tourner sans privilèges dans un environnement chrooté, et il est à ma connaissance le seul à supporter intégralement DNSSEC (dont on verra la conf ci-dessous).C'est celui-ci que je vais aborder.
Il est là, déjà chrooté et blindé autant que peu l'être un serveur DNS. Seule sa conf est un peu déroutante par rapport à la syntaxe habituelle des bind les plus répandus mais très simple. Le fichier de conf est /var/named/named.boot, dont une syntaxe possible est la suivante :
; fichier de conf named.boot directory /namedb cache . root.cache ; Ne pas lister tous mes domaines aux inconnus !:) xfrnets 127.0.0.0 primary thessalie.NET db.thessalie.net ; primary 1.168.192.IN-ADDR.ARPA thessalie.rev
Perso je n'utilise pas 1.168.192.IN-ADDR.ARPA pour les adresses locales, les noms d'hôtes et leurs IP sont filés par DHCP sur MAC address.
Biensûr, /namedb correspond au path relatif à la racine du chroot, donc /var/named/namedb, c'est là que se trouveront les fichiers de zone.
; Exemple de fichier de zone
;\$TTL 43200
;\$ORIGIN thessalie.net.
@ IN SOA ns.thessalie.net. blitz.thessalie.net. (
2002101304
10800
3600
604800
86400 )
@ IN NS ns.thessalie.net.
@ IN NS ns1.hash-group.net.
localhost IN A 127.0.0.1
plop IN A 192.168.10.2
pouet IN A 192.168.10.3
@ IN A 80.65.226.81
www IN A 80.65.226.81
ns IN A 80.65.226.81
blitz IN A 80.65.226.81
parinux IN A 80.65.226.81
Ajouter/modifier dans son /etc/rc.conf :
named_flags="" named_user=named # Named should not run as root unless necessary named_chroot=/var/named # Where to chroot named if not empty syslogd_flags=""
Ce qui donnera à chaque démarrage l'équivallent de :
named -t /var/named -u named syslogd -a /var/named/dev/log
Son installation nécessite que bind 4 soit préalablement retiré, ou du moins que le nouveau bind soit prioritaire, ce qui n'est pas le cas par défaut.
Le path des nouveaux binaires est en effet /usr/local/sbin, contre /usr/sbin pour le bind4 du système de base. Ce dernier reste donc présent et prioritaire tant que le remplacement n'a pas été effectué. De plus, les fichiers de conf ont radicalement changé entre bind4 et ses versions 8 et 9.
Heureusement, les mainteneurs ont pensé à tout et un petit script est disponible pour effectuer le nécessaire :
# cd /usr/ports/net/bind9/ && make install # cp -R /usr/ports/net/bind9/files/ ~/bind9-newfiles # cd ~/bind9-newfiles # chmod +x bind9-enable Editer le script et remplacer la variable PREFIX~: PREFIX=/usr/local # ./bind9-enable Are you sure you want to to this (y/[n])? y Removing obsolete files: /usr/sbin/addr /usr/sbin/dig /usr/sbin/dnsquery /usr/sbin/host /usr/sbin/named /usr/sbin/named.reload /usr/sbin/named.restart /usr/sbin/ndc /usr/sbin/nslookup /usr/share/man/cat1/dig.0 /usr/share/man/cat1/dnsquery.0 /usr/share/man/cat1/host.0 /usr/share/man/cat8/named-xfer.0 /usr/share/man/cat8/named.0 /usr/share/man/cat8/named.reload.0 /usr/share/man/cat8/named.restart.0 /usr/share/man/cat8/ndc.0 /usr/share/man/cat8/nslookup.0 /usr/share/misc/nslookup.help /var/named/named-xfer done. Creating soft links for binaries: /usr/sbin/dig -> /usr/bin/dig /usr/sbin/host -> /usr/bin/host /usr/sbin/nslookup -> /usr/bin/nslookup /usr/sbin/nsupdate -> /usr/bin/nsupdate /usr/sbin/named -> /usr/sbin/named /usr/sbin/rndc -> /usr/sbin/rndc /usr/sbin/lwresd -> /usr/sbin/lwresd /usr/sbin/dnssec-keygen -> /usr/sbin/dnssec-keygen /usr/sbin/dnssec-makekeyset -> /usr/sbin/dnssec-makekeyset /usr/sbin/dnssec-signkey -> /usr/sbin/dnssec-signkey /usr/sbin/dnssec-signzone -> /usr/sbin/dnssec-signzone done. Setup directory structure: /var/named/var /var/named/var/run /var/named/var/tmp done. Symlink /var/named/etc/named.conf: /var/named/etc/named.conf->../named.conf done.
[Attention, uniquement testé en 3.0]
Le script d'update a dû placé le nouveau fichier de conf named.conf dans /var/named, ainsi qu'un lien symbolique dans /var/named/etc/ vers ce fichier pour le chroot (nous y reviendrons plus tard). En supposant que l'on conserve /var/named/ comme emplacement pour l'ensemble des fichiers de zone, celà nous donne comme options :
options {
directory "/var/named";
// Don't reveal BIND version
version "";
auth-nxdomain no; # conform to RFC1035
};
Au lancement de named, il faut lui spécifier l'emplacement du fichier de conf, à moins qu'on ait choisi de le copier directement dans /etc (path par défaut) :
# named -c /var/named/named.conf
Pour la syntaxe des fichiers de zone, je vous laisse le soin de vous inspirer des exemples du fichier de conf, et éventuellement consulter le bind9 administrator manual reference : http://www.crt.se/dnssec/bind9/Bv9ARM.html.
Pour vérifier notre config :
#named-checkconf /var/named/named.conf # S'il ne dit rien c'est que c'est bon :) #named-checkzone zone /var/named/master/db.thessalie.net OK
Créer, s'il n'existe pas déjà, un groupe et un user named :
#/etc/passwd named:*:70:70:BIND Name Service Daemon:/var/named:/sbin/nologin #/etc/group named:*:70:
Sous OpenBSD, par défaut, le chroot est installé dans /var/named, qui contient les répertoires etc/, var/run et dev/.
Dans /var/named/etc/, coller le fichier de conf et les fichiers de zones (par exemple), et si le serveur sert d'esclave sur certaines zones, il va falloir que celles ci soient mises à jour, donc déposées dans un répertoire où Bind aient les droits d'écriture :
# mkdir /var/named/etc/slave # chown -R named:named /var/named/etc/slave # chmod gu+rw /var/named/etc/slave
Idem pour var/run ou Bind va écrire son pid et ses stats :
# chmod -R named:named /var/named/var/run
S'assurer qu'on a bien un /var/named/dev/null et un /var/named/etc/localtime, sinon :
# mknod /var/named/dev/null c 2 2 # cp /etc/localtime /var/named/etc/
Enfin, Bind se sert normallement de syslogd pour logguer, lequel écrit par défaut sur /dev/log, qui se trouve en dehors de la prison. Pour y remédier, il suffit de d'utiliser le flag '-a' de syslog, introduit par OpenBSD, permet de spécifier un path pour le nouveau socket (en conservant les autres intacts) :
# /etc/rc.conf syslogd_flags='''' named_flags=""
named est prévu pour être chrooté, aucun flag spécifique n'est donc nécessaire, de même que pour syslog. S'assurer en revanche que le user named et sa prison sont bien renseignés dans le rc.conf :
named_user=named # Named should not run as root unless necessary named_chroot=/var/named # Where to chroot named if not empty
Enfin, bien vérifier son named.conf pour en modifier les paths (directory et fichiers de zones). Le répertoire /var/named sera désormais considéré par Bind comme la racine du système :
options {
directory "/";
version "";
auth-nxdomain no; # conform to RFC1035
};
// Standard zones
//
zone "localhost" IN {
type master;
file "etc/named.localhost";
allow-transfer { localhost; };
};
etc.
Rebooter, ou bien killer/redémarrer syslogd ainsi que bind avec leurs nouveaux flags :
syslogd -a /var/named/dev/log named -t /var/named/ -u named
ATTENTION: hmac-md5 est le seul algorythme supporté conjointement par named et rndc (voir man rndc) au moment ou cette doc est rédigée.
D'abord générer la clé :
# dnssec-keygen -a hmac-md5 -b 128 -n user root
On obtient deux fichiers : Kroot.+157+27461.key Kroot.+157+27461.private
Récupérer la clé privée dans le 2ème fichier et l'intégrer à /etc/rndc.conf (à créer) et /var/named/named.conf
# /etc/rndc.conf
options {
default-server localhost;
default-key "key";
};
server localhost {
key "key";
};
key "key" {
algorithm hmac-md5;
secret "dgh3G2gW7/08k2iiNqZnlA==";
};
NB : non ce n'est pas ma vraie clé secrète :)
#/etc/named.conf
key "key" {
algorithm hmac-md5;
secret "dgh3G2gW7/08k2iiNqZnlA==";
};
controls {
inet 127.0.0.1 allow {localhost; } keys { "key"; };
};
rebooter, ou lancer named chrooté et son syslogd à la main :
# kill -9 syslogd # syslogd -a /var/named/dev/log -a /var/named/dev/log # named -t /var/named -u named
Tester la config :
# rndc reload rndc: reload command successful