LDAP -- obtenint les DNS d'un directori LDAP

Bé, ahir després de barallar-m'hi molt vaig aconseguir que el BIND9 (servidor de dominis DNS) aconseguís agafar les dades directament d'un directori LDAP.

A diferència de quan BIND9 carrega les dades des dels fitxers de configuració, que carrega les dades en memòria. Quan ho fa connectat a l'LDAP, mai manté les dades en memòria, cada cop realitza una consulta LDAP, de manera que es pot modificar els contingut d'aquest directori i automàticament es veurà reflectit en les consultes DNS.

Anem a veure com ens ho hem fet per aconseguir aquesta fita. I cal dir que no ha sigut tant senzill com amb l'autenticació PAM.

Buscar informació a Internet

Bé, sembla ser que no hi ha masses llocs on expliquin com realitzar això. En principi només he trobat una pàgina en anglès, una en alemany, una en francès, i hem sembla que una en japonès i en portuguès.

És a dir, poca bibliografia. I tota utilitzant el mateix procediment, que era compilar de nou el BIND9, cosa que volia evitar. Però es veu que afegir accessos a dades externs s'ha de fer des de la compilació amb les noves llibreries.

Descarregar-nos les llibreries d'accés a LDAP

BIND9 disposa d'una interfície anomenada "Simple DataBase Interface", que permet crear les teves connexions a orígens de dades diferents. N'hi ha un per a LDAP, un per a MySQL, i suposo que algun altres.

La Interfície per a LDAP és troba en aquesta web: http://www.venaas.no/ldap/bind-sdb/, i es pot descarregar la versió 1.0 des d'aquesta adreça: http://www.venaas.no/ldap/bind-sdb/bind-sdb-ldap-1.0.tar.gz. Contingut que descarregarem en un directori temporal, descomprimirem i hi trobarem un fitxer de codi i la seva capçalera (ldapdb.c i ldapdb.h).

També en caldrà el schema que haurem d'utilitzar en el nostre directori LDAP, per a que el sistema identifiqui els diferents elements del DNS. Aquest schema el podeu descarregar d'aquí: http://www.venaas.no/ldap/bind-sdb/dnszone-schema.txt i l'haureu de copiar en el directori de schemes de l'LDAP (/etc/ldap/schema) amb el nom dnszone.schema.

El que no s'ha de fer per compilar BIND9

En un primer moment vaig descarregar-me el codi font, directament des de la pàgina web del projecte, però no hi havia manera de compilar-lo correctament.

Posteriorment vaig trobar la instrucció de Debian "apt-get source bind9" que et descarregava el codi font de la mateixa versió que tens instal·lada amb "apt-get install bind9". Des d'aquí vaig fer les modificacions indicades i vaig compilar amb "./configure" i "make install" però el bind es va instal·lar en un altre directori i el malparit buscava els fitxers de configuració en altres directoris, i al final no funcionava ni amb els fitxers de configuració.

El que funciona per compilar BIND9

Al final, vaig decidir buscar al google "apt-get source bind9" i debian, i vaig descobrir que hi ha una forma per a que el sistema et realitzi una compil·lació i instal·lació mantenint les configuracions de la distribució.

Així, primer cal trobar les dependències de bind9. Així us estalviareu d'instal·lar llibreries que no es troben a l'hora de compilar. Això ho farem amb:

apt-get -y build-dep bind9

El següent pas serà descarregar-nos el codi font, i ho farem amb la comanda descrita anteriorment:

apt-get source bind9

Un cop tenim el codi font, he de fer una sèrie de modificacions.

Integrar LDAPDB en el BIND9

Un cop tenim el codi font de bind9 cal afegir les modificacions de ldapdb, per a que es permeti obtenir les dades de l'LDAP.

El primer que cal és copiar els dos fitxers de codi LDAPDB dins el codi de BIND9:

cp ldapdb.c bind-9.3.2/bin/named/
cp ldapdb.h bind-9.3.2/bin/named/include

El següent pas, és modificar el fitxer Makefile del directori "bin/named" per a que compili els drivers de LDAPDB:

#
#Add database drivers here.
#
DBDRIVER_OBJS = ldapdb.@O@
DBDRIVER_SRCS = ldapdb.c
DBDRIVER_INCLUDES = -I/usr/local/include
DBDRIVER_LIBS = -L/usr/local/lib -lldap -llber -lresolv

