LDAP: Difference between revisions

From Hobbynet Admin Wiki
Jump to navigation Jump to search
Line 1: Line 1:
==Introductie==
<h2>Introductie</h2>
Om een centrale plaats te hebben om authenticatie te doen voor www.hcc.nl en sub-sites zoals een forum, is gekozen voor het gebruik van een LDAP database/directory. Hierin wordt alleen opgeslagen wat nodig is voor het functioneren van de site. Andere persoonsgegevens en HCC specifieke gegevens komen in een (MySQL) database. Dit kan ook een tabel binnen de Drupal omgeving zijn.
<p>Om een centrale plaats te hebben om authenticatie te doen voor www.hcc.nl en sub-sites zoals een forum, is gekozen voor het gebruik van een LDAP database/directory. Hierin wordt alleen opgeslagen wat nodig is voor het functioneren van de site. Andere persoonsgegevens en HCC specifieke gegevens komen in een (MySQL) database. Dit kan ook een tabel binnen de Drupal omgeving zijn.
 
</p>
==LDAP server keuze==
<h2>LDAP server keuze</h2>
De voor de hand liggende keuze is OpenLDAP. Echter zijn er geluiden gehoord dat OpenLDAP niet zou schalen. Alternatieven zijn b.v. 389server maar die is erg slecht gesupport onder Ubuntu. Voorlopig starten we met OpenLDAP.  
<p>De voor de hand liggende keuze is OpenLDAP. Echter zijn er geluiden gehoord dat OpenLDAP niet zou schalen. Alternatieven zijn b.v. 389server maar die is erg slecht gesupport onder Ubuntu. Voorlopig starten we met OpenLDAP.  
 
</p>
==Loadbalanced==
<h2>Loadbalanced</h2>
Er zijn twee servers (hcc-ldap-lb1 en hcc-ldap-lb2) die achter een loadbalancer in preferred server mode staat zodat het verkeer altijd naar server1 gestuurd wordt. Beide servers houden elkaar up-to-date. In de gewone situatie zullen alle reads en writes naar server1 gaan en server2 wordt door server1 bijgewerkt. Valt server1 weg, dan zal de loadbalancer overschakelen naar server2 waar vanaf dan de read en writes plaatsvinden. Zodra server1 weer beschikbaar is, wordt die bijgewerkt en zal weer master worden. Dit is nog niet getest en hoe de timing precies is, is nog niet duidelijk...
<p>Er zijn twee servers (hcc-ldap-lb1 en hcc-ldap-lb2) die achter een loadbalancer in preferred server mode staat zodat het verkeer altijd naar server1 gestuurd wordt. Beide servers houden elkaar up-to-date. In de gewone situatie zullen alle reads en writes naar server1 gaan en server2 wordt door server1 bijgewerkt. Valt server1 weg, dan zal de loadbalancer overschakelen naar server2 waar vanaf dan de read en writes plaatsvinden. Zodra server1 weer beschikbaar is, wordt die bijgewerkt en zal weer master worden. Dit is nog niet getest en hoe de timing precies is, is nog niet duidelijk...
 
</p>
==Installatie==
<h2>Installatie</h2>
Installatie van OpenLDAP is simpel:
<p>Installatie van OpenLDAP is simpel:
aptitude install slapd ldap-utils
</p>
De configuratie van OpenLDAP is sinds Karmic Koala iets gecompliceerder geworden. cn=config wordt nog steeds gebruikt maar tijdens installatie wordt alleen een skeleton configuratie geïnstalleerd. Er wordt niet meer gevraagd om een password tijdens de installatie en met "dpkg-reconfigure slapd" zet alleen de skeleton configuratie terug. Je moet zelf de database, root dn en acl's opzetten (als root of met sudo). Run  '''dpkg-reconfigure slapd''' om terug te gaan naar een lege directory.  
<pre class="_fck_mw_lspace">aptitude install slapd ldap-utils
 
</pre>
UPDATE: in Oneiric Ocelot (11.10) is weer wel de mogelijkheid gegeven bij installatie een database aan te maken. Default wordt echter de fqdn hostname gebruikt. Bij dpkg-reconfigure kan het gewenste domein wel gegeven worden. Als tussenoplossing wordt op 10.04 LTS de minimale configuratie na installatie aangevuld met alles wat mist. De initiële configuratie staat in /usr/share/slapd/slapd.init.ldif. Alles na '''include: file:///etc/ldap/schema/core.ldif''' lijkt te missen. Het restant zoals dat in dezelfde file op 11.10 staat, wordt alsnog op 10.04 uitgevoerd. Als bij update of upgrade genoemde file wel compleet is, kan het uitvoeren van sldap.extra.ldif vervallen. Zie het init-ldap script.
<p>De configuratie van OpenLDAP is sinds Karmic Koala iets gecompliceerder geworden. cn=config wordt nog steeds gebruikt maar tijdens installatie wordt alleen een skeleton configuratie geïnstalleerd. Er wordt niet meer gevraagd om een password tijdens de installatie en met "dpkg-reconfigure slapd" zet alleen de skeleton configuratie terug. Je moet zelf de database, root dn en acl's opzetten (als root of met sudo). Run  <b>dpkg-reconfigure slapd</b> om terug te gaan naar een lege directory.  
 
