ubuntuusers.de

BIND9 + LDAP; DNS Server bind mit Zonen in LDAP

Status: Gelöst | Ubuntu-Version: Server 8.04 (Hardy Heron)
Antworten |

monateng

Avatar von monateng

Anmeldungsdatum:
19. April 2007

Beiträge: 1055

Wohnort: Wellerode

Nabend,

nachdem nun mein Bind9 endlich so läuft wie er soll, wollte ich einfach einmal wissen wie man den DNS-Server in eine Datenbank integrieren kann. Bestimmt ist dieses möglich. Wenn ich mir den Active Directory von MS so anschaue, ist dieser ja ähnlich aufgebaut.

Wer hat Erfahrung mit Bind9 + LDAP bzw. eine andere Datenbank?
Kennt jemand eine gute Lösung dafür?
Wo liegen die Probleme bzw. wo können die Probleme liegen?

PS:
Ein älterer Thread von toe verweist leider auf ein nicht mehr vorhandenes HowTo ⇒ bind9 mit LDAP SDB


Gruß

monateng

monateng

(Themenstarter)
Avatar von monateng

Anmeldungsdatum:
19. April 2007

Beiträge: 1055

Wohnort: Wellerode

Hallo community,

und wieder einmal habe ich die Lösung slebst parat. Der DNS-Server BIND bringt von Haus aus keine LDAP unterstützung mit. PowerDNS hat allerindgs wie hier im Debian-Wiki beschrieben eine LDAP http://wiki.debian.org/LDAP/PowerDNSSetup. Leider habe ich mich mit PowerDNS nicht anfreunden können. Bleibe somit bei BIND9

Nach nochmaligem Suchen, habe ich ein HowTo in dem leo34-Blog gefunden. Hier findet ihr eine gute Beschreibung zum Betreiben von BIND9 mit zonen aus LDAP via bind-dlz.
Mit bind-dlz (dynamic loadable zones) lassen sich auch andere Datenbanktypen als Backend nutzen. Ein Pacthen von BIND wie es LDAP-sdb-Backend vorsieht, ist somit nicht nötig.


Um Probleme zu vermeiden, werde ich hier die Schritte nochmals kurz anbringen. Hatte es in der vergangenheit öffters, dass Wiki- bzw. Forenartikel nicht mehr zu finden waren und somit ich eine neue Lösung habe anstreben müssen.


Wiki-Artikel

Ich gehe davon aus, dass Ihr bereits OpenLDAP und BIND9 erfolgreich Installiert habt und vollständig an eure Bedürfnisse angepasst Konfiguriert habt.
Nun müsst Ihr Prüfen ob dlz-zones in eurem Bind9 einkompiliert wurde.

aptitude show bind9

Sollte dieses nicht der Fall sein, wie bei mir im übrigen auch, so müsst Ihr den Sourcecode herunterladen und mit den zuvor fehlenden Optionen kompilieren:

cd /tmp
apt-get source bind9
cd bind9
./configure --enable-ipv6 --with-dlz-ldap=yes

Da es eine Bug, den sogenannte %-Bug oder Bug-227344 gibt, kann man diesen auch gleich beheben. Dafür muss man in die Datei contrib/dlz/drivers/sdlz_helper.c um Zeile 168 das % in ein $ verändern. Dieser Bug sollte aber nur noch in Hardy zu finden sein.
Nun bauen wir das neue .deb-Paket und Installieren dieses auch gleich:

dpkg-buildpackage
dpkg -i ../bind9*.deb

Ab jetzt kann BIND LDAP-Zonen verarbeiten. !!Achtung!!, der dlz-Treiber reagiert auf Zeilenumbrüche sehr komisch. Außerdem sollte man auf % und $ im vergleich zum dlz-DLAP-Beispiel acht geben. Die Leerzeilen sind nur zur besseren Orientierung gedacht und müssen bitte entfernt werden.

