Crédits : La firme, ESIL
Ce document décrit la procédure à suivre pour installer un serveur DNS tournant d'une manière plus "secure", c'est-à-dire essentiellement que -1) le propriétaire du démon n'est pas root, et que -2) ce démon tourne dans un environnement restreint (chrooté). Ce type de cage, appelée sand box en anglais, permet de fortement limiter la casse en cas d'exploit... Ayant dû changer récemment notre machine serveur DNS pour des raisons d'obsolescence (Sparc de 1992 sous SunOS4.1.3) et de Y2K-Bourrage-de-mou, nous en avons profité pour essayer de voir ce qui se fait de nos jours, sur des OS récents, avec un named récent et une volonté de sécurité très tendance. Aujourd'hui à l'extrême fin 1999, ça marche bien et assez proprement. Ce petit document se veut un ultra-mini french howto qui aura rempli son rôle s'il fait gagner un peu de temps (en configuration et en temps non passé à dépirater...). C'est cet excellent document de chez Psionic Software qui fut notre point de départ (certains points très OS-dépendants, comme le listing des commandes exactes à taper sous Linux Red-Hat, y sont plus détaillés que dans ce qui va suivre, qui se veut plus général). Nous avons mené à bien notre périlleuse mission sous FreeBSD. Mais cette méthode est généraliste et la procédure devrait fonctionner sur la quasi-totalité des systèmes en ix. A ce jour, la version de bind utilisée est 8.2.2-P5-NOESW. A priori, les versions de bind supérieures à 8.1.x supportent cette procédure. Voici donc les étapes à suivre afin de mener à bien cette opération. Précisons à nouveau que les explications qui vont suivre resteront assez générales, afin de ne pas être trop OS-dépendant. Ce document se veut simplement un éclairage quant à la méthode à employer pour installer un serveur DNS sécurisé. 1. Récupérer la dernière version de bind. Elle est disponible sur le site FTP de l'ISC. 2. Compiler bind en prenant soin de créer un binaire statique. En effet, un binaire statique ne nécéssitera aucune librairie supplémentaire pour s'exécuter, ce qui est nécéssaire pour que le démon puisse se lancer dans un environnement chrooté sans avoir à faire appel à d'autres fichiers, tels que des librairies. Pour cela, il faut ajouter le flag -static aux flags de compilation, de manière à ce que (dans le cas où l'on utilise gcc) la commande utilisee pour compiler (surtout linker) les objets soit: gcc -static. 3. Créér l'arborescence de répertoires du démon. Il faut maintenant créér le répertoire qui contiendra l'arborescence totale du serveur de noms (binaires, fichiers de configuration, etc.). Nous avons utilisé le répertoire /var/named, assez traditionnel. Vous pouvez bien-entendu utiliser le répertoire de votre choix. Dans ce répertoire, nous devons maintenant créer une arborescence de répertoires qui sera nécéssaire pour contenir le démon et son environnement d'exécution. Cette arborescence devra ressembler (fortement) à ceci: - Répertoire de base. Ceci fait, allez dans le répertoire dev/ relatif au répertoire d'installation de votre démon (dans notre exemple, /var/named/dev/) et crééz-y un character device de type null. Attention: selon votre système, null n'aura pas les memes numéros majeur et mineur. Pour les systèmes de type BSD, utilisez la commande: Sous Linux, les numéros majeur et mineur sont 1 et 3. Souvent, ls -l /dev/null peut etre un bon repère. 4. Ajouter un utilisateur et un groupe named Une fois tous les fichiers copiés dans l'arborescence créée au point précédent, il vous faudra ajouter un utilisateur non-privilégié (named est un choix fréquent) qui sera le propriétaire du processus. Pensez également à créér un groupe du même nom. Ceci fait, autorisez l'utilisateur (ou bien le groupe) named à écrire dans le répertoire var/run relatif au répertoire de base d'installation de votre serveur. Ceci permettra au processus d'écrire le fichier pid dans ce répertoire, et de communiquer avec votre démon syslogd (voir plus bas). Les gens de Psionic cités plus haut en référence conseillent de faire appartenir toute l'arborescence à l'utilisateur named. À notre sens, il est préférable de laisser appartenir au super-utilisateur (ou bien à un utilisateur administrateur) tous les autres (sauf var/run) fichiers et répertoires de l'arborescence. Ainsi, un pirate exploitant une éventuelle faille du serveur de noms ne pourra modifier ni votre exécutable ni vos fichiers de configuration. 5. Editez vos scripts de démarrage. D'une part, il faudra lancer named de manière à ce qu'il change le propriétaire du processus, ainsi que le répertoire racine relatif. Pour cela, nous utilisons les options -u, -g et -t de named. Consultez le manuel de named(8) pour plus d'infos à ce sujet. Sur FreeBSD, nous editons donc /etc/rc.conf car nous devons: Pour cela, nous utilisons ces trois lignes: Il faut maintenant s'intéresser à ce bon vieux syslogd. En effet, il faudra lancer syslogd de manière à ce qu'il crée une socket de logging dans (suivant notre exemple) /var/named/dev. Pour cela, il existe une option permettant de specifier à syslogd plus d'un répertoire où placer une socket de logging. Pour les systèmes de type BSD, cette option s'avère être -l. Un grand nombre d'autres systèmes utilisent l'option -a. Consultez le manuel de syslogd(8) pour plus d'informations. Sous FreeBSD, nous avons donc ajouté au fichier /etc/rc.conf : ce qui permettra au système de lancer syslogd avec ces options. N'oubliez pas de relancer le démon syslogd avec les bonnes options si vous ne redémarrez pas votre ordinateur. 6. Testez le résultat. En lançant syslogd et named comme expliqué plus haut, essayez quelques résolutions de noms de machines. Examinez le fichier de log produit par votre syslogd : il ne doit jamais vous parler mal, surtout au niveau des messages de lancement de named, sinon une correction s'impose... Bonne config...
Tutorial - La Firme
Installation d'un serveur DNS sécurisé
Edition originale : ESIL, Le 3 janvier 2000
Contact : la.firme@esil.univ-mrs.fr
Ceci fait, on doit obtenir les deux binaires principaux pour bind, à savoir named et named-xfer.
On pourra vérifier la staticité des binaires à l'aide de la commande file:
[root@BSD:named]# file named
named: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), statically linked, stripped
Contiendra le binaire named ainsi que:
/dev
Contiendra un device node.
/etc
/namedb
Contiendra les fichiers de configuration, de zones, etc.
/usr
/libexec (sur un système de type BSD)
/sbin (sur la plupart des autres systèmes, Linux, etc.)
Contiendra le binaire named-xfer, appelé par named.
/var
/run
[root@BSD:~]# mknod /var/named/dev/null c 2 2
[root@BSD:~]# chmod 666 /var/named/dev/null
[root@Linux:~]# mknod /var/named/dev/null c 1 3
[root@Linux:~]# chmod 666 /var/named/null
[root@BSD:~]# ls -l /dev/null
crw-rw-rw- 1 root wheel 2, 2 Jan 3 16:00 /dev/null
[root@Linux:~]# ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Jul 21 1998 /dev/null
named_enable="YES"
named_program="/var/named/named"
named_flags="-u named -g named -t /var/named"
syslogd_flags="-l /var/named/dev/log"
-==#~ ssamizdat | matrix ~#==-
La version originale de ce document se trouve sur le site web de La Firme, Ecole supérieure d'ingégneurs de Lumigny (ESIL) : http://www.esil.univ-mrs.fr/~lafirme