LDAP: Difference between revisions

From Hobbynet Admin Wiki
Jump to navigation Jump to search
No edit summary
Line 3: Line 3:


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


==Loadbalanced==
==Loadbalanced==
Er zijn twee servers (hcc-ldap-lb1 en hcc-ldap-lb2) die achter een loadbalancer in pomeleoepee mode staat zodat het verkeer altijd server1 gestuurd wordt. Beide servers houden elkaar up-to-date. In de gewone situatie zullen alle reads en writes naar server 1 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 server 1 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...  
Er zijn twee servers (hcc-ldap-lb1 en hcc-ldap-lb2) die achter een loadbalancer in pomeleoepee mode staat zodat het verkeer altijd server1 gestuurd wordt. Beide servers houden elkaar up-to-date. In de gewone situatie zullen alle reads en writes naar server 1 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 server 1 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==
installatie van OpenLDAP is simpel:
installatie van OpenLDAP is simpel:
  aptitude install slapd ldap-utils
  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.
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==
==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 upd_lapd script (zie verderop) maakt een initiële database zoals beschreven is in [http://www.howtoforge.com/install-and-configure-openldap-on-ubuntu-karmic-koala HowToForge] en de [http://www.openldap.org/doc/admin24/ OpenLDAP site].
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].
=== Post Karmic situatie===
===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
<pre>
<pre>
version: 1
~/ldap# cat /usr/share/slapd/slapd.init.ldif
 
# Global config:
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# config
dn: cn=config
dn: cn=config
objectClass: olcGlobal
objectClass: olcGlobal
cn: config
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
olcArgsFile: /var/run/slapd/slapd.args
# Read slapd.conf(5) for possible values
olcLogLevel: none
olcLogLevel: none
olcPidFile: /var/run/slapd/slapd.pid
# The tool-threads parameter sets the actual amount of cpu's that is used
# for indexing.
olcToolThreads: 1
olcToolThreads: 1


# schema, config
# Frontend settings
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema
.....
 
# {0}core, schema, config
dn: cn={0}core,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: {0}core
.....
 
# {-1}frontend, config
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
olcDatabase: {-1}frontend
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
# The maximum number of entries that is returned for a search operation
,cn=auth manage by * break
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: {1}to dn.base="" by * read
olcAccess: {2}to dn.base="cn=subschema" by * read
olcAccess: {2}to dn.base="cn=subschema" by * read
olcSizeLimit: 500


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


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


# numResponses: 6
include: file:///etc/ldap/schema/core.ldif
# numEntries: 5
</pre>
</pre>
===backend.ldif===
En het ontbrekende stuk van 11.10 waarin de oorspronkelijke variabelen zijn vervangen door vaste strings:
Installeert de hdb module, configureert de suffix (hobby.nl), zet er een RootDN en PW op en plaatst indexen op enkele attrs.
<pre>
<pre>
# Load dynamic backend modules
root@ubuntu:~/ldap# cat slapd.extra.ldif
dn: cn=module,cn=config
# Load the other schemas
objectClass: olcModuleList
include: file:///etc/ldap/schema/cosine.ldif
cn: module
include: file:///etc/ldap/schema/nis.ldif
olcModulepath: /usr/lib/ldap
include: file:///etc/ldap/schema/inetorgperson.ldif
olcModuleload: back_hdb
 
