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.