</p><p>UPDATE: in Oneiric Ocelot (11.10) is weer wel de mogelijkheid gegeven bij installatie een database aan te maken. Default wordt echter de fqdn hostname gebruikt. Bij dpkg-reconfigure kan het gewenste domein wel gegeven worden. Als tussenoplossing wordt op 10.04 LTS de minimale configuratie na installatie aangevuld met alles wat mist. De initiële configuratie staat in /usr/share/slapd/slapd.init.ldif. Alles na <b>include: file:///etc/ldap/schema/core.ldif</b> lijkt te missen. Het restant zoals dat in dezelfde file op 11.10 staat, wordt alsnog op 10.04 uitgevoerd. Als bij update of upgrade genoemde file wel compleet is, kan het uitvoeren van sldap.extra.ldif vervallen. Zie het init-ldap script.
==Initiële database==
</p>
Direct na installatie (of na dpkg-reconfigure slapd) staat dit in OpenLDAP. Access is alleen geregeld voor root. Dit heeft te maken met het feit dat vanaf Karmic Koala OpenLDAP alleen het minst noodzakelijke bevat om slapd te starten. Het init_lapd script (zie verderop) vult de directory aan met lokale wensen. Gebruik ook de [http://www.openldap.org/doc/admin/ OpenLDAP site].
<h2>Initiële database</h2>
===slapd.init.ldif ===
<p>Direct na installatie (of na dpkg-reconfigure slapd) staat dit in OpenLDAP. Access is alleen geregeld voor root. Dit heeft te maken met het feit dat vanaf Karmic Koala OpenLDAP alleen het minst noodzakelijke bevat om slapd te starten. Het init_lapd script (zie verderop) vult de directory aan met lokale wensen. Gebruik ook de <a href="http://www.openldap.org/doc/admin/">OpenLDAP site</a>.
Bij installatie/reconfiguratie wordt /usr/share/slapd/slapd.init.ldif ingelezen. Om uit komen op de 11.10 installatie wordt direct hierna slapd.extra.ldif ingelezen
</p>
<h3>slapd.init.ldif </h3>
<p>Bij installatie/reconfiguratie wordt /usr/share/slapd/slapd.init.ldif ingelezen. Om uit komen op de 11.10 installatie wordt direct hierna slapd.extra.ldif ingelezen
</p>
<pre>
<pre>
~/ldap# cat /usr/share/slapd/slapd.init.ldif
~/ldap# cat /usr/share/slapd/slapd.init.ldif
Line 45: Line 48:
# Allow unlimited access to local connection from the local root user
# Allow unlimited access to local connection from the local root user
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * break
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * break
olcAccess: {1}to dn.base="" by * read
olcAccess: {1}to dn.base=&quot;&quot; by * read
olcAccess: {2}to dn.base="cn=subschema" by * read
olcAccess: {2}to dn.base=&quot;cn=subschema&quot; by * read


# Config db settings
# Config db settings
Line 62: Line 65:
include: file:///etc/ldap/schema/core.ldif
include: file:///etc/ldap/schema/core.ldif
</pre>
</pre>
Hieronder het ontbrekende stuk dat wel in 11.10 zit. Hierin zijn de oorspronkelijke variabelen vervangen door vaste waarden omdat het script dat door dpkg-reconfigure in 10.04 wordt gebuikt niet met de variabelen in de 11.10 versie kan omgaan. Tevens is '''olcDbDirectory''' uitgebreid met een subdirectory. Dit moet het werken met meerdere DITs vergemakkelijken.  
<p>Hieronder het ontbrekende stuk dat wel in 11.10 zit. Hierin zijn de oorspronkelijke variabelen vervangen door vaste waarden omdat het script dat door dpkg-reconfigure in 10.04 wordt gebuikt niet met de variabelen in de 11.10 versie kan omgaan. Tevens is <b>olcDbDirectory</b> uitgebreid met een subdirectory. Dit moet het werken met meerdere DITs vergemakkelijken.  
</p>
<pre>
<pre>
root@ubuntu:~/ldap# cat slapd.extra.ldif
root@ubuntu:~/ldap# cat slapd.extra.ldif
Line 103: Line 107:
   by anonymous auth
   by anonymous auth
   by * none
   by * none
olcAccess: to dn.base=""
olcAccess: to dn.base=&quot;&quot;
   by * read
   by * read
olcAccess: to *
olcAccess: to *
Line 109: Line 113:
   by * read
   by * read
</pre>
</pre>
Hierna heb je op 10.04 LTS de situatie van 11.10 met domein hcc.nl in een hdb backend database.
<p>Hierna heb je op 10.04 LTS de situatie van 11.10 met domein hcc.nl in een hdb backend database.
 
</p>
==init-ldap script==
<h2>init-ldap script</h2>
Het lokale script init-ldap doet de upgrade naar 11.10 en vervolgens alles wat wij toegevoegd/gewijzigd willen hebben. Dit zou makkelijk in één of twee stappen kunnen maar omwille van de beheerbaarheid wordt elke stap afzonderlijk uitgevoerd.
<p>Het lokale script init-ldap doet de upgrade naar 11.10 en vervolgens alles wat wij toegevoegd/gewijzigd willen hebben. Dit zou makkelijk in één of twee stappen kunnen maar omwille van de beheerbaarheid wordt elke stap afzonderlijk uitgevoerd.
 
</p>
<pre>
<pre>
#$/bin/sh
#$/bin/sh
Line 175: Line 179:
#ldapmodify -Y EXTERNAL -H ldapi:/// -f hcc-syncrepl.ldif
#ldapmodify -Y EXTERNAL -H ldapi:/// -f hcc-syncrepl.ldif
</pre>
</pre>
===SSL/TLS beveiliging===
<h3>SSL/TLS beveiliging</h3>
Gebruik de juiste .pem bestanden in /etc/ssl/certs en /etc/ssl/private. Voer een '''c_rehash .''' uit in /etc/ssl/certs om de cache te updaten (indien CAcert_org.pem nieuw werd toegevoegd). <br>
<p>Gebruik de juiste .pem bestanden in /etc/ssl/certs en /etc/ssl/private. Voer een <b>c_rehash .</b> uit in /etc/ssl/certs om de cache te updaten (indien CAcert_org.pem nieuw werd toegevoegd). <br />
De ownership is belangrijk. Hiertoe wordt de groep "openldap" toegevoegd aan de groep ssl-cert.
De ownership is belangrijk. Hiertoe wordt de groep "openldap" toegevoegd aan de groep ssl-cert.
adduser openldap ssl-cert
</p>
 
<pre class="_fck_mw_lspace">adduser openldap ssl-cert
Als dit fout gaat, doe dan eerst:
</pre>
apt-get install ssl-cert
<p>Als dit fout gaat, doe dan eerst:
 
</p>
Zet het certificaat en de private key in de juiste groep:
<pre class="_fck_mw_lspace">apt-get install ssl-cert
chgrp ssl-cert /etc/ssl/private/ldap2-int.hobby.nl.*
</pre>
chmod 440      /etc/ssl/private/ldap2-int.hobby.nl.key
<p>Zet het certificaat en de private key in de juiste groep:
 
</p>
Het resultaat is dan als volgt:
<pre class="_fck_mw_lspace">chgrp ssl-cert /etc/ssl/private/ldap2-int.hobby.nl.*
root@hcc-ldap-lb1:~# ls -l /etc/ssl/private/hcc*  
chmod 440      /etc/ssl/private/ldap2-int.hobby.nl.key
-rw-r--r-- 1 root    ssl-cert 1724 Nov 22 20:47 ldap2-int.hobby.nl.crt
</pre>
<p>Het resultaat is dan als volgt:
</p>
<pre class="_fck_mw_lspace">root@hcc-ldap-lb1:~# ls -l /etc/ssl/private/hcc*  
</pre>
<p>-rw-r--r-- 1 root    ssl-cert 1724 Nov 22 20:47 ldap2-int.hobby.nl.crt
-r--r----- 1 root    ssl-cert 1679 Nov 22 20:25 ldap2-int.hobby.nl.key
-r--r----- 1 root    ssl-cert 1679 Nov 22 20:25 ldap2-int.hobby.nl.key
 
</p><p><br />
 
</p>
root@hcc-ldap-lb1:~# grep openldap /etc/group
<pre class="_fck_mw_lspace">root@hcc-ldap-lb1:~# grep openldap /etc/group
ssl-cert:x:114:openldap
ssl-cert:x:114:openldap
openldap:x:118:
openldap:x:118:
 
</pre>
===tls.ldif===
<h3>tls.ldif</h3>
SSL/TLS instelling toevoegen in de ldap configuratie.
<p>SSL/TLS instelling toevoegen in de ldap configuratie.
</p>
<pre>
<pre>
dn: cn=config
dn: cn=config
Line 210: Line 220:
olcTLSCertificateKeyFile: /etc/ssl/private/ldap2-int.hobby.nl.key
olcTLSCertificateKeyFile: /etc/ssl/private/ldap2-int.hobby.nl.key
</pre>
</pre>
===sizelimit.ldif===
<h3>sizelimit.ldif</h3>
SizeLimit instelling toevoegen op de hcc database. De default van 500 is te weinig.
<p>SizeLimit instelling toevoegen op de hcc database. De default van 500 is te weinig.
</p>
<pre>
<pre>
dn: olcDatabase={1}hdb,cn=config
dn: olcDatabase={1}hdb,cn=config
Line 218: Line 229:
olcSizeLimit: 100000
olcSizeLimit: 100000
</pre>
</pre>
===logging.ldif===
<h3>logging.ldif</h3>
Logging instelling toevoegen. Om logging leesbaar te houden is een entry in /etc/rsyslog.d en /etc/logrotate.d nodig zodat de logging naar een apart bestand gaat (openldap.log).
<p>Logging instelling toevoegen. Om logging leesbaar te houden is een entry in /etc/rsyslog.d en /etc/logrotate.d nodig zodat de logging naar een apart bestand gaat (openldap.log).
</p>
<pre>
<pre>
dn: cn=config
dn: cn=config
Line 226: Line 238:
olcLogLevel: stats
olcLogLevel: stats
</pre>
</pre>
In /etc/rsyslog.d/openldap.conf
<p>In /etc/rsyslog.d/openldap.conf
</p>
<pre>
<pre>
local4.*  -/var/log/openldap.log
local4.*  -/var/log/openldap.log
</pre>
</pre>
In /etc/logrotate.d/openldap
<p>In /etc/logrotate.d/openldap
</p>
<pre>
<pre>
/var/log/openldap.log
/var/log/openldap.log
Line 242: Line 256:
         sharedscripts
         sharedscripts
         postrotate
         postrotate
                 reload rsyslog >/dev/null 2>&1 || true
                 reload rsyslog &gt;/dev/null 2&gt;&amp;1 || true
         endscript
         endscript
}
}
</pre>
</pre>
 
