LDAP
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 er een werkende doch lege directory 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.
slapd.init.ldif
Bij installatie/reconfiguratie wordt /usr/share/slapd/slapd.init.ldif ingelezen. Zie aldaar.
init-ldap script
Het lokale script init-ldap doet vervolgens alles wat wij toegevoegd/gewijzigd willen hebben. Dit zou makkelijk in één of twee stappen kunnen maar omwille van de beheerbaarheid wordt in kleinere stappen gewerkt.
#$/bin/sh # # stop de server # service slapd stop # # Remove database files # rm /var/lib/ldap/* # # Reset to factory settings # Just 3 x ENTER # dpkg-reconfigure slapd # # Add the HCC schema # ldapadd -Y EXTERNAL -H ldapi:/// -f add-schema.ldif # # modify config. Add cert info and change loglevel # ldapmodify -Y EXTERNAL -H ldapi:/// -f modify-config.ldif # # modify hdb. Add indices and change sizelimit (500 -> unlinited) # ldapmodify -Y EXTERNAL -H ldapi:/// -f modify-hdb.ldif # # add top level ou's # create admins in ou=beheer # create regio list in ou=regio # create groeperingen in ou=groeperingen # ldapadd -x -D cn=admin,dc=hcc,dc=nl -H ldapi:/// -f hcc-ou.ldif -w H3#oT6Y?ehxsyBwx9zbr ldapadd -x -D cn=admin,dc=hcc,dc=nl -H ldapi:/// -f hcc-beheer.ldif -w H3#oT6Y?ehxsyBwx9zbr ldapadd -x -D cn=admin,dc=hcc,dc=nl -H ldapi:/// -f hcc-regios.ldif -w H3#oT6Y?ehxsyBwx9zbr ldapadd -x -D cn=admin,dc=hcc,dc=nl -H ldapi:/// -f hcc-groeperingen.ldif -w H3#oT6Y?ehxsyBwx9zbr # # 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:/// -c -S error_kader.txt -f hcckader.ldif -w H3#oT6Y?ehxsyBwx9zbr # # Add the testuser data for OneShoe # ldapadd -x -D cn=admin,dc=hcc,dc=nl -H ldapi:/// -c -S errors_test.txt -f testuser.ldif -w H3#oT6Y?ehxsyBwx9zbr # # sync replication for hcc (only on loadbalanced servers) # ##ldapmodify -Y EXTERNAL -H ldapi:/// -f syncrepl.ldif # # restart. new module loaded (only on loadbalanced servers) # ##service slapd restart
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 [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:
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 [phpldapadmin wiki].
# # 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 dat updates ophaalt (maar niet installeert), zodat nagios ze ook detecteert 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