File: README.html

package info (click to toggle)
ldap2dns 0.3.1-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 528 kB
  • sloc: ansic: 1,527; php: 781; perl: 206; sh: 84; makefile: 51
file content (349 lines) | stat: -rw-r--r-- 17,190 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
<H1 align=center>LDAP to DNS gateway</H1>
<P>
<B>ldap2dns</B> is a program to create DNS (Domain Name Service) records directly
from a LDAP directory.  It can and should be be used to replace the secondary
name-server by a second primary one.<BR>
<B>ldap2dns</B> reduces all kind of administration overhead:
No more flat file editing, no more zone file editing. After having installed
<B>ldap2dns</B>, the administrator only has to access the LDAP directory.<BR>
Optionally she can add access control for each zone, create a GUI
and add all other kind of zone and resource record information without
interfering with the DNS server.<BR>
<B>ldap2dns</B> is designed to write ASCII data files used by <I>tinydns</I>
from the <I>djbdns</I> package, but also may be used to write .db-files used
by <I>named</I> as found in the <I>BIND</I> package.<BR>
<P>

<H3>1. Introduction</H3>
Often it is desirable to store DNS information in a database rather than
in flat text files. This can greatly help to reduce administration overhead
since associate information such as billing contact, account management, etc.
can be stored and processed inside the same database. Also due to the nature of
DNS, information must be stored redundantly on two or more hosts. 
The classical data replication through zone transfer is unreliable, insecure
and difficult to administer.<BR>
To solve this problem some proprietary attempts have been proposed to
store DNS information in relational databases. The nature of DNS, however,
is hierarchical and such should the database be. Using a relational database
to store DNS information is undesirable, because it becomes difficult
to store free form information. Within a hierachical data scheme, the
administrator might define more than one IP-address for each canonical name.
To implement such a feature in a relational database without breaking the 
normalization rules, one would have to add another table.<BR>
One of the most widely spread hierarchical database protocols is LDAP.
<B>ldap2dns</B> retrieves DNS information stored in an LDAP directory service
and generates a file suitable for name-servers.<BR>
Actually the most widely spread name-servers
<A HREF="http://www.isc.org/products/BIND/">named</A> and
<A HREF="http://cr.yp.to/djbdns/tinydns.html">tinydns</A> are
supported. <B>ldap2dns</B> specially has been designed to work with 
tinydns and is the favored name server daemon for the author of this program. 
<B>ldap2dns</B> can also generate files suitable for <I>named</I> version 8,
but this feature is not well supported.
There is a 
<A HREF="http://www.alternic.org/drafts/drafts-m-n/draft-miller-dns-ldap-schema-00.txt">
RFC</A> for a format description how to store DNS information in LDAP. 
This paper a draft RFC which expired in February 1999, looks as if it has been 
specially designed to be used by <I>named</I>. This scheme
does not have strict attribute-value-pair mapping, making it difficult to be used by
user interfaces. It also lacks of an implementation (or I have never heard of any).<BR>
Since <I>tinydns</I> is going another descriptive way. Therefore I implemented a similar
object-scheme more suitable for <I>tinydns</I>. Two object-classes have been defined. 
<B>DNSzone</B> stores all the information to define a DNS zone, such as the SOA 
(Start Of Authority), serial numbers etc. <B>DNSrrset</B> is used to store the information 
for a single resource record, such as the domain name, IP-addresses, class and type.<BR>
Here are the tables:
<P>
<H4>DNSzone</H4>
This object-class represents a DNS zone. It is the container for all the resource records
within a zone. Zones can be primary or secondary. If used in conjunction with
<I>tinydns</I> zones are always primary. Secondary zones don't make sense anyway!
In addition to being a container, the zone object has attributes related to
the management of the zone. These include the zone's SOA information. Each zone-object
can have none to many children of class <B>DNSrrset</B>.<BR>