<h3>hcc.ldif</h3>
===hcc.ldif===
<p>De eigenlijke hcc.nl directory toevoegen/uitbreiden
De eigenlijke hcc.nl directory toevoegen/uitbreiden
</p>
<pre>
<pre>
# Create top-level object in domain
# Create top-level object in domain
Line 304: Line 318:
ou: leden
ou: leden
</pre>
</pre>
===acl.ldif===
<h3>acl.ldif</h3>
Fine tuning van de access control lists. RootDN heeft altijd alle toegang. Access naar shadowLastChange is waarschijnlijk hier niet nodig (overblijfsel uit voorbeelden).  
<p>Fine tuning van de access control lists. RootDN heeft altijd alle toegang. Access naar shadowLastChange is waarschijnlijk hier niet nodig (overblijfsel uit voorbeelden).  
</p>
<pre>
<pre>
dn: olcDatabase={1}hdb,cn=config
dn: olcDatabase={1}hdb,cn=config
Line 311: Line 326:
replace: olcAccess
replace: olcAccess
olcAccess: to attrs=userPassword
olcAccess: to attrs=userPassword
   by dn="cn=hans,ou=beheer,dc=hcc,dc=nl" write
   by dn=&quot;cn=hans,ou=beheer,dc=hcc,dc=nl&quot; write
   by dn="cn=egbert,ou=beheer,dc=hcc,dc=nl" write
   by dn=&quot;cn=egbert,ou=beheer,dc=hcc,dc=nl&quot; write
   by anonymous auth
   by anonymous auth
   by self write
   by self write
