mirror of
				https://github.com/bklang/ldap2dns.git
				synced 2025-10-30 23:53:12 -04:00 
			
		
		
		
	+ Fixed bug with duplicate OIDs in dns.schema from partially applied patch + Renamed schema file to ldap2dns.schema + Updated RPM specfile (UNTESTED, may need editing) + Removed already merged patchfiles + Restructured file layout, created doc directory + Deprecated unfinished webadmin work. Will be replaced with Beatnik + Deprecated OpenLDAP 2.0 schema support + Deprecated djbdns-1.0.5 native LDAP patch (status of patch unknown) + Removed old index.html + Removed TODO.schema + Updated Makefile git-svn-id: https://svn.alkaloid.net/gpl/ldap2dns/trunk@124 06cd67b6-e706-0410-b29e-9de616bca6e9
		
			
				
	
	
		
			354 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			354 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <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-2.0 into the directory /etc/openldap/schema
 | |
| and rename it to dns.schema.
 | |
| If You are using openldap-2.2.x:<BR>
 | |
| copy the file dns.schema-2.2 into the directory /etc/openldap/schema
 | |
| and rename it to dns.schema.
 | |
| 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. 
 | |
| 
 |