<TABLE bgcolor=#EEEEEE>
<TR><TH>ATTRIBUTE</TH><TH>VALUE</TH><TH>Comment</TH></TR>
<TR><TD>objectclass</TD><TD>DNSzone</TD><TD>required</TD></TR>
<TR><TD>cn</TD><TD><I>common name</I></TD><TD>required</TD></TR>
<TR><TD>DNSzonename</TD><TD><I>Name of the zone</I></TD><TD>required, multivalued</TD></TR>
<TR><TD>DNSserial</TD><TD><I>Serial number of SOA</I></TD><TD>optional</TD></TR>
<TR><TD>DNSrefresh</TD><TD><I>Refresh time of SOA</I></TD><TD>optional, only used for zone transfers</TD></TR>
<TR><TD>DNSretry</TD><TD><I>Retry time of SOA</I></TD><TD>optional, only used for zone transfers</TD></TR>
<TR><TD>DNSexpire</TD><TD><I>Expire time of SOA</I></TD><TD>optional, only used for zone transfers</TD></TR>
<TR><TD>DNSminimum</TD><TD><I>Minimum time to live</I></TD><TD>optional, only used for zone transfers</TD></TR>
<TR><TD>DNSadminmailbox</TD><TD><I>Hostmaster's contact address</I></TD><TD>optional</TD></TR>
<TR><TD>DNSzonemaster</TD><TD><I>Primary nameserver for this zone</I></TD><TD>optional</TD></TR>
<TR><TD>DNStype</TD><TD>SOA</TD><TD>must be SOA</TD></TR>
<TR><TD>DNSclass</TD><TD>IN</TD><TD>must be IN</TD></TR>
<TR><TD>DNSttl</TD><TD><I>time to live</I></TD><TD>optional, only used with tinydns</TD></TR>
<TR><TD>DNStimestamp</TD><TD><I>timestamp</I></TD><TD>optional, only used with tinydns</TD></TR>
</TABLE>
<UL>
<LI><B>DNSzonename:</B> This field is required to describe the zone's domain name, for instance
myorg.com. More than one <B>DNSzonename</B> my be specified for a <B>DNSzone</B> so that the
same host is accessable with different zonenames.</LI>

<LI><B>DNSserial:</B> This is the serial number as used for BIND's zone transfers. Here it is
used to inform <B>ldap2dns</B> that it has to rebuild its data-file. Without increasing the serial
number <B>ldap2dns</B> will ignore all modifications until it is restarted.</LI>

<LI><B>DNSrefresh, DNSretry, DNSexpire, DNSminimum:</B> You may safly ignore these numbers
if You don't do zone-transfers. Since Your secondary nameserver will connect to the LDAP
server the same way Your primary does, You don't need zone-transfers anyway.</LI>

<LI><B>DNSzonemaster:</B> Here you specify the canonical name of your primary nameserver.</LI>

<LI><B>DNSadminmailbox:</B> This is the contact address of Your DNS-administrator. The first dot
is converted to a <I>@</I>.</LI>

<LI><B>DNStype:</B> Must be <B>SOA</B> (Start Of Authority)</LI>

<LI><B>DNSclass:</B> Must be <B>IN</B> (Internet, or do still use Chaosnet?)</LI>

<LI><B>DNSttl:</B> This is the time-to-live value as used by <B>tinydns</B>.
If TTL is nonzero (or omitted), the timestamp is a starting time from whereon this zone's
information is valid. If TTL is zero, the timestamp is an ending time (``time to die'').</LI> 

<LI><B>DNStimestamp:</B> This is the timestamp as used by <B>tinydns</B>. It represents a
string as external TAI64 timestamp, printed as 16 lowercase hexadecimal characters</LI>
</UL>
<P>

<H4>DNSrrset</H4>
The Resource Record Set represents all of the resource records for
a given host name within a zone. It must be a child of a DNSzone object.<BR>