Line 319: Line 334:
   by self write
   by self write
   by * read
   by * read
olcAccess: to dn.base=""
olcAccess: to dn.base=&quot;&quot;
   by * read
   by * read
olcAccess: to *
olcAccess: to *
   by dn="cn=hans,ou=beheer,dc=hcc,dc=nl" write
   by dn=&quot;cn=hans,ou=beheer,dc=hcc,dc=nl&quot; write
   by dn="cn=egbert,ou=beheer,dc=hcc,dc=nl" write
   by dn=&quot;cn=egbert,ou=beheer,dc=hcc,dc=nl&quot; write
   by dn="cn=drupal-hcc-nl,ou=beheer,dc=hcc,dc=nl" read
   by dn=&quot;cn=drupal-hcc-nl,ou=beheer,dc=hcc,dc=nl&quot; read
   by dn="cn=webapps,ou=beheer,dc=hcc,dc=nl" read
   by dn=&quot;cn=webapps,ou=beheer,dc=hcc,dc=nl&quot; read
   by * none
   by * none
</pre>
</pre>
 
<h2>Multi-Master bedrijf</h2>
==Multi-Master bedrijf==
<p>Om twee servers met elkaar in sync te houden is nog wat aanvullende configuratie nodig. In onze situatie zal altijd maar één server bevraagd worden; bij een failover van de loadbancer zal dus de andere server gebruikt worden. Bij het teruggaan naar server 1 zal de directory bijgewerkt worden. Dit is nog niet getest.
Om twee servers met elkaar in sync te houden is nog wat aanvullende configuratie nodig. In onze situatie zal altijd maar één server bevraagd worden; bij een failover van de loadbancer zal dus de andere server gebruikt worden. Bij het teruggaan naar server 1 zal de directory bijgewerkt worden. Dit is nog niet getest.
</p>
 
<h2>LDAP Clients</h2>
==LDAP Clients==
<p>Er zijn meerdere LDAP clients. De meest populaire zijn Apache Directory Studio en phpLdapAdmin. De eerste is veel uitgbreider maar vereist een Java Runtime Environment. Onder Windows XP is dat JRE6. PhpLdapAdmin draait onder apache. Beide clients hebben wat configuratie nodig; Bij ADS gaat alles stapsgewijs in de GUI. Voor PLA moet /etc/phpldapadmin/config.php aangepast worden.
Er zijn meerdere LDAP clients. De meest populaire zijn Apache Directory Studio en phpLdapAdmin. De eerste is veel uitgbreider maar vereist een Java Runtime Environment. Onder Windows XP is dat JRE6. PhpLdapAdmin draait onder apache. Beide clients hebben wat configuratie nodig; Bij ADS gaat alles stapsgewijs in de GUI. Voor PLA moet /etc/phpldapadmin/config.php aangepast worden.
</p>
 
<h3>StartTLS</h3>
===StartTLS===
<p>Aanbevolen wordt StartTLS op poort 389 te gebruiken. Alternatief is LDAPS op poort 636 maar is depreciated. Voor beide clients is het belangrijk dat de root certificaten gevonden kunnen worden. Als Apache al een server cert kent zou PLA geen probleem mogen zijn. ADS maakt deel uit van de JRE. JRE moet dus de root certificaten kunnen vinden.  
Aanbevolen wordt StartTLS op poort 389 te gebruiken. Alternatief is LDAPS op poort 636 maar is depreciated. Voor beide clients is het belangrijk dat de root certificaten gevonden kunnen worden. Als Apache al een server cert kent zou PLA geen probleem mogen zijn. ADS maakt deel uit van de JRE. JRE moet dus de root certificaten kunnen vinden.  
</p>
 