dlz “ldap zone” {

database “ldap 1

v3 simple {cn=admin,<ldap-bind-dn>} {<secret>} {}

ldap:///dlzZoneName=$zone$,ou=dns,<ldap-bind-dn>???objectclass=dlzZone

ldap:///dlzHostName=$record$,dlzZoneName=$zone$,ou=dns,<ldap-bind-dn>?
dlzTTL,dlzType,dlzPreference,dlzData,dlzIPAddr,
dlzPrimaryNS,dlzAdminEmail,dlzSerial,dlzRefresh,dlzRetry,dlzExpire,
dlzMinimum?sub?(&(objectclass=dlzAbstractRecord)(!(dlzType=soa)))

ldap:///dlzHostName=@,dlzZoneName=$zone$,ou=dns,<ldap-bind-dn>?
dlzTTL,dlzType,dlzData,dlzPrimaryNS,
dlzAdminEmail,dlzSerial,dlzRefresh,dlzRetry,dlzExpire,
dlzMinimum?sub?(&(objectclass=dlzAbstractRecord)(dlzType=soa))

ldap:///dlzZoneName=$zone$,ou=dns,<ldap-bind-dn>?
dlzTTL,dlzType,dlzHostName,dlzPreference,dlzData,
dlzIPAddr,dlzPrimaryNS,dlzAdminEmail,dlzSerial,dlzRefresh,dlzRetry,
dlzExpire,dlzMinimum?sub?(&(objectclass=dlzAbstractRecord)(!(dlzType=soa)))

ldap:///dlzZoneName=$zone$,ou=dns,<ldap-bind-dn>??sub?
(&(objectclass=dlzXFR)(dlzIPAddr=$client$))”;
};

Nach dem Neustart von bind sollte in der /var/log/syslog das erfolgreiche Laden der Zone vermerkt sein. Sollte das nicht der Fall sein, dann sind mit 99,9% die Leerzeichen, Zeilenumbrüche oder Verbindungsdaten falsch. Ähnlich diesem:

named[14557]: Loading ‘ldap zone’ using driver ldap

Um einen vollwertigen Bind wieder zu bekommen, benötigt man das folgende LDAP- oder auch DLZ-Schema. Dem HowTo folgend, waren es diese Zeilen. Ich habe diese hier nicht angegleichen:

dn: ou=dns,<ldap-bind-dn>
objectClass: organizationalUnit
objectClass: top
ou: dns

dn: dlzZoneName=zone.intern,ou=dns,<ldap-bind-dn>
objectClass: dlzZone
objectClass: top
dlzZoneName: zone.intern

dn: dlzHostName=@,dlzZoneName=zone.intern,ou=dns,<ldap-bind-dn>
objectClass: dlzHost
objectClass: top
dlzHostName: @

dn: dlzRecordID=1,dlzHostName=@,dlzZoneName=zone.intern,ou=dns,<ldap-bind-dn>
dlzTTL: 10
dlzExpire: 604800
dlzRefresh: 2800
dlzMinimum: 86400
dlzAdminEmail: it.zone.de.
objectClass: dlzSOARecord
objectClass: dlzAbstractRecord
objectClass: top
dlzRecordID: 1
dlzSerial: 2008022801
dlzType: soa
dlzHostName: @
dlzRetry: 7200

dn: dlzRecordID=2,dlzHostName=@,dlzZoneName=zone.intern,ou=dns,<ldap-bind-dn>
dlzRecordID: 2
objectClass: dlzNSRecord
objectClass: dlzGenericRecord
objectClass: dlzAbstractRecord
objectClass: top
dlzTTL: 10
dlzType: ns
dlzHostName: @
dlzData: pridns.zone.intern.

dn: dlzHostName=pridns,dlzZoneName=zone.intern,ou=dns,<ldap-bind-dn>
objectClass: dlzHost
objectClass: top
dlzHostName: pridns

dn: dlzRecordID=1,dlzHostName=pridns,dlzZoneName=zone.intern,ou=dns,<ldap-bind-dn>
dlzIPAddr: 192.168.1.1
dlzRecordID: 1
objectClass: dlzARecord
objectClass: dlzAbstractRecord
objectClass: top
dlzTTL: 3600
dlzType: A
dlzHostName: pridns

