Bdns - a WEB interface to manage a BIND DNS server and its zones

Éric Boucher, september 8 2004 (thebutch@videotron.ca)

Table of contents

1 - Introduction

2 - Installation

3 - A few concepts

4 - Using Bdns

5 - The future

 

1) Introduction


Bdns is a WEB application aimed at managing a BIND DNS server and its data (the zones). It consists of a set of menus and screens that you access in a WEB browser.


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.

 

2) Installation


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);
- Create a directory (for exemple: /var/named/Bdns) where the DNS zone files will be placed. Make the bdns user owner of this directory;
- Copy your DNS zone files in the directory created above (/var/named/Bdns);

- Make sure that the bdns user can write in the directory /var/named/Bdns and write the zone files:
    chown -R bdns /var/named/Bdns
    chmod 755 /var/named/Bdns
    chmod 644 /var/named/Bdns/*

- Do the same with the named.conf file (here, the named.conf file is located in /etc):
    chown bdns /etc/named.conf
    chmod 644 /etc/named.conf

- Edit your named.conf file so that the "directory" configuration line points to the directory created above; for example, if you had:
  directory /var/named
replace it by:
  directory /var/named/Bdns

- Edit the /etc/sudoers file to allow the non-privileged bdns user to issue the 'ndc reload' command so that BIND will refresh its config as needed. I discovered during Bdns' development that even if Apache, BIND and the PHP scripts run as the Bdns user, the ndc reload command must be issued as root to force BIND to reload. Go figure. In brief, make sure to have a line similar to this one in the /etc/sudoers file:
  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:

- Installation is complete.

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.

 

3) A few concepts


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.

4) Using Bdns


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 !

 


5) The future

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)