I per acabar afegir la capçalera i les funcions de les tasques de registre del driver, de des-registre. Si us hi fixeu només cal que busqueu la cadena "xxdb" per trobar en quin lloc heu d'afegir les vostres funcions a la vostra llibreria LDAP:

/* #include "xxdb.h" */
#include  

Afegir la següent línia per inicialitzar la funció ldapdb:

        /*
         * Add calls to register sdb drivers here.
         */
        /* xxdb_init(); */
        ldapdb_init();

I afegir la línia per netejar la funció:

        /*
         * Add calls to unregister sdb drivers here.
         */
        /* xxdb_clear(); */
        ldapdb_clear(); 

Compilar el codi font modificat

L'ultim pas és compilar el codi font modificat. Per a que conservi les dependències i configuracions de la distribució actual, utilitzeu les següents instruccions.

La primera és, des del mateix directori on heu obtingut els codi font, és executar altra vegada la descàrrega del codi font amb la opció de compilació directa. Com que ja el tenim descarregat, aquesta funció només realitzarà la compilació amb els canvis que hem realitzat. Això ens crearà un munt de fitxer *.deb per a la posterior instal·lació.

apt-get source bind9 -b

Un cop compilat, passem a instal·lar els paquets .deb que ens ha creat la comanda anterior. Això ho farem directament amb:

dpkg -i *.deb

Ja tenim el bind9 modificat i funcionant. Estaria bé comprovar que els fitxers /usr/sbin/named* tinguin la data d'avui (quan s'ha compilat). També pots re-arrencar el dimoni i comprovar que les configuracions per fitxer funcionen correctament. Tal com funcionaven abans.

Configurar el nostre domini LDAP

El següent pas serà canviar la configuració de BIND9 per a que els domini xarxa.guifi.net i la subxarxa "10.138.x.x" apunti directament al directori ldap. La configuració d'aquests dominis mestres serà el següent, amb la línia d'accés a la configuració del fitxer comentada.

zone "138.10.in-addr.arpa" {
        type master;
#       file "/etc/bind/db.10.138.4";
        database "ldap ldap://localhost/ou=138.10.in-addr.arpa,ou=dns,dc=guifi,dc=net 172800";
};

# Versió per LDAP
zone "xarxa.guifi.net" {
        type master;
#       file "/etc/bind/db.xarxa.guifi.net";
        database "ldap ldap://localhost/ou=xarxa.guifi.net,ou=dns,dc=guifi,dc=net 172800";
#       database "ldap ldap://localhost/ou=xarxa.guifi.net,ou=dns,dc=guifi,dc=net???? \
#!bindname=cn=admin%2cdc=guifi%2cdc=net,!x-bindpw=PasswordLDAP 172800";
};

Com podeu veure en la última línia comentada, si l'usuari anònim no té permisos de lectura, es pot afegir un usuari i contrasenya per poder llegir aquestes dades LDAP.

Omplir el directori LDAP

Per acabar, caldrà afegir les dades en aquest directori. Tota la part de DNS l'afegirem en una unitat d'organització anomenada "ou=dns,dc=guifi,dc=net".

version: 1

#
# Estructura de la branca de DNS
# --
dn: ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: organizationalUnit
ou: dns
description: Node Arrel d'on penjaràn les zones DNS

Després crearem una unitat d'organització per a cada domini que volem enllaçar amb el BIND9, amb les seves dades a l'interior.

El primer serà per resoldre els noms "xarxa.guifi.net"

version: 1

#
# Node arrel Zona DNS xarxa.guifi.net
# --
dn: ou=xarxa.guifi.net,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: organizationalUnit
ou: xarxa.guifi.net
description: Node arrel del Domini xarxa.guifi.net



#
# El SOA
# --
dn: relativeDomainName=@,ou=xarxa.guifi.net,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: dNSZone
zoneName: xarxa.guifi.net
relativeDomainName: @
dNSTTL: 3600
dNSClass: IN
sOARecord: servidor hostmaster 2007032001 8H 2H 1W 1D
nSRecord: servidor
mXRecord: 10 servidor
mXRecord: 50 meteocat
aRecord: 10.138.4.4
tXTRecord: Zona_principal_de_xarxa.guifi.net