<TABLE bgcolor=#EEEEEE>
<TR><TH>ATTRIBUTE</TH><TH>VALUE</TH><TH>Comment</TH></TR>
<TR><TD>objectclass</TD><TD>DNSrrset</TD><TD>required</TD></TR>
<TR><TD>cn</TD><TD><I>common name</I></TD><TD>required</TD></TR>
<TR><TD>DNSdomainname</TD><TD><I>Name of this record</I></TD><TD>optional, relative to zonename</TD></TR>
<TR><TD>DNSipaddr</TD><TD><I>IP address</I></TD><TD>optional, mutivalued</TD></TR>
<TR><TD>DNScname</TD><TD><I>Canonical name</I></TD><TD>optional, without ending dot relative to zonename</TD></TR>
<TR><TD>DNSpreference</TD><TD><I>integer</I></TD><TD>optional, only used for MX records</TD></TR>
<TR><TD>DNStype</TD><TD>A, CNAME, NS, MX, PTR or TXT</TD><TD>must be any valid record type</TD></TR>
<TR><TD>DNSclass</TD><TD>IN</TD><TD>must be IN</TD></TR>
<TR><TD>DNSttl</TD><TD><I>time to live</I></TD><TD>optional, only used with tinydns</TD></TR>
<TR><TD>DNStimestamp</TD><TD><I>timestamp</I></TD><TD>optional, only used with tinydns</TD></TR>
</TABLE>
<P>

<UL>
<LI><B>DNSrrset:</B> This object-class must be a direct child of DNSzone. Its <B>dn</B> should be 
specified as <PRE>cn=<I>domainname</I>,cn=<I>zonename</I>,...</PRE></LI>

<LI><B>DNSdomainname</B> This is the partial domain-name, ie. the part in front of the
zone-name.</LI>

<LI><B>DNSipaddr:</B> This specifies the IP-address in dotted format. It can be used for <B>DNSrrset</B>'s
of type <B>A, NS, MX</B> or <B>PTR</B>. <B>DNSipaddr</B> is multivalued to specifiy more than one
IP-address for a service. If used in <B>DNSrrset</B>'s with <B>DNStype</B> = <B>PTR</B> it
overrides the old-fashioned form used in <B>DNSdomainname</B> such as 13.178.23.in-addr.arpa
for reverse lookups.</LI>

<LI><B>DNScname:</B> Whenever there is a mapping of a domain-name to a canonical name, use
this attribute. <B>DNScname</B> may be used for <B>DNSrrset</B>'s with <B>DNStype CNAME,
NS, MX, PTR or TXT</B>. If the last character of a CNAME is a dot its name is considered
absolute. If it does not contain a dot, its name is prepended to the zone-name.</LI>

<LI><B>DNSpreference:</B> This number is the mail-exchange preference as used by BIND.</LI>

<LI><B>DNStype:</B> This must be <B>A, CNAME, NS, MX, PTR</B> or <B>TXT</B>. It specifies
the DNSrrset type.</LI>

<LI><B>DNSclass:</B> Must be <B>IN</B></LI>

<LI><B>DNSttl:</B> This is the time-to-live value as used by <B>tinydns</B>.
If TTL is non-zero (or omitted), the time-stamp is a starting time from where-on this zone's
information is valid. If TTL is zero, the timestamp is an ending time (``time to die'').</LI> 

<LI><B>DNStimestamp:</B> This is the timestamp as used by <B>tinydns</B>. It represents a
string as external TAI64 time-stamp, printed as 16 lowercase hexadecimal characters</LI>
</UL>
<P>

<H3>2. Installation</H3>
<UL>
<LI>Install an LDAP server such as <A HREF="www.openldap.org">openldap</A>. Other
LDAP implementations may work but have not been tested. Also install the
development libraries and include files.</LI>

<LI>Install <A HREF="http://cr.yp.to/djbdns.html">djbdns</A> or if you really
have to, go with BIND.<BR>
I suggest to install <I>tinydns</I> included in the <B>djbdns</B> package, because it is
safer, but You may have reasons why You want to use BIND.</LI>

