Éric Boucher, september 8 2004 (thebutch@videotron.ca)
1 - Introduction
2 - Installation
3 - A few concepts
4 - Using Bdns
5 - The future
This system has been developed to meet (among others) the following needs:
- Ease the adding, modification or deletion of DNS entries via an easy to use
WEB interface;
- Ease the adding, modification or deletion of DNS zones;
- Enforce integrity between A and PTR entries;
- Secure modifications to the DNS with a username/password system;
- Allow non system administrators (with restricted access) to update entries
in only certain DNS zones that you specify;
- ...
Bdns is an « open
source » project inspired by oDNS, another open source project.
Only the database and two Perl scripts from oDNS are kept in Bdns; the WEB interface
has been completely rewritten, and functionality has been added to make it a
more complete productEverything in Bdns is written in PHP scripts.
Avantages of Bdns
For system administrators
used to maintain a classic DNS server, Bdns's zone administration will ease
their task, which can be resumed as usually edit a couple of configuration files
(most of the time with vi), and send a SIGHUP to BIND's in.named daemon.
If you administer only one zone with very few entries, the advantages of Bdns
will not be very clear, apart from having a GUI to do the job instead of a text
editor and a shell, and the fact that Bdns prevents you from making comon mistakes
to your configuration files (Even experienced DNS administrators make mistakes
on time or another, altough some refuse to admit it !).
On a DNS with many zones and entriesa, which also undergo a lot of updates,
the advantages of Bdns quickly show:
- Bdns prevents frequent errors by validating user input before updating the
DNS;
- Bdns enforces referential integrity in the DNS database, preventing, among
other "orphan" or "glue" records;
- Bdns features a class of users called operators, which can insert/update/delete
any entry in the DNS database, but cannot create/update/delete zones;
- Bdns features a class of users called responsibles, which can insert/update/delete
entries of type A, CNAME, MX and PTR in a set of zones that you specify, delegating
the maintenance of the DNS data to "zone responsibles";
- Bdns allows sysadmins and other users to maintain a DNS server and its zones
without having a shell account on the server, which is security wise;
- ...
Bdns' Architecture
This diagram shows how Bdns works:
- On the same
server are installed BIND, Apache and MySQL;
- Bdns' Web pages, produced by PHP scripts, are served by an Apache Web server;
- Bdns stores the DNS data in a MySQL database and replicates the updates in
BIND's cache via nsupdate;
- Bdns generates BIND's configuration files (named.conf and zone files) and
sends, when needed, a signal to BIND so it reload its configuration;
IMPORTANT:
Since Bdns generates configuration and zone files and updates BIND dynamically,
if another source updates BIND's cache, the result will be an inconsistency
between Bdns' database and BIND's cache. If you use Bdns to maintain your DNS
data, do not allow another source to dynamically update your zones, or else,
entries not in Bdns' database will somehow get lost when you refresh a zone
via Bdns.
Bdns' history
Bdns was written from another open source package called odns. My initial intention was to add functionality to odns and revamp its interface, but during initial planing and desing (read: reverse engineering), I changed my mind and went on to write a complete new interface. Bdns is in production inside Hydro Québec's intranet since may 2002 and it is used to maintain a DNS with a little more than 70 000 records.
This section describes the steps necessary to install and configure Bdns. To install Bdns, you must know Unix enough to install and configure Apache, PHP, BIND and MySQL and modify a few configuration files.
I personally installed, configured and tested Bdns on Solaris 2.6, Solaris 8 and Solaris 9, and on MacOS X 10.2 and 10.3. One of my colleagues even installed it on Windows NT, though I doubt that everything worked...
In my humble opinion, installation on MacOS X is the easiest, because of the packages that are available on the internet. A specific recipe to install Bdns on MacOS X is available here (only in french for now).
Here is the list
of the steps needed:
- Create a non privileged user account (say"bdns") on your server;
- On this same server, install BIND, Apache-PHP-MySQL. Note and save the root
password of your MySQL database;
- Configure Apache and BIND so that they run as the bdns non-privileged user.
This is done by starting BIND with the "-u bdns" option in the startup
script. For Apache, you must have the line "User bdns" in httpd.conf;
- Modify httpd.conf to have those lines:
User bdns DirectoryIndex index.html index.html.var index.php LoadModule php4_module modules/libphp4.so AddType application/x-httpd-php.php AddType application/x-httpd-php-source.phps- Modify php.ini to have the register_globals parameter set to "on":
register_globals = On- Uncompress and un-tar Bdns in the DOCROOT directory of your Apache Web server (this will create the Bdns directory with its scripts in it);
chown -R bdns /var/named/Bdns chmod 755 /var/named/Bdns chmod 644 /var/named/Bdns/*
chown bdns /etc/named.conf chmod 644 /etc/named.conf
directory /var/namedreplace it by:
directory /var/named/Bdns
bdns ALL=(ALL) /usr/sbin/ndc reload
The line above may be modified to make it work on your server. Test if it works like in the example below:
% su - bdns password: % /usr/bin/sudo /bin/ndc reload reload initiated %
If you have the 'reload initiated' (or something similar) message, it means that the sudo configuration is correct (Note: If you use BIND 9, you must use rdnc instead of ndc).
- Initialize the MySQL database and start it (if not already done);
- Restart BIND and make sure that everything works and that you do not get errors
in the logs;
- Reload the Apache WEB server to activate the new configuration;
- In a shell, cd to the directory where you extracted Bdns' PHP scripts. As
root, run the script that creates Bdns' database (mysql –p < cree_Bdns.sql);
- To populate the database with your existing DNS data:
First time use and configuration:
- Point your browser at Bdns' URL (e.g. http://www.yourserver.com/Bdns). You should see this login screen:
- Connect with admin/admin.
You will next see this screen, which lists the DNS domains in the database:
IMPORTANT:
Before going any further, you have to review the system parameters to ensure that Bdns will work properly. Click on the "parameters" link. You will see this screen (not all the parameters are shown here, but they are all listed and explained below) :
- Make sure that the parameters reflect your installation and points to the right directories on your server:
The commands listed in the screen above must work for Bdns to function properly. To test them, open a shell as the Bdns user on your server and test the commands. If you have problems, check your config, especially for BIND and sudo. Test a connection to the Mysql database, and make sure that all the commands listed include the correct path. Alternatively, you can ask your questions to me at thebutch@videotron.ca. I certainly can help you, since I wrote this system...
- Create an administrator account. To do so, click on the "User accounts" menu button;
IMPORTANT: Bdns needs at least ONE valid administrator account. If you delete the last administrator account from the system, you will not be able to create another one nor to log in as an administrator again! Take care! If ever you delete the last administrator account in Bdns and logout, you can create a new administrator accouns like below (the default password for odns in the Mysql database is sndo):
[bw1736@powerbookabutch:/Library/Apache2/htdocs/Bdns]mysql -u odns -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 101 to server version: 4.0.15
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use odns;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> insert into Bdns_usagers values ('dieu', encrypt('dieu', 'aX'), 'typuager1',
'Dieu', 'francais');
Query OK, 1 row affected (0.07 sec)
mysql> exit
Bye
[bw1736@powerbookabutch:/Library/Apache2/htdocs/Bdns]
You can then use Bdns and connect as admin/admin.
Before going on to explain how to use Bdns, a few concepts should be understood.
Assumptions
on the structure of DNS data :
As you may know, even if a DNS server like BIND let you do anything, that doesn't
mean that everything you do with it has sense. So over time, by using BIND,
you learn a few « non written » rules, that come from
good sense (and mistakes from which, hopefully, you learn). Bdns was developped
with these « non written » rules in mind, which are listed
here:
- à un enregistrement de type A correspond un ou plusieurs enregistrements
de type PTR;
- à un enregistrement de type PTR correspond un et un seul enregistrement
de type A;
- un enregistrement de type A peut être référé par
aucun, un ou plusieurs enregistrement(s) de type CNAME;
- un enregistrement de type CNAME peut pointer sur un autre enregistrement de
type CNAME (quoi que ce ne soit pas conseillé);
Avec ces quelques
règles, Bdns se comporte donc ainsi avec les enregistrements du DNS :
- tout ajout, modification ou suppression d'un enregistrement de type A dans
le DNS entraîne l'ajout, la modification ou la suppression d'un ou plusieurs
enregistrement(s) de type PTR correspondant(s) ainsi que du ou des CNAME qui
pointent dessus;
- tout ajout, modification ou suppression d'un enregistrement de type PTR dans
le DNS entraîne l'ajout, la modification ou la suppression d'un enregistrement
de type A correspondant;
Les règles ci-dessus s'appliquent pour assurer une intégrité
référentielle des données du DNS : Un nom x pointe
sur une adresse IP y, cette adresse IP y pointe donc sur le nom x. Simple bon
sens. Ces règles imposent cependant quelques limitations, notamment que
votre serveur DNS doit être « master » pour la zone
inverse de tous domaine DNS dont il est « master ». Cependant,
les quelques limitations imposées par le logiciel sont minimes et ne
devraient pas entraver l’administration d’un DNS typique. Elles
ne sont pas rencontrées dans un DNS corporatif comme celui d’Hydro
Québec, qui comprend des centaines de zones, réparties en master-slave,
avec des DNS secondaires et de la délégation, et des dizaines
de milliers d’enregistrements dans la base de données. Les mises
à jour sont dynamiques et effectives immédiatement sur le serveur
DNS :
Lorsqu’une entrée est ajoutée, modifiée ou supprimée
du DNS, ou lorsqu’une zone est ajoutée ou supprimée, le
changement est visible immédiatement dans le DNS. Bdns effectue le changement
dans la base de données et le propage dans le DNS immédiatement
après.
Les
types d'usagers:
Bdns supporte les connexions simultanées de plusieurs types d’usagers.
Voici la liste des types d’usager et les privilèges de chacun :
Administrateur
Cet usager peut tout faire:
- créer/supprimer des zones primaires ou secondaires (primary ou slave)
dans le DNS;
- recycler le serveur DNS (kill –HUP de named);
- créer/modifier/supprimer tous les types d'enregistrements du DNS (SOA,
NS, MX, A, CNAME, PTR et SRV);
- créer/modifier/supprimer des comptes usagers dans Bdns;
Opérateur:
Cet usager peut créer/modifier/supprimer tous les enregistrements de
type MX, A, CNAME, PTR et SRV de toutes les zones du DNS;
Responsable:
Cet usager peut créer/modifier/supprimer tous les enregistrements de
type MX, A, CNAME, PTR et SRV des zones pour lesquelles il est désigné
responsable.
Connexion
et mot de passe
Tous les usagers doivent se connecter avec leur code d'usager/mot de passe avant
d'avoir accès aux fonctionalités du système.
L es usagers ont le droit de modifier leur mot de passe et peuvent choisir la
langue d'affichage qu'ils préfèrent.
Seul un usager de type administrateur peut modifier le type d'un autre usager
ou les zones du DNS assignées à un usager de type responsable.
Pour quelqu'un
qui connaît un peu comment fonctionne un service DNS, l'utilisation de
Bdns devrait être aisée dès le début. Les écrans
permettent de parcourir le DNS par les noms de domaines ou par les réseaux
IP qui le composent. Des boutons permettent d'accéder à des écrans
qui offriront de modifier ou supprimer les entrées affichées,
et d'autres boutons apportent des écrans permettant d'en créer
de nouvelles.
- Les enregistrements du DNS sont affichés dans des tableaux;
- Pour ajouter un enregistrement, cliquez sur le bouton 'ajouter' dans le haut
du tableau affichant un domaine ou une zone;
- Pour rechercher un enregistrement dans le DNS, cliquez sur le bouton 'Rechercher'.
Deux types de recherche sont disponibles:
- La recherche à partir du menu principal, qui recherche dans tout le
DNS;
- La recherche dans un domaine DNS ou un réseau IP qui recherche seulement
dans ce domaine ou ce réseau IP;
- Lorsqu'il y a un bouton bleu contenant la lettre 'M' à côté
d'un champ, cela signifie qu'on peut modifier le champ en cliquant dessus;
- Lorsqu'il y a un bouton rouge contenant ls lettre 'S' à la fin d'une
ligne de tableau, cela signifie qu'on peut supprimer la ligne (l'enregistrement)
en cliquant dessus;
- Chaque suppression dans Bdns (enregistrement ou zone complète) requiert
la confirmation par l'usager;
Pour ajouter une entrée:
Pour supprimer une entrée:
Pour rechercher une entrée dans la base de données du DNS:
Pour modifier une entrée:
La gestion
des zones
NOTE:
La gestion des
zones n'est accessible que par des usagers de type 'administrateur', et pour
cette raison, peu de validation sont faites sur les entrées (un administrateur
est supposé savoir ce qu'il fait, hum!). Faites donc attention à
ce que vous entrez dans cette section du système. Pour bien comprendre
comment cette section fonctionne, créez-vous une zone de test, et expérimenez
avec cette zone avant de le faire en production.
Chaque fois que vous modifiez un paramètre dans l'écran d'une zone, le paramètre ne prend pas effet immédiatement; vous devez cliquer sur le bouton ‘Actualiser’ pour recycler le serveur DNS (Bdns envoie un "ndc reload" à named). Cette façon de faire a pour but d’éviter d’arrêter-redémarrer le serveur bind à chaque modification faite à une zone; vous pouvez ainsi, par exemple, modifier plusieurs paramètres SOA d’une zone, ajouter un serveur MX dans cette zone, et cliquer ‘Actualiser’ à la fin, pour recycler BIND et rendre les changements effectifs.
Gestion
des usagers
La page de gestion des usagers est très simple à utiliser et utilise les mêmes boutons et fonctionne comme tout le rest de Bdns. La seule particularité réside dans la façon d'assigner des zones à un usager responsable:
L'usager responsable
pourra ainsi saisir des entrées de type A, CNAME, PTR et MX dans chacune
des zones pour lesquelles il est désigné 'responsable'.
Un usager responsable
qui n'a pas de zones dans sa liste de zones ne peut que consulter les entrées
du DNS; il ne peut effectuer aucune modification. Ceci est une bonne façon
de créer un usager de type 'lecture seulement'.
Attention à
la manipulation des usagers de type 'administrateur'
Si vous êtes connecté avec un compte de type 'administrateur' et
que vous changez votre type de compte pour 'operateur' ou 'responsable', vous
perdez instantanément votre privilège d'administrateur et vous
ne pourrez le retrouver qu'en utilisant un autre compte de type 'administrateur'
pour vous remettre vos droits. Si vous enlevez les droits d'administrateur au
seul compte de type 'administrateur' restant dans la liste des usagers, aucun
autre compte de type 'administrateur' ne vous permettra de regagner vos droits,
puisqu'ils n'en restera plus. Vous devrez alors modifier votre compte directement
dans la base de données.
Morale de cette histoire: ne sciez pas la branche sur laquelle vous êtes
assis !
Il reste beaucoup de choses à ajouter à Bdns. Voici la liste en date du 20 décembre 2003 (si vous souhaitez en ajouter à cette liste, envoyez vos suggestions par EMail à thebutch@users.sourceforge.net
Voici une liste non-exhaustive:
- Refaire le look
du système (je suis un programmeur; pas un artiste...) pour qu'il ait
un look plus consistent;
- Permettre de gérer et synchroniser un ou des serveurs DNS 'slave' et/ou
'cache' à partir du serveur primaire;
- Offrir un mécanisme pour exécuter des commandes sur d'autres
serveurs ;
- Ajouter un utilitaire pour importer
- Permettre de modifier les noms des entrées dans la section ‘Parcourir
le DNS par IP;
- Plus de validation dans la section ‘Gestion des zones’;
(fin du document)