#
# Registre A (ap)
# --
dn: relativeDomainName=ap,ou=xarxa.guifi.net,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: dNSZone
zoneName: xarxa.guifi.net
relativeDomainName: ap
dNSTTL: 1800
dNSClass: IN
aRecord: 10.138.4.1
tXTRecord: ap_sensefils_de_dins_de_casa


#
# Registre A (meteocat)
# --
dn: relativeDomainName=meteocat,ou=xarxa.guifi.net,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: dNSZone
zoneName: xarxa.guifi.net
relativeDomainName: meteocat
dNSTTL: 1800
dNSClass: IN
aRecord: 10.138.4.3
tXTRecord: portatil_meteocat_de_dins_de_casa



#
# Registre A (servidor)
# --
dn: relativeDomainName=servidor,ou=xarxa.guifi.net,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: dNSZone
zoneName: xarxa.guifi.net
relativeDomainName: servidor
dNSTTL: 1800
dNSClass: IN
aRecord: 10.138.4.4
tXTRecord: servidor_principal_de_dins_de_casa



#
# Registre A (joia)
# --
dn: relativeDomainName=joia,ou=xarxa.guifi.net,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: dNSZone
zoneName: xarxa.guifi.net
relativeDomainName: joia
dNSTTL: 1800
dNSClass: IN
aRecord: 10.138.4.5
tXTRecord: portatil_mac_de_dins_de_casa


#
# Registre A (wii)
# --
dn: relativeDomainName=wii,ou=xarxa.guifi.net,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: dNSZone
zoneName: xarxa.guifi.net
relativeDomainName: wii
dNSTTL: 1800
dNSClass: IN
aRecord: 10.138.4.11
tXTRecord: consola_wii_dins_de_casa


#
# Registre CNAME (www)
# --
dn: relativeDomainName=www,ou=xarxa.guifi.net,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: dNSZone
zoneName: xarxa.guifi.net
relativeDomainName: www
dNSTTL: 1800
dNSClass: CNAME
cNAMERecord: servidor
tXTRecord: alies_per_al_servidor_principal

I la resolució inversa "138.10.in-addr.arpa"


#
# Node arrel de les IPs 10.138.4
# --
dn: ou=138.10.in-addr.arpa,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: organizationalUnit
ou: 138.10.in-addr.arpa
description: Node arrel de la sub-xarxa 10.145
 

#   
# Registre SOA reverse
# --
dn: relativeDomainName=@,ou=138.10.in-addr.arpa,ou=dns,dc=guifi,dc=net
objectClass: top   
objectClass: dNSZone
relativeDomainName: @
dNSTTL: 3600
dNSClass: IN
sOARecord: servidor.xarxa.guifi.net. hostmaster.servidor.xarxa.guifi.net. 2007032101 8H 2H 1W 1D
nSRecord: servidor.xarxa.guifi.net.
mXRecord: 10 servidor.xarxa.guifi.net.
mXRecord: 50 meteocat.xarxa.guifi.net.
zoneName: 138.10.in-addr.arpa
    

#
# Registre PTR (1.4)
# --
dn: relativeDomainName=1.4,ou=138.10.in-addr.arpa,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: dNSZone
dNSTTL: 86400
relativeDomainName: 1.4
dNSClass: IN
pTRRecord: ap.xarxa.guifi.net.
tXTRecord: 1.4.138.10.in-addr.arpa
zoneName: 138.10.in-addr.arpa
    

#
# Registre PTR (3.4)
# --
dn: relativeDomainName=3.4,ou=138.10.in-addr.arpa,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: dNSZone
dNSTTL: 86400
relativeDomainName: 3.4
dNSClass: IN
pTRRecord: meteocat.xarxa.guifi.net.
tXTRecord: 3.4.138.10.in-addr.arpa
zoneName: 138.10.in-addr.arpa   
    

#
# Registre PTR (4.4)
# --
dn: relativeDomainName=4.4,ou=138.10.in-addr.arpa,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: dNSZone
dNSTTL: 86400
relativeDomainName: 4.4
dNSClass: IN
pTRRecord: servidor.xarxa.guifi.net.
tXTRecord: 4.4.138.10.in-addr.arpa
zoneName: 138.10.in-addr.arpa