# Create the backend database
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: hdb
olcDbDirectory: /var/lib/ldap/hobby/
olcSuffix: dc=hobby,dc=nl
olcRootDN: cn=admin,dc=hobby,dc=nl
olcRootPW: {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcDbIndex: uid pres,eq,sub
olcDbIndex: cn,sn,mail pres,eq,approx,sub
olcDbIndex: objectClass eq
olcDbIndex: entryUUID eq
</pre>
===frontend.ldif===
Hier wordt het root of top object gedefinieerd.
<pre>
# Create top-level object in domain
dn: dc=hobby,dc=nl
objectClass: top
objectClass: dcObject
objectclass: organization
o: Thuis Organization
dc: hobby
description: Top level object hobby.nl
 
# Admin user of top level.
dn: cn=admin,dc=hobby,dc=nl
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator for hobby.nl
userPassword: {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
 
dn: ou=people,dc=hobby,dc=nl
objectClass: organizationalUnit
ou: people
 
dn: ou=groups,dc=hobby,dc=nl
objectClass: organizationalUnit
ou: groups
</pre>
====Voorbeeld van een entry in people en groups====
Zodra de eerste twee ldifs geladen zijn kan een entry worden toegevoegd in people,hobby,nl.
<pre>
dn: uid=egbert,ou=people,dc=hobby,dc=nl
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: egbert
sn: van den Bussche
givenName: Egbert Jan
cn: Egbert Jan van den Bussche
displayName: H.E.J. v.d. Bussche
uidNumber: 1000
gidNumber: 1000
userPassword: secret
gecos: Egbert Jan van den Bussche
loginShell: /bin/bash
homeDirectory: /home/egbert
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: egbert@hobby.nl
postalCode: 2636 DE
l: SCHIPLUIDEN
o: HCC!Hobbynet
mobile: +31646094008
homePhone: +31153809909
title: System Administrator
postalAddress:
initials: HEJvdB
 
dn: cn=egbert,ou=groups,dc=hobby,dc=nl
objectClass: posixGroup
cn: egbert
gidNumber: 1000
</pre>
 
===config.ldif===
In deze ldif wordt de default ACL van de frontend,config en config,config databases gehaald. Ook wordt er een RootDN/PW toegevoegd aan de config,config database.
<pre>
# Remove any ACL on frontend
dn: olcDatabase={-1}frontend,cn=config
changetype: modify
delete: olcAccess
 
# Put new RootDN in config
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=admin,cn=config
 
# Set the passwd for RootDN
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
 
# Delete any ACL on config
dn: olcDatabase={0}config,cn=config
changetype: modify
delete: olcAccess
</pre>
===acl.ldif.ldif===
Acl.ldif plaatst een ALL op de backend database.
<pre>
dn: olcDatabase={1}hdb,cn=config
add: olcAccess
olcAccess: to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=hobby,dc=nl" write by anonymous auth by self write by * none
olcAccess: to dn.base="" by * read
olcAccess: to * by dn="cn=admin,dc=hobby,dc=nl" write by * read
</pre>
Opmerking: Volgens de OpenLDAP userguide (v2.4) zou '''by dn="cn=admin,dc=hobby,dc=nl" write''' overbodig zijn daar RootDN altijd overal toegang heeft.
===Shell script===
Dit script moet uitgevoerd worden wanneer de 4 minimale ldifs klaar zijn om in OpenLDAP gezet te worden (dynamische configuratie).
<pre>
#
# Initial part.
#
# Add the three main schemas
# Load the database backend module and create the database
# Create the base dn and the admin account for the openldap server
# There are some acl's set in the openldap setup that prevent phpldapadmin
# to interface with the directory, so we will remove them now and set openldap
# to the default cn=admin,cn=config. From this moment on the openldap can be
# configured and manipulated as before, but no longer by issuing commands like
# ldapadd -Y EXTERNAL -H ldapi:/// -f file
# but rather
# ldapadd -x -D cn=admin,cn=config -W -f file
#
# Finally restart slapd
#
# See: http://www.howtoforge.com/install-and-configure-openldap-on-ubuntu-karmic-koala
#
tmpdir=~/ldap
# Cleanup
echo "Remove old databases"
rm -R /var/lib/ldap/hcc/*
rm -R /var/lib/ldap/hobby/*
# Add schemas
echo "Add the cosine, nis and inetorgperson schema's"
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
# Add database module and configure
echo "Add backend.ldif"
ldapadd -Y EXTERNAL -H ldapi:/// -f $tmpdir/backend.ldif
# Add base DN
echo "Add frontend.ldif"
ldapadd -Y EXTERNAL -H ldapi:/// -f $tmpdir/frontend.ldif
# Place RootDN and remove ACLs
echo "Add config.ldif"
ldapadd -Y EXTERNAL -H ldapi:/// -f $tmpdir/config.ldif
# Place ACL
echo "Add acl.ldif"
ldapmodify -x -D cn=admin,cn=config -W -f $tmpdir/acl.ldif
# Restart slapd
/etc/init.d/slapd restart
</pre>
===Pre Karmic situatie===
Na het uitvoeren vna het script ziet het totaal over zich er zo uit:
<pre>
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# config
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: none
olcPidFile: /var/run/slapd/slapd.pid
olcToolThreads: 1


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


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


# {0}core, schema, config
# The database definition.
dn: cn={0}core,cn=schema,cn=config
dn: olcDatabase=hdb,cn=config
objectClass: olcSchemaConfig
cn: {0}core
.....
 
# {1}cosine, schema, config
dn: cn={1}cosine,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: {1}cosine
.....
 
# {2}nis, schema, config
dn: cn={2}nis,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: {2}nis
.....
 
# {3}inetorgperson, schema, config
dn: cn={3}inetorgperson,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: {3}inetorgperson
.....
 
# {-1}frontend, config
dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
olcSizeLimit: 500
 
# {0}config, config
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcRootDN: cn=admin,cn=config
olcRootPW: {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
 
# {1}hdb, config
dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDatabase: hdb
olcDbDirectory: /var/lib/ldap/hobby/
olcDbCheckpoint: 512 30
olcSuffix: dc=hobby,dc=nl
olcDbConfig: set_cachesize 0 2097152 0
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=hobby,
olcDbConfig: set_lk_max_objects 1500
dc=nl" write by anonymous auth by self write by * none
olcDbConfig: set_lk_max_locks 1500
olcAccess: {1}to dn.base="" by * read
olcDbConfig: set_lk_max_lockers 1500
olcAccess: {2}to * by dn="cn=admin,dc=hobby,dc=nl" write by * read
olcLastMod: TRUE
olcLastMod: TRUE
olcRootDN: cn=admin,dc=hobby,dc=nl
olcSuffix: dc=hccnet,dc=nl
olcRootPW: {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
olcDbDirectory: /var/lib/ldap/hccnet
olcDbCheckpoint: 512 30
olcRootDN: cn=admin,dc=hccnet,dc=nl
olcDbConfig: {0}set_cachesize 0 2097152 0
olcRootPW: XXXXXXXX
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcDbIndex: uid pres,eq
olcDbIndex: cn,sn,mail pres,eq,approx,sub
olcDbIndex: objectClass eq
olcDbIndex: objectClass eq
 
olcDbIndex: cn,sn,uid pres,eq,approx,sub
# search result
olcAccess: to attrs=userPassword,shadowLastChange
search: 2
  by self write
result: 0 Success
  by anonymous auth
 
  by * none
# numResponses: 11
olcAccess: to dn.base=""
# numEntries: 10
  by * read
</pre>
olcAccess: to *
Root heeft geen toegang meer. Er is een RootDN in config (cn=admin,cn=config) die overal gebruikt moet worden. De database heeft een eigen RootDN (is dit wel handig?).
  by self write
 
  by * read
==Replicatie==
Voor master/slave replicatie kan de configuratie in [https://help.ubuntu.com/10.04/serverguide/C/openldap-server.html Ubuntu Server Guide] gevonden worden.
===Uitbreiding tot single master===
In ldap terminologie spreken we van een '''provider'''. In dit geval en single-master. De provider.ldif:
<pre>
# Add indexes to the frontend db.
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: entryCSN eq
-
add: olcDbIndex
olcDbIndex: entryUUID eq
 
#Load the syncprov and accesslog modules.
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov
-
add: olcModuleLoad
olcModuleLoad: accesslog
 
# Accesslog database definitions
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap/accesslog
olcSuffix: cn=accesslog
olcRootDN: cn=admin,dc=example,dc=com
olcDbIndex: default eq
olcDbIndex: entryCSN,objectClass,reqEnd,reqResult,reqStart
 
# Accesslog db syncprov.
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpNoPresent: TRUE
olcSpReloadHint: TRUE
 
# syncrepl Provider for primary db
dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpNoPresent: TRUE
 
# accesslog overlay definitions for primary db
dn: olcOverlay=accesslog,olcDatabase={1}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcAccessLogConfig
olcOverlay: accesslog
olcAccessLogDB: cn=accesslog
olcAccessLogOps: writes
olcAccessLogSuccess: TRUE
# scan the accesslog DB every day, and purge entries older than 7 days
olcAccessLogPurge: 07+00:00 01+00:00
</pre>
Dit script is slechts gebruikt voor testen van replicatie en is niet meer compatibel met de initiële configuratie zoals hier boven is beschreven.
===Uitbreiding tot slave===
In ldap terminologie spreken we van een '''consumer'''. De consumer moet precies zo opgezet worden als de provider maar dan zonder de provider specifieke configuratie. Hiervoor in de plaats komt een consumer-specifieke configuratie.
<pre>
#Load the syncprov module.
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov
 
# syncrepl specific indices
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: entryUUID eq
-
add: olcSyncRepl
olcSyncRepl: rid=0 provider=ldap://ldap01.example.com bindmethod=simple binddn="cn=admin,dc=example,dc=com"
credentials=secret searchbase="dc=example,dc=com" logbase="cn=accesslog"
logfilter="(&(objectClass=auditWriteObject)(reqResult=0))" schemachecking=on
type=refreshAndPersist retry="60 +" syncdata=accesslog
-
add: olcUpdateRef
olcUpdateRef: ldap://ldap01.example.com
</pre>
Dit script is slechts gebruikt voor testen van replicatie en is niet meer compatibel met de initiële configuratie zoals hier boven is beschreven.
===Uitbreiding tot Multi-Master===
Daar we binnen de HCC.NL omgeving zoveel mogelijk redundantie nastreven, zullen er twee ldap servers zijn die elkaars kopie zijn. Toegang tot de servers word via een loadbalancer geregeld (zie boven). Hierdoor ontstaat een situatie waarin beide servers tegankelijk zijn voor lezen en schrijven echter door de instelling van de loadbalancer zal slechts één server alle lees en schrijf opdrachten afhandelen. De andere server is een z.g. mirror. Hiervoor moet de configuratie uitgebreid worden. Alle databases moeten beide servers up-to-date blijven. De volgende ldif configuratie bewerkstelligd dat.
<pre>
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov
 
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1 ldap://ubuntu.vandenbussche.nl
olcServerID: 2 ldap://ns2.vandenbussche.nl
 
dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
 
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001 provider=ldap://ubuntu.vandenbussche.nl binddn="cn=admin,cn=config" bindmethod=simple credentials=secret searchbase="cn=config" type=refreshAndPersist retry="5 5 300 5" timeout=1
olcSyncRepl: rid=002 provider=ldap://ns2.vandenbussche.nl binddn="cn=admin,dc=config" bindmethod=simple credentials=secret searchbase="cn=config" type=refreshAndPersist retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
</pre>
Hiermee is de replicatie van de config database geregeld. Het is wel zaak de slapd te herstarten. Alle masters gebruiken dezelfde config dus! De backend database(s) moeten ook gerepliceerd worden. Voor de elke database wordt het volgende (met subtiele verschillen) aan de configuratie toegevoegd:
<pre>
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=003 provider=ldap://ubuntu.vandenbussche.nl binddn="cn=admin,dc=hobby,dc=nl" bindmethod=simple credentials=secret searchbase="dc=hobby,dc=nl" type=refreshOnly interval=00:00:00:10 retry="5 5 300 5" timeout=1
olcSyncRepl: rid=004 provider=ldap://ns2.vandenbussche.nl binddn="cn=admin,dc=hobby,dc=nl" bindmethod=simple credentials=secret searchbase="dc=hobby,dc=nl" type=refreshOnly interval=00:00:00:10 retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
 
dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
root@ubuntu:~/ldap# cat syncrepl-backend.ldif
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=003 provider=ldap://ubuntu.vandenbussche.nl binddn="cn=admin,dc=hobby,dc=nl" bindmethod=simple credentials=secret searchbase="dc=hobby,dc=nl" type=refreshOnly interval=00:00:00:10 retry="5 5 300 5" timeout=1
olcSyncRepl: rid=004 provider=ldap://ns2.vandenbussche.nl binddn="cn=admin,dc=hobby,dc=nl" bindmethod=simple credentials=secret searchbase="dc=hobby,dc=nl" type=refreshOnly interval=00:00:00:10 retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
 
dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
</pre>
</pre>
Deze tweede ldif file hoeft slechts op één master uitgevoerd te worden; de ander haalt de data vanzelf op. Van belang is dat de rid's uniek genummerd zijn. Een derde database zal dus rid=005 en 006 gebruiken.

Revision as of 15:22, 28 October 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 gebruiken 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 liggen de keuze is OpenLDAP. Echter zijn er geluiden gehoord dat OpenLDAP niet zou schalen. Alternatieven zijn b.v. 389 maar die is erg slecht gesuppoort onder Ubuntu. Voorlopig starten we met OpenLDAP.

Loadbalanced

Er zijn twee servers (hcc-ldap-lb1 en hcc-ldap-lb2) die achter een loadbalancer in pomeleoepee mode staat zodat het verkeer altijd server1 gestuurd wordt. Beide servers houden elkaar up-to-date. In de gewone situatie zullen alle reads en writes naar server 1 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 server 1 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 OpenLDAP site.

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

En het ontbrekende stuk van 11.10 waarin de oorspronkelijke variabelen zijn vervangen door vaste strings:

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=hccnet,dc=nl
olcDbDirectory: /var/lib/ldap/hccnet
olcRootDN: cn=admin,dc=hccnet,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