Noch einmal den Bind neustarten. Auf die Anfrage mit dig sollte man nun folgendes 'IP 192.168.1.1' als antwort bekommen.

/etc/init.d/bind9 restart
dig pridns.zone.intern @localhost

BIND9 ist somit nun mit LDAP einsatzbereit. Viel Spaß beim Probieren und dank an die Vorarbeit von blog.leo34.net.


Gruß

monateng

ro

Avatar von ro

Anmeldungsdatum:
23. August 2006

Beiträge: 189

Hey monateng,

danke fürs teilen deiner Anleitung! Ich probiers auch gerade, bekomme aber beim kompilieren unter Jaunty folgenden Fehler:

.libs/dlz_bdb_driver.o: In function `bdb_opendb':
dlz_bdb_driver.c:(.text+0x39f): undefined reference to `db_create'
dlz_bdb_driver.c:(.text+0x3ab): undefined reference to `db_strerror'
dlz_bdb_driver.c:(.text+0x42a): undefined reference to `db_strerror'
dlz_bdb_driver.c:(.text+0x48d): undefined reference to `db_strerror'
.libs/dlz_bdb_driver.o: In function `bdb_create':
dlz_bdb_driver.c:(.text+0x5ca): undefined reference to `db_env_create'
dlz_bdb_driver.c:(.text+0x5db): undefined reference to `db_strerror'
dlz_bdb_driver.c:(.text+0x77d): undefined reference to `db_strerror'
dlz_bdb_driver.c:(.text+0x7e1): undefined reference to `db_strerror'
dlz_bdb_driver.c:(.text+0x8c2): undefined reference to `db_strerror'
.libs/dlz_bdbhpt_driver.o: In function `bdbhpt_opendb':
dlz_bdbhpt_driver.c:(.text+0x38f): undefined reference to `db_create'
dlz_bdbhpt_driver.c:(.text+0x39b): undefined reference to `db_strerror'
dlz_bdbhpt_driver.c:(.text+0x41a): undefined reference to `db_strerror'
dlz_bdbhpt_driver.c:(.text+0x47d): undefined reference to `db_strerror'
.libs/dlz_bdbhpt_driver.o: In function `.L37':
dlz_bdbhpt_driver.c:(.text+0x67d): undefined reference to `db_env_create'
dlz_bdbhpt_driver.c:(.text+0x692): undefined reference to `db_strerror'
.libs/dlz_bdbhpt_driver.o: In function `.L35':
dlz_bdbhpt_driver.c:(.text+0x7c1): undefined reference to `db_strerror'
collect2: ld returned 1 exit status
make[3]: *** [named] Fehler 1
make[3]: Verlasse Verzeichnis '/tmp/bind9-9.5.1.dfsg.P2/bin/named'
make[2]: *** [subdirs] Fehler 1
make[2]: Verlasse Verzeichnis '/tmp/bind9-9.5.1.dfsg.P2/bin'
make[1]: *** [subdirs] Fehler 1
make[1]: Verlasse Verzeichnis '/tmp/bind9-9.5.1.dfsg.P2'
make: *** [build-stamp] Fehler 2
dpkg-buildpackage: Fehlschlag: debian/rules build gab Fehler-Exitstatus 2

Scheint ein Problem mit der libdb zu sein. Welche libdb-Version verwendest du?

Edit: Ich habe kurzerhand den BDB-Support via debian/rules ausgeschaltet, dann klappte die Kompilierung.

Steps to reproduce:

vi debian/rules

und die folgende Option setzen:

--with-dlz-bdb=no \

Grüße,

Robert

ro

Avatar von ro

Anmeldungsdatum:
23. August 2006

Beiträge: 189

Hm, bei mir wills einfach nicht so richtig funktionieren. Ich bin genau deine Schritte nachgegangen, bekomme aber beim Starten vom Bind folgenden Fehler:

17-Aug-2009 16:12:31.682 Loading 'ldap zone' using driver ldap
17-Aug-2009 16:12:31.683 Loading SDLZ driver.
17-Aug-2009 16:12:31.684 LDAP driver running multithreaded
17-Aug-2009 16:12:31.685 parsing allow zone transfer query failed
17-Aug-2009 16:12:31.686 SDLZ driver failed to load.
17-Aug-2009 16:12:31.687 DLZ driver failed to load.
17-Aug-2009 16:12:31.688 load_configuration: failure
17-Aug-2009 16:12:31.689 loading configuration: failure
17-Aug-2009 16:12:31.689 exiting (due to fatal error)

Leider spuckt Google nur sehr zurückhaltend Infos betreffend "parsing allow zone transfer query failed" aus. Auf Leerzeilen -zeichen und Verbindungsdaten habe ich natürlich geachtet 👍

Grüße,

Robert

monateng

(Themenstarter)
Avatar von monateng

Anmeldungsdatum:
19. April 2007

Beiträge: 1055

Wohnort: Wellerode

Hallo ro,

mir scheint es als sein dein LDAP-Query Fehlerhaft. Schau doch da mal nach, bzw. Poste doch einfach mal die Zeilen.


Gruß

monateng

ro

Avatar von ro

Anmeldungsdatum:
23. August 2006

Beiträge: 189

Hm, es scheint, ein einfaches Ersetzen in der Datei contrib/dlz/drivers/sdlz_helper.c reicht nicht aus. Mit folgendem patch aus [1] klappte es aber, und nach einer Neukompilierung bekomme ich keine Fehlermeldungen mehr. Danke!

http://article.gmane.org/gmane.network.dns.bind9.dlz/2066

>From a4847f27225e1a062723173ba100906fa7f1cd74 Mon Sep 17 00:00:00 2001
From: Mathieu Gauthier-Lafaye <mathieu.gauthierlafaye@gmail.com>
Date: Sat, 18 Apr 2009 14:05:08 +0200
Subject: [PATCH] ldap correction 1

---
 contrib/dlz/drivers/dlz_ldap_driver.c         |    8 ++--
 contrib/dlz/drivers/include/dlz/sdlz_helper.h |   13 +++++---
 contrib/dlz/drivers/sdlz_helper.c             |   39 +++++++++++++------------
 3 files changed, 32 insertions(+), 28 deletions(-)

diff --git a/contrib/dlz/drivers/dlz_ldap_driver.c b/contrib/dlz/drivers/dlz_ldap_driver.c
index 35d7548..fc83bd3 100644
--- a/contrib/dlz/drivers/dlz_ldap_driver.c
+++ b/contrib/dlz/drivers/dlz_ldap_driver.c
@@ -1094,22 +1094,22 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[],
 		/* how many queries were passed in from config file? */
 		switch(argc) {
 		case 9:
-			result = build_sqldbinstance(ns_g_mctx, NULL, NULL,
+			result = build_sqldbinstance2(ns_g_mctx, "$", NULL, NULL,
 						     NULL, argv[7], argv[8],
 						     NULL, &dbi);
 			break;
 		case 10:
-			result = build_sqldbinstance(ns_g_mctx, NULL, NULL,
+			result = build_sqldbinstance2(ns_g_mctx, "$", NULL, NULL,
 						     argv[9], argv[7], argv[8],
 						     NULL, &dbi);
 			break;
 		case 11:
-			result = build_sqldbinstance(ns_g_mctx, argv[10], NULL,
+			result = build_sqldbinstance2(ns_g_mctx, "$", argv[10], NULL,
 						     argv[9], argv[7], argv[8],
 						     NULL, &dbi);
 			break;
 		case 12:
-			result = build_sqldbinstance(ns_g_mctx, argv[10],
+			result = build_sqldbinstance2(ns_g_mctx, "$", argv[10],
 						     argv[11], argv[9],
 						     argv[7], argv[8],
 						     NULL, &dbi);
diff --git a/contrib/dlz/drivers/include/dlz/sdlz_helper.h b/contrib/dlz/drivers/include/dlz/sdlz_helper.h
index 764a05a..53dd563 100644
--- a/contrib/dlz/drivers/include/dlz/sdlz_helper.h
+++ b/contrib/dlz/drivers/include/dlz/sdlz_helper.h
@@ -95,10 +95,11 @@ char *
 sdlzh_build_querystring(isc_mem_t *mctx, query_list_t *querylist);
 
 isc_result_t
-sdlzh_build_sqldbinstance(isc_mem_t *mctx, const char *allnodes_str,
-			  const char *allowxfr_str, const char *authority_str,
-			  const char *findzone_str, const char *lookup_str,
-			  const char *countzone_str, dbinstance_t **dbi);
+sdlzh_build_sqldbinstance(isc_mem_t *mctx, const char * split_str,
+			  const char *allnodes_str, const char *allowxfr_str,
+			  const char *authority_str, const char *findzone_str,
+			  const char *lookup_str, const char *countzone_str,
+			  dbinstance_t **dbi);
 
 void
 sdlzh_destroy_sqldbinstance(dbinstance_t *dbi);
@@ -109,9 +110,11 @@ sdlzh_get_parameter_value(isc_mem_t *mctx, const char *input, const char* key);
 /* Compatability with existing DLZ drivers */
 
 #define	build_querystring	sdlzh_build_querystring
-#define	build_sqldbinstance	sdlzh_build_sqldbinstance
 #define	destroy_sqldbinstance	sdlzh_destroy_sqldbinstance
 
+#define	build_sqldbinstance(mc,an,ax,at,fz,lk,cz,di)	sdlzh_build_sqldbinstance(mc,"%",an,ax,at,fz,lk,cz,di)
+#define build_sqldbinstance2 sdlzh_build_sqldbinstance
+
 #define	getParameterValue(x,y)  sdlzh_get_parameter_value(ns_g_mctx, (x), (y))
 
 #endif /* SDLZHELPER_H */
diff --git a/contrib/dlz/drivers/sdlz_helper.c b/contrib/dlz/drivers/sdlz_helper.c
index ea33db1..c19658a 100644
--- a/contrib/dlz/drivers/sdlz_helper.c
+++ b/contrib/dlz/drivers/sdlz_helper.c
@@ -107,8 +107,8 @@ destroy_querylist(isc_mem_t *mctx, query_list_t **querylist)
 
 /*% constructs a query list by parsing a string into query segments */
 static isc_result_t
-build_querylist(isc_mem_t *mctx, const char *query_str, char **zone,
-		char **record, char **client, query_list_t **querylist,
+build_querylist(isc_mem_t *mctx, const char *split_str, const char *query_str,
+		char **zone, char **record, char **client, query_list_t **querylist,
 		unsigned int flags)
 {
 	isc_result_t result;
@@ -171,7 +171,7 @@ build_querylist(isc_mem_t *mctx, const char *query_str, char **zone,
 		 */
 		tseg->sql = isc_mem_strdup(mctx,
 					   isc_string_separate(&right_str,
-							       "%"));
+							       split_str));
 		if (tseg->sql == NULL) {
 			/* no memory, clean everything up. */
 			result = ISC_R_NOMEMORY;
@@ -337,10 +337,11 @@ sdlzh_build_querystring(isc_mem_t *mctx, query_list_t *querylist)
 
 /*% constructs a sql dbinstance (DBI) */
 isc_result_t
-sdlzh_build_sqldbinstance(isc_mem_t *mctx, const char *allnodes_str,
-			 const char *allowxfr_str, const char *authority_str,
-			 const char *findzone_str, const char *lookup_str,
-			 const char *countzone_str, dbinstance_t **dbi)
+sdlzh_build_sqldbinstance(isc_mem_t *mctx, const char *split_str, 
+		  const char *allnodes_str, const char *allowxfr_str,
+		  const char *authority_str, const char *findzone_str,
+		  const char *lookup_str, const char *countzone_str,
+		  dbinstance_t **dbi)
 {
 
 	isc_result_t result;
@@ -385,8 +386,8 @@ sdlzh_build_sqldbinstance(isc_mem_t *mctx, const char *allnodes_str,
 	}
 
 	/* build the all nodes query list */
-	result = build_querylist(mctx, allnodes_str, &db->zone,
-				 &db->record, &db->client,
+	result = build_querylist(mctx, split_str, allnodes_str,
+				 &db->zone, &db->record, &db->client,
 				 &db->allnodes_q, SDLZH_REQUIRE_ZONE);
 	/* if unsuccessful, log err msg and cleanup */
 	if (result != ISC_R_SUCCESS) {
@@ -397,8 +398,8 @@ sdlzh_build_sqldbinstance(isc_mem_t *mctx, const char *allnodes_str,
 	}
 
 	/* build the allow zone transfer query list */
-	result = build_querylist(mctx, allowxfr_str, &db->zone,
-				 &db->record, &db->client,
+	result = build_querylist(mctx, split_str, allowxfr_str,
+				 &db->zone, &db->record, &db->client,
 				 &db->allowxfr_q,
 				 SDLZH_REQUIRE_ZONE | SDLZH_REQUIRE_CLIENT);
 	/* if unsuccessful, log err msg and cleanup */
@@ -410,8 +411,8 @@ sdlzh_build_sqldbinstance(isc_mem_t *mctx, const char *allnodes_str,
 	}
 
 	/* build the authority query, query list */
-	result = build_querylist(mctx, authority_str, &db->zone,
-				 &db->record, &db->client,
+	result = build_querylist(mctx, split_str, authority_str,
+				 &db->zone, &db->record, &db->client,
 				 &db->authority_q, SDLZH_REQUIRE_ZONE);
 	/* if unsuccessful, log err msg and cleanup */
 	if (result != ISC_R_SUCCESS) {
@@ -422,8 +423,8 @@ sdlzh_build_sqldbinstance(isc_mem_t *mctx, const char *allnodes_str,
 	}
 
 	/* build findzone query, query list */
-	result = build_querylist(mctx, findzone_str, &db->zone,
-				 &db->record, &db->client,
+	result = build_querylist(mctx, split_str, findzone_str,
+				 &db->zone, &db->record, &db->client,
 				 &db->findzone_q, SDLZH_REQUIRE_ZONE);
 	/* if unsuccessful, log err msg and cleanup */
 	if (result != ISC_R_SUCCESS) {
@@ -434,8 +435,8 @@ sdlzh_build_sqldbinstance(isc_mem_t *mctx, const char *allnodes_str,
 	}
 
 	/* build countzone query, query list */
-	result = build_querylist(mctx, countzone_str, &db->zone,
-				 &db->record, &db->client,
+	result = build_querylist(mctx, split_str, countzone_str,
+				 &db->zone, &db->record, &db->client,
 				 &db->countzone_q, SDLZH_REQUIRE_ZONE);
 	/* if unsuccessful, log err msg and cleanup */
 	if (result != ISC_R_SUCCESS) {
@@ -446,8 +447,8 @@ sdlzh_build_sqldbinstance(isc_mem_t *mctx, const char *allnodes_str,
 	}
 
 	/* build lookup query, query list */
-	result = build_querylist(mctx, lookup_str, &db->zone,
-				 &db->record, &db->client,
+	result = build_querylist(mctx, split_str, lookup_str,
+				 &db->zone, &db->record, &db->client,
 				 &db->lookup_q, SDLZH_REQUIRE_RECORD);
 	/* if unsuccessful, log err msg and cleanup */
 	if (result != ISC_R_SUCCESS) {
-- 
1.5.6.3

monateng

(Themenstarter)
Avatar von monateng

Anmeldungsdatum:
19. April 2007

Beiträge: 1055

Wohnort: Wellerode

Ok, ich gehe also davon aus ro,

dass dein BIND9 nun mit LDAP Unterstützung bereits läuft und es keine Probleme mehr gibt, richtig?
Wenn ja, so Klicke doch bitte auf den Link mit dem Text als gelöst markieren, Danke.


Gruß

monateng

Antworten |