#
# Registre PTR (5.4)
# --
dn: relativeDomainName=5.4,ou=138.10.in-addr.arpa,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: dNSZone
dNSTTL: 86400
relativeDomainName: 5.4
dNSClass: IN
pTRRecord: joia.xarxa.guifi.net.
tXTRecord: 5.4.138.10.in-addr.arpa
zoneName: 138.10.in-addr.arpa


#
# Registre PTR (11.4)   
# --
dn: relativeDomainName=11.4,ou=138.10.in-addr.arpa,ou=dns,dc=guifi,dc=net
objectClass: top
objectClass: dNSZone
dNSTTL: 86400
relativeDomainName: 11.4
dNSClass: IN
pTRRecord: wii.xarxa.guifi.net.
pTRRecord: consola.xarxa.guifi.net.
tXTRecord: 11.4.138.10.in-addr.arpa
zoneName: 138.10.in-addr.arpa

Comprovar que funciona

Hi ha dues aplicacions que permeten comprovar quins valors retornen els servidors DNS. Aquestes aplicacions són dig, i nslookup.

Per comprovar la IP d'un domini:

$ nslookup wii.xarxa.guifi.net
Server:         10.138.4.4
Address:        10.138.4.4#53

Name:   wii.xarxa.guifi.net
Address: 10.138.4.11

Per comprovar el domini de l'adreça 10.138.4.11

$ nslookup 10.138.4.11
Server:         10.138.4.4
Address:        10.138.4.4#53

11.4.138.10.in-addr.arpa        name = consola.xarxa.guifi.net.
11.4.138.10.in-addr.arpa        name = wii.xarxa.guifi.net.

En aquest exemple aquesta adreça ip se li han associat dos noms de domini.

Bé, espero que us sigui d'utilitat.

Opcions de visualització de comentaris

Escull com vols veure els comentaris i clica 'Desa configuració' per activar els canvis.

Error al re-iniciar

De la mateix manera que ha passat amb el Postfix, ahir degut a una caiguda del sistema per una fallada elèctrica ens hem trobat que el DNS que penjava del directori LDAP no responia correctament, mentre que la resta de dominis DNS si que ho feien.

El primer intent ha estat re-iniciar el BIND9, i llavors ja funcionava. Tornant a re-iniciar el servidor, hem comprovat que l'error es mantenia, així que hem certificat que el procés d'arrencada era el causant de que el DNS no agafés les dades de l'LDAP.

Mirant el procés d'arrencada del Debian (Ubuntu), veiem aquestes línies en aquests directoris:

# ls -l rc* | grep "slapd\|bind"
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 K80slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 K85bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 K80slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 K85bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 S19slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 S15bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 S19slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 S15bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 S19slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 S15bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 S19slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 S15bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 K80slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 K85bind9 -> ../init.d/bind9

Veiem que l'arrencada de l'LDAP (S19slapd) té un número més gran que l'arrencada del BIND9 (S15bind9).

Així que el podem concloure que el problema és que el BIND no troba el servei del directori LDAP i no hi connecta. Per solucionar això només cal modificar els fitxers d'arrencada de l'LDAP per a que arranquin abans del BIND i això és fa canviant el número per un d'inferior al del BIND. Passeu per tots els directoris on hi hagi els fitxer "S??slapd" i hi poseu un número anterior al BIND9. Tot això quedarà així:

# ls -l rc* | grep "slapd\|bind"
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 K80slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 K85bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 K80slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 K85bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 S14slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 S15bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 S14slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 S15bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 S14slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 S15bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 S14slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 S15bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root 15 2007-03-19 16:03 K80slapd -> ../init.d/slapd
lrwxrwxrwx 1 root root 15 2006-10-09 15:31 K85bind9 -> ../init.d/bind9

Torneu a arrencar el servidor i comproveu si ja funciona tot correctament. A mi m'ha funcionat perfectament.

Bé, ja se sap que sempre hi ha alguna cosa que no tenim present a l'hora de realitzar segons quines configuracions. Espero que ja no hi hagi més errors. Sticking out tongue

pàgina generada en: 0.801 segons.