<LI>Install <B>ldap2dns</B><BR>
Unpack the package and build it:
<PRE>
gzcat ldap2dns.tar.gz | tar x
cd ldap2dns-version
make
make install
</PRE>
If you run <B>ldap2dns</B> togther with tinydns, go into
/var/tinydns and run ldap2tinydns-conf.
</LI>

<LI>Add the extra object-classes to the slapd.conf file.
If You are using openldap-1.2.x:<BR>
copy the files dns.oc.conf and dns.ac.conf into the directory /etc/openldap or
appropriate and add the following two lines to Your slapd.conf file:<BR>
<PRE>
include         /etc/openldap/dns.at.conf
include         /etc/openldap/dns.oc.conf
</PRE>
or, if You are using openldap-2.0.x:<BR>
copy the file dns.schema into the directory /etc/openldap/schema or
appropriate and add the following line to Your slapd.conf file:<BR>
<PRE>
include         /etc/openldap/schema/dns.schema
</PRE>
Now restart your LDAP server.</LI>
<P>

<LI>Start to populate your LDAP server with DNS information. As a first test do
<PRE>
$ ldapadd -D "<I>binddn</I>" -w <I>password</I> < example.ldif
</PRE>
Replace 'myorg' and 'binddn' with whatever is appropriate on Your system.
Start a search and see if something was added
<PRE>
$ ldapsearch -D "<I>binddn</I>" "objectclass=dnsrrset" </LI>
</PRE>

<LI>Test <B>ldap2dns</B>
<PRE>
$ ./ldap2dns -D "<I>binddn</I>" [ -b "<I>searchbase</I>" ] [ -w <I>passwd</I> ] -o data -o db -L
</PRE>
This should create a 'data' file, a 'corp.local.db' file and should print the
DNS content.<BR>
Note: The <I>data</I> file is text data which can be processed with <B>tinydns-data</B>.
<I>corp.local.db</I> is the file as used by <B>named</B>. If You are using bind, You also
have to adopt the file <I>/etc/named.conf</I> and You have to restart named.</LI>
</UL>
<P>

<H3>3. Running ldap2dns</H3>
If You are a tinydns user, run <B>ldap2dns</B> in /services/tinydns/root.<BR>
If You are an openldap user, the command line switches are the same as for ldapsearch
or ldapadd.
<PRE>
$ ldap2dns -D "<I>binddn</I>" [ -w <I>passwd</I> ] -b "<I>searchbase</I>" -o data -e "cd /var/tinydns/root && /usr/bin/tinydns-data"
</PRE>
This generates a data file which is converted into a data.cdb by tinydns-data as
soon as ldap2dns detects a modification in the LDAP directory. 
The password is required if You restrict read queries to authenticated users only. 
Test with 
<PRE>
$ dnsq any corp.local <I>ipaddr</I>
</PRE>
Replace <I>ipaddr</I> with whatever You configured tinydns to listen to.
<P>

If You are a BIND user, run <B>ldap2dns</B> in /var/named with
<PRE>
$ ldap2dns -D "<I>binddn</I>" -w <I>passwd</I> -b "<I>searchbase</I>" -o db -e "kill -HUP `cat /var/run/named-pid`"
</PRE>
Do not forget to add You primary definition to Your named.boot file.
Your named should be restarted automatically as soon as ldap2dns detects a modification
in the LDAP directory. If bind is not restarted, do so with
<PRE>
# kill -HUP <I>PID</I>
</PRE>
Now run 
<PRE>
$ nslookup - localhost
> ns1.corp.local
</PRE>
Note that <B>nslookup</B> only works with <B>tinydns</B> if Your nameserver resolves its IP-address
backwards.
<P>