<h4>ADS onder Windows</h4>
====ADS onder Windows====
<p>Onder Windows moet met <b>keytool.exe</b> gewerkt worden. De uitleg heb ik van  [<a href="http://www.talkingtree.com/blog/index.cfm?mode=entry&amp;entry=25AA75A4-45A6-2844-7CA3EECD842DB576">hier</a>]. Het komt erop neer dat de .pem of .der certificaten van CAcert in de keystore gezet worden. Kopieer deze certificaat bestanden in C:\Program Files\Java\jre6\lib\security (jre6 kan ondertussen jre7 zijn in Vista of W7). Doe dan in een terminal window:
Onder Windows moet met '''keytool.exe''' gewerkt worden. De uitleg heb ik van  [[http://www.talkingtree.com/blog/index.cfm?mode=entry&entry=25AA75A4-45A6-2844-7CA3EECD842DB576 hier]]. Het komt erop neer dat de .pem of .der certificaten van CAcert in de keystore gezet worden. Kopieer deze certificaat bestanden in C:\Program Files\Java\jre6\lib\security (jre6 kan ondertussen jre7 zijn in Vista of W7). Doe dan in een terminal window:
</p>
<pre>
<pre>
cd C:\Program Files\Java\jre6\lib\security
cd C:\Program Files\Java\jre6\lib\security
Line 347: Line 362:
..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias cacertclass3 -file class3.der
..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias cacertclass3 -file class3.der
</pre>
</pre>
De Windows JRE is ook te managen via het Java applet in het configuratiescherm. Toevoegen van root certificaten lijkt niet  
<p>De Windows JRE is ook te managen via het Java applet in het configuratiescherm. Toevoegen van root certificaten lijkt niet  
mogelijk voor system; wel voor user. Niet verder naar gezocht.
mogelijk voor system; wel voor user. Niet verder naar gezocht.
 
</p>
====ADS onder Linux====
<h4>ADS onder Linux</h4>
Apache Directory Studio volgt nog.<br>
<p>Apache Directory Studio volgt nog.<br />
 
</p>
====PLA onder Linux====
<h4>PLA onder Linux</h4>
Voor ldap clients (phpldapadmin) dient de client configuratie goed te zijn. Deze bevindt zich in /etc/ldap.ldap.conf. Het is voldoende als de directory met de root certificaten bekend is. Deze client configuratie is meer php-ldap gebonden dan alleen voor PLA. Ook de Drupal LDAPauth module werkt met ditzelfde beatand. Zie ook de [[http://phpldapadmin.sourceforge.net/wiki/index.php/Server:server:tls phpldapadmin wiki]].
<p>Voor ldap clients (phpldapadmin) dient de client configuratie goed te zijn. Deze bevindt zich in /etc/ldap.ldap.conf. Het is voldoende als de directory met de root certificaten bekend is. Deze client configuratie is meer php-ldap gebonden dan alleen voor PLA. Ook de Drupal LDAPauth module werkt met ditzelfde beatand. Zie ook de [<a href="http://phpldapadmin.sourceforge.net/wiki/index.php/Server:server:tls">phpldapadmin wiki</a>].
</p>
<pre>
<pre>
#
#
Line 375: Line 391:
#TLS_REQCERT never
#TLS_REQCERT never
</pre>
</pre>
Denk er wel aan na wijzigingen Apache te herstarten.
<p>Denk er wel aan na wijzigingen Apache te herstarten.
 
</p>
== Backup ==
<h2> Backup </h2>
Backups kunnen gemaakt worden terwijl slapd draait. Hiertoe moet '''slapcat''' gebruikt worden. Backups kunnen gemaakt worden per database naar een ldif bestand.
<p>Backups kunnen gemaakt worden terwijl slapd draait. Hiertoe moet <b>slapcat</b> gebruikt worden. Backups kunnen gemaakt worden per database naar een ldif bestand.
slapcat -l hcc-dump.ldif -b "dc=hcc,dc=nl"
</p>
Dit maakt een dump van alles onder '''dc=hcc,dc=nl''' naar het bestand hcc-dump.ldif. ook is het mogelijk het database nummer te gebruiken, config is altijd nummer 0:
<pre class="_fck_mw_lspace">slapcat -l hcc-dump.ldif -b "dc=hcc,dc=nl"
slapcat -l config-dump.ldif -n 0
</pre>
 
<p>Dit maakt een dump van alles onder <b>dc=hcc,dc=nl</b> naar het bestand hcc-dump.ldif. ook is het mogelijk het database nummer te gebruiken, config is altijd nummer 0:
== crontab ==
</p>
# script die updates ophaald maar niet installeerd zodat nagios ze ook dedecteerd
<pre class="_fck_mw_lspace">slapcat -l config-dump.ldif -n 0
0 9 * * * /usr/local/hobbynet/bin/upd_srv >/dev/null
</pre>
0 18 * * * /usr/local/hobbynet/bin/upd_srv >/dev/null
<h2> crontab </h2>
 
<pre class="_fck_mw_lspace"># script die updates ophaald maar niet installeerd zodat nagios ze ook dedecteerd
== TODO lijst ==
0 9 * * * /usr/local/hobbynet/bin/upd_srv &gt;/dev/null
''Dit is een lijst in wording, graag aanvullen''
0 18 * * * /usr/local/hobbynet/bin/upd_srv &gt;/dev/null
* dagelijkse backup versleutelen<br> en actief naar een omgeving brengen die in het backup scenario opgenomen is
</pre>
* gebruikersrechten verfijnen<br>(gebruiker mag zijn eigen naam niet aanpassen, maar de Drupal scripting mag dit wel)
<h2> TODO lijst </h2>
* logging verminderen  
<p><i>Dit is een lijst in wording, graag aanvullen</i>
* replicatie inregelen  
</p>
* script maken om dagelijkse mutaties te verwerken
<ul><li> dagelijkse backup versleutelen<br /> en actief naar een omgeving brengen die in het backup scenario opgenomen is
* script maken om eenmalig de complete LIDGG in te lezen<br>(dit wordt vervolgens aangevuld met de conversie die vanuit de 'oude' hcc.nl omgeving wordt uitgevoerd)
</li><li> gebruikersrechten verfijnen<br />(gebruiker mag zijn eigen naam niet aanpassen, maar de Drupal scripting mag dit wel)
* loadbalancer script maken om te controleren dat LDAP echt luistert
</li><li> logging verminderen  
</li><li> replicatie inregelen  
</li><li> script maken om dagelijkse mutaties te verwerken
</li><li> script maken om eenmalig de complete LIDGG in te lezen<br />(dit wordt vervolgens aangevuld met de conversie die vanuit de 'oude' hcc.nl omgeving wordt uitgevoerd)
</li><li> loadbalancer script maken om te controleren dat LDAP echt luistert
</li></ul>

Revision as of 11:03, 1 December 2011

Introductie

Om een centrale plaats te hebben om authenticatie te doen voor www.hcc.nl en sub-sites zoals een forum, is gekozen voor het gebruik van een LDAP database/directory. Hierin wordt alleen opgeslagen wat nodig is voor het functioneren van de site. Andere persoonsgegevens en HCC specifieke gegevens komen in een (MySQL) database. Dit kan ook een tabel binnen de Drupal omgeving zijn.

LDAP server keuze

De voor de hand liggende keuze is OpenLDAP. Echter zijn er geluiden gehoord dat OpenLDAP niet zou schalen. Alternatieven zijn b.v. 389server maar die is erg slecht gesupport onder Ubuntu. Voorlopig starten we met OpenLDAP.

Loadbalanced

Er zijn twee servers (hcc-ldap-lb1 en hcc-ldap-lb2) die achter een loadbalancer in preferred server mode staat zodat het verkeer altijd naar server1 gestuurd wordt. Beide servers houden elkaar up-to-date. In de gewone situatie zullen alle reads en writes naar server1 gaan en server2 wordt door server1 bijgewerkt. Valt server1 weg, dan zal de loadbalancer overschakelen naar server2 waar vanaf dan de read en writes plaatsvinden. Zodra server1 weer beschikbaar is, wordt die bijgewerkt en zal weer master worden. Dit is nog niet getest en hoe de timing precies is, is nog niet duidelijk...

Installatie

Installatie van OpenLDAP is simpel:

aptitude install slapd ldap-utils

De configuratie van OpenLDAP is sinds Karmic Koala iets gecompliceerder geworden. cn=config wordt nog steeds gebruikt maar tijdens installatie wordt alleen een skeleton configuratie geïnstalleerd. Er wordt niet meer gevraagd om een password tijdens de installatie en met "dpkg-reconfigure slapd" zet alleen de skeleton configuratie terug. Je moet zelf de database, root dn en acl's opzetten (als root of met sudo). Run dpkg-reconfigure slapd om terug te gaan naar een lege directory.

UPDATE: in Oneiric Ocelot (11.10) is weer wel de mogelijkheid gegeven bij installatie een database aan te maken. Default wordt echter de fqdn hostname gebruikt. Bij dpkg-reconfigure kan het gewenste domein wel gegeven worden. Als tussenoplossing wordt op 10.04 LTS de minimale configuratie na installatie aangevuld met alles wat mist. De initiële configuratie staat in /usr/share/slapd/slapd.init.ldif. Alles na include: file:///etc/ldap/schema/core.ldif lijkt te missen. Het restant zoals dat in dezelfde file op 11.10 staat, wordt alsnog op 10.04 uitgevoerd. Als bij update of upgrade genoemde file wel compleet is, kan het uitvoeren van sldap.extra.ldif vervallen. Zie het init-ldap script.

Initiële database

Direct na installatie (of na dpkg-reconfigure slapd) staat dit in OpenLDAP. Access is alleen geregeld voor root. Dit heeft te maken met het feit dat vanaf Karmic Koala OpenLDAP alleen het minst noodzakelijke bevat om slapd te starten. Het init_lapd script (zie verderop) vult de directory aan met lokale wensen. Gebruik ook de <a href="http://www.openldap.org/doc/admin/">OpenLDAP site</a>.

slapd.init.ldif

Bij installatie/reconfiguratie wordt /usr/share/slapd/slapd.init.ldif ingelezen. Om uit komen op de 11.10 installatie wordt direct hierna slapd.extra.ldif ingelezen

~/ldap# cat /usr/share/slapd/slapd.init.ldif
# Global config:
dn: cn=config
objectClass: olcGlobal
cn: config
# Where the pid file is put. The init.d script
# will not stop the server if you change this.
olcPidFile: /var/run/slapd/slapd.pid
# List of arguments that were passed to the server
olcArgsFile: /var/run/slapd/slapd.args
# Read slapd.conf(5) for possible values
olcLogLevel: none
# The tool-threads parameter sets the actual amount of cpu's that is used
# for indexing.
olcToolThreads: 1

# Frontend settings
dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
# The maximum number of entries that is returned for a search operation
olcSizeLimit: 500
# Allow unlimited access to local connection from the local root user
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * break
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to dn.base="cn=subschema" by * read

# Config db settings
dn: olcDatabase=config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: config
# Allow unlimited access to local connection from the local root user
olcAccess: to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * break

# Load schemas
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema

include: file:///etc/ldap/schema/core.ldif

Hieronder het ontbrekende stuk dat wel in 11.10 zit. Hierin zijn de oorspronkelijke variabelen vervangen door vaste waarden omdat het script dat door dpkg-reconfigure in 10.04 wordt gebuikt niet met de variabelen in de 11.10 versie kan omgaan. Tevens is olcDbDirectory uitgebreid met een subdirectory. Dit moet het werken met meerdere DITs vergemakkelijken.

root@ubuntu:~/ldap# cat slapd.extra.ldif
# Load the other schemas
include: file:///etc/ldap/schema/cosine.ldif
include: file:///etc/ldap/schema/nis.ldif
include: file:///etc/ldap/schema/inetorgperson.ldif

# Load module
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: back_hdb

# Set defaults for the backend
dn: olcBackend=hdb,cn=config
objectClass: olcBackendConfig
olcBackend: hdb

# The database definition.
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: hdb
olcDbCheckpoint: 512 30
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcLastMod: TRUE
olcSuffix: dc=hcc,dc=nl
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=hcc,dc=nl
olcRootPW: XXXXXXXX
olcDbIndex: objectClass eq
olcDbIndex: cn,sn,uid pres,eq,approx,sub
olcAccess: to attrs=userPassword,shadowLastChange
  by self write
  by anonymous auth
  by * none
olcAccess: to dn.base=""
  by * read
olcAccess: to *
  by self write
  by * read

Hierna heb je op 10.04 LTS de situatie van 11.10 met domein hcc.nl in een hdb backend database.

init-ldap script

Het lokale script init-ldap doet de upgrade naar 11.10 en vervolgens alles wat wij toegevoegd/gewijzigd willen hebben. Dit zou makkelijk in één of twee stappen kunnen maar omwille van de beheerbaarheid wordt elke stap afzonderlijk uitgevoerd.

#$/bin/sh
#
# stop de server
#
service slapd stop
#
# Remove database files
#
rm /var/lib/ldap/hcc/*
#
# Reset to factory settings
# Just 3 x ENTER
#
dpkg-reconfigure slapd
#
 #Add the things that seem to be missing in 10.04 LTS but
# are available in 11.10. Initial db config for hccnet.nl is made
#
ldapadd -Y EXTERNAL -H ldapi:/// -f slapd.extra.ldif
#
# Modify cn=config for TLS support
#
ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif
#
# Modify olcSizeLimit in {1}hdb,cn=config
#
ldapmodify -Y EXTERNAL -H ldapi:/// -f sizelimit.ldif
#
# modify olcLogLevel in cn=config
#
ldapmodify -Y EXTERNAL -H ldapi:/// -f logging.ldif
#
# add top level and create some admins in ou=beheer
#
ldapadd -x -D cn=admin,dc=hcc,dc=nl -H ldapi:/// -f hcc.ldif -w XXXXXX
#
# modify {1}hdb for ACL support (must be after creation of the admins)
#
ldapmodify -Y EXTERNAL -H ldapi:/// -f acl.ldif
#
# Add the data
#
ldapadd -x -D cn=admin,dc=hcc,dc=nl -H ldapi:/// -f leden.ldif -w XXXXXX
#
# Add the testuser data for OneShoe
#
ldapadd -x -D cn=admin,dc=hcc,dc=nl -H ldapi:/// -f testuser.ldif -w XXXXXX
#
# sync replication for config
#
#ldapmodify -Y EXTERNAL -H ldapi:/// -f config-syncrepl.ldif
#
# restart to make replication active
#
#/etc/init.d/slapd restart
#
# sync replication for hccnet (not needed on second node)
#
#ldapmodify -Y EXTERNAL -H ldapi:/// -f hcc-syncrepl.ldif

SSL/TLS beveiliging

Gebruik de juiste .pem bestanden in /etc/ssl/certs en /etc/ssl/private. Voer een c_rehash . uit in /etc/ssl/certs om de cache te updaten (indien CAcert_org.pem nieuw werd toegevoegd).
De ownership is belangrijk. Hiertoe wordt de groep "openldap" toegevoegd aan de groep ssl-cert.

adduser openldap ssl-cert

Als dit fout gaat, doe dan eerst:

apt-get install ssl-cert

Zet het certificaat en de private key in de juiste groep:

chgrp ssl-cert /etc/ssl/private/ldap2-int.hobby.nl.*
chmod 440      /etc/ssl/private/ldap2-int.hobby.nl.key

Het resultaat is dan als volgt:

root@hcc-ldap-lb1:~# ls -l /etc/ssl/private/hcc* 

-rw-r--r-- 1 root ssl-cert 1724 Nov 22 20:47 ldap2-int.hobby.nl.crt -r--r----- 1 root ssl-cert 1679 Nov 22 20:25 ldap2-int.hobby.nl.key


root@hcc-ldap-lb1:~# grep openldap /etc/group
ssl-cert:x:114:openldap
openldap:x:118:

tls.ldif

SSL/TLS instelling toevoegen in de ldap configuratie.

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/CAcert_org.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/private/ldap2-int.hobby.nl.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap2-int.hobby.nl.key

sizelimit.ldif

SizeLimit instelling toevoegen op de hcc database. De default van 500 is te weinig.

dn: olcDatabase={1}hdb,cn=config
changetype: modify
replace: olcSizeLimit
olcSizeLimit: 100000

logging.ldif

Logging instelling toevoegen. Om logging leesbaar te houden is een entry in /etc/rsyslog.d en /etc/logrotate.d nodig zodat de logging naar een apart bestand gaat (openldap.log).

dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: stats

In /etc/rsyslog.d/openldap.conf

local4.*   -/var/log/openldap.log

In /etc/logrotate.d/openldap

/var/log/openldap.log
{
        rotate 4
        weekly
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                reload rsyslog >/dev/null 2>&1 || true
        endscript
}

hcc.ldif

De eigenlijke hcc.nl directory toevoegen/uitbreiden

# Create top-level object in domain
dn: dc=hcc,dc=nl
objectClass: top
objectClass: dcObject
objectclass: organization
o: Hobby Computer Club
dc: hcc
description: Top level object hcc.nl

# Admin user of top level also RootDN.
dn: cn=admin,dc=hcc,dc=nl
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
userPassword:: SDMjb1Q2WT9laHhzeUJ3eDl6YnI=
description: LDAP admin for hcc.nl

dn: ou=beheer,dc=hcc,dc=nl
objectClass: organizationalUnit
ou: beheer

# managers of top level.
dn: cn=drupal-hcc-nl,ou=beheer,dc=hcc,dc=nl
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: drupal-hcc-nl
userPassword:: ZHJleGFtZW51YnVtQGNSYXN1OEV3ZXNh
description: Read-Only for OneShoe

dn: cn=webapps,ou=beheer,dc=hcc,dc=nl
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: webapps
userPassword:: U2FUIys3VWNoVWNfYUhlbXVzcGVrYWYk
description: Read-Only for WebApps

dn: cn=hans,ou=beheer,dc=hcc,dc=nl
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: hans
userPassword:: e1NIQX1ObDRsbklkLzlqSGcwWVRQd2ZEcERFY1NxNmM9
description: Apache Directory Studio entry voor Hans

dn: cn=egbert,ou=beheer,dc=hcc,dc=nl
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: egbert
userPassword:: e1NTSEF9WnJzZTF4VXBsVG1GZkVhNHpTMUlId3Q3QzN0Z1p2SzY=
description: Phpldapadmin entry voor Egbert

dn: ou=leden,dc=hcc,dc=nl
objectClass: organizationalUnit
ou: leden

acl.ldif

Fine tuning van de access control lists. RootDN heeft altijd alle toegang. Access naar shadowLastChange is waarschijnlijk hier niet nodig (overblijfsel uit voorbeelden).

dn: olcDatabase={1}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: to attrs=userPassword
  by dn="cn=hans,ou=beheer,dc=hcc,dc=nl" write
  by dn="cn=egbert,ou=beheer,dc=hcc,dc=nl" write
  by anonymous auth
  by self write
  by * none
olcAccess: to attrs=shadowLastChange
  by self write
  by * read
olcAccess: to dn.base=""
  by * read
olcAccess: to *
  by dn="cn=hans,ou=beheer,dc=hcc,dc=nl" write
  by dn="cn=egbert,ou=beheer,dc=hcc,dc=nl" write
  by dn="cn=drupal-hcc-nl,ou=beheer,dc=hcc,dc=nl" read
  by dn="cn=webapps,ou=beheer,dc=hcc,dc=nl" read
  by * none

Multi-Master bedrijf

Om twee servers met elkaar in sync te houden is nog wat aanvullende configuratie nodig. In onze situatie zal altijd maar één server bevraagd worden; bij een failover van de loadbancer zal dus de andere server gebruikt worden. Bij het teruggaan naar server 1 zal de directory bijgewerkt worden. Dit is nog niet getest.

LDAP Clients

Er zijn meerdere LDAP clients. De meest populaire zijn Apache Directory Studio en phpLdapAdmin. De eerste is veel uitgbreider maar vereist een Java Runtime Environment. Onder Windows XP is dat JRE6. PhpLdapAdmin draait onder apache. Beide clients hebben wat configuratie nodig; Bij ADS gaat alles stapsgewijs in de GUI. Voor PLA moet /etc/phpldapadmin/config.php aangepast worden.

StartTLS

Aanbevolen wordt StartTLS op poort 389 te gebruiken. Alternatief is LDAPS op poort 636 maar is depreciated. Voor beide clients is het belangrijk dat de root certificaten gevonden kunnen worden. Als Apache al een server cert kent zou PLA geen probleem mogen zijn. ADS maakt deel uit van de JRE. JRE moet dus de root certificaten kunnen vinden.

ADS onder Windows

Onder Windows moet met keytool.exe gewerkt worden. De uitleg heb ik van [<a href="http://www.talkingtree.com/blog/index.cfm?mode=entry&entry=25AA75A4-45A6-2844-7CA3EECD842DB576">hier</a>]. Het komt erop neer dat de .pem of .der certificaten van CAcert in de keystore gezet worden. Kopieer deze certificaat bestanden in C:\Program Files\Java\jre6\lib\security (jre6 kan ondertussen jre7 zijn in Vista of W7). Doe dan in een terminal window:

cd C:\Program Files\Java\jre6\lib\security
wget http://www.cacert.org/certs/root.der -O root.der
wget http://www.cacert.org/certs/class3.der -O class3.der
..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias cacertclass1 -file root.der
..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias cacertclass3 -file class3.der

De Windows JRE is ook te managen via het Java applet in het configuratiescherm. Toevoegen van root certificaten lijkt niet mogelijk voor system; wel voor user. Niet verder naar gezocht.

ADS onder Linux

Apache Directory Studio volgt nog.

PLA onder Linux

Voor ldap clients (phpldapadmin) dient de client configuratie goed te zijn. Deze bevindt zich in /etc/ldap.ldap.conf. Het is voldoende als de directory met de root certificaten bekend is. Deze client configuratie is meer php-ldap gebonden dan alleen voor PLA. Ook de Drupal LDAPauth module werkt met ditzelfde beatand. Zie ook de [<a href="http://phpldapadmin.sourceforge.net/wiki/index.php/Server:server:tls">phpldapadmin wiki</a>].

#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never
TLS_CACERT      /etc/ssl/certs/CAcert_org.pem
TLS_CERT        /etc/ssl/private/ldap2-int.hobby.nl.crt
TLS_KEY         /etc/ssl/private/ldap2-int.hobby.nl.key
TLS_REQCERT     allow
#TLS_REQCERT never

Denk er wel aan na wijzigingen Apache te herstarten.

Backup

Backups kunnen gemaakt worden terwijl slapd draait. Hiertoe moet slapcat gebruikt worden. Backups kunnen gemaakt worden per database naar een ldif bestand.

slapcat -l hcc-dump.ldif -b "dc=hcc,dc=nl"

Dit maakt een dump van alles onder dc=hcc,dc=nl naar het bestand hcc-dump.ldif. ook is het mogelijk het database nummer te gebruiken, config is altijd nummer 0:

slapcat -l config-dump.ldif -n 0

crontab

# script die updates ophaald maar niet installeerd zodat nagios ze ook dedecteerd
0 9 * * * /usr/local/hobbynet/bin/upd_srv >/dev/null
0 18 * * * /usr/local/hobbynet/bin/upd_srv >/dev/null

TODO lijst

Dit is een lijst in wording, graag aanvullen

  • dagelijkse backup versleutelen
    en actief naar een omgeving brengen die in het backup scenario opgenomen is
  • gebruikersrechten verfijnen
    (gebruiker mag zijn eigen naam niet aanpassen, maar de Drupal scripting mag dit wel)
  • logging verminderen
  • replicatie inregelen
  • script maken om dagelijkse mutaties te verwerken
  • script maken om eenmalig de complete LIDGG in te lezen
    (dit wordt vervolgens aangevuld met de conversie die vanuit de 'oude' hcc.nl omgeving wordt uitgevoerd)
  • loadbalancer script maken om te controleren dat LDAP echt luistert