<H3>4. Running ldap2dnsd</H3>
<B>ldap2dnsd</B> is a hard link onto <B>ldap2dns</B>. If invoked, the program
starts as backgound-daemon and contineously checks for modifications in the LDAP directory.
If the the daemon sees a modification in the <B>DNSserial</B> numbers it updates the data
or .db files, depending what kind of output was configured. This check is done about once
a minute.<BR>
The command-line options for <B>ldap2dnsd</B> are the same as for <B>ldap2dns</B>.
Use the -u option to modify the update intervall. You may also use -u on <B>ldap2dns</B>
to start as a foreground daemon. This is useful if You want to run <B>ldap2dns</B> from
<A HREF="http://cr.yp.to/daemontools.html">daemontools</A>. To do this run <B>ldap2tinydns-conf</B>
in /service/tinydns and link /service/ldap2dns onto /service/tinydns/ldap2dns.
<PRE>
# ln -s /service/tinydns/ldap2dns /service/ldap2dns
</PRE>
After a few seconds <B>daemontools</B> starts <B>ldap2dns</B> which itself generates data
files whenever a modification is commited into the LDAP directory. 
<P>
<B>ldap2dns</B> and <B>ldap2dnsd</B> recognize the following options:
<PRE>
-D <I>binddn</I> specify the distinguished name to bind to the LDAP directory
-w <I>bindpasswd</I> use bindpasswd as the password for simple authentication
-b <I>searchbase</I> use searchbase as the starting point for the search instead of the default
-o Generate a "data" file to be processed by tinydns-data. 
-o db	For each zone generate a "<zonename>.db" file to be used by named.
-L[<I>filename</I>] print output in LDIF format for reimport. If no filename is specified output goes to stdout. 
-h <I>host</I> specify the hostname of LDAP directory. Default is localhost.
-p <I>port</I> portnumber to connect to LDAP directory. Defaults is 389
-v run in verbose mode
-vv even more verbose
-V print version and exit
-u <I>numsecs</I> update DNS data every numsecs.
</PRE>
<B>ldap2dns</B> and <B>ldap2dnsd</B> recognizes the following environement variables:<BR>
<B>TINYDNSDIR</B>: Specifies the directory where ldap2dns writes its data file.<BR>
<B>LDAP2DNS_UPDATE</B>: Specifies the update intervall as the -u command line option would.<BR>
<B>LDAP2DNS_OUTPUT</B>: Specifies the default output, as the -o command line option would.
<P>
<B>ldap2dns</B> and <B>ldap2dnsd</B> use the following parameters from /etc/ldap.conf if not
specified on the command line:
<B>BASE</B>: The LDAP search base.<BR>
<B>HOST</B>: The LDAP server.<BR>
<B>PORT</B>: The LDAP port.
<P>

<H3>5. Importing DNS data from Your named</H3>
A perl-script <I>import.pl</I> is contained in this package. Edit the first
lines of the script to conform to Your configuration.
If You have installed the Perl packages Net::LDAP and Net::DNS
skip the following lines, otherwise do
<PRE>
# perl -MCPAN -e 'shell'
(...snip...)
> install Net::DNS
> install Net::LDAP
</PRE>
Now check that Your nameserver allows zone transfers to your host and run the import script:
<PRE>
$ echo 'primary mydomain.org ' | ./import.pl
</PRE>
for a single domain or
<PRE>
# cat named.boot | ./import.pl
</PRE>
to populate Your LDAP directory.
<P>

<H3>6. Coming soon</H3>
A browser-based administration toolkit, which connects directly
to the LDAP-directory service. <A HREF="ldap2dns/example.html">
Here is a screenshot</A>
<P>

<H3>7. To Do</H3>
<UL>
<LI>Write a man page.</LI>
<LI>named.conf should be created automatically.</LI>
</UL>
<P>

<H3>8. Copyright and disclaimer</H3>
This program is licensed under the GPL version 2 or at Your choice any later
version.<BR>
It is maintained by <A HREF="mailto:jacob.rief@tiscover.com?subject=ldap2dns">Jacob Rief</A>.
If you run <B>ldap2dns</B> on a productive nameserver, please mail me
and tell me on what OS and with which nameserver you do so.