LDAP: Difference between revisions

From Hobbynet Admin Wiki
Jump to navigation Jump to search
 
(309 intermediate revisions by 7 users not shown)
Line 1: Line 1:
==Introductie==
==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
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 alles opgeslagen wat nodig is voor het functioneren van de site, inclusief NAW gegevens.


==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 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==
==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 (ldap-lb1 en ldap-lb2) die achter een loadbalancer in preferred server mode staan 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.


==installatie==
Tevens zijn er een test en een development server: ldap-test en ldap-dev.
installatie van OpenLDAP is simpel:
 
==Installatie==
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.
Omdat er gebruikgemaakt wordt van php scripts, is het ook nodig '''php-cli''' en '''php-ldap''' te installeren. 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 "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.  


==Initiële database==
De volgende pakketten dienen geïnstalleerd te zijn ('php -m' toont de geactiveerde modules):
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].
=== Post Karmic situatie===
<pre>
<pre>
version: 1
Mogelijk ontbrekende pakketten:
 
apt-get install aptitude
apt-get install php-mbstring
apt-get install php-xmlrpc
apt-get install php-ldap
apt-get install ldapscripts
apt-get install php-xml
apt-get install slapd
apt-get install ldap-utils
 
- openldap moet lid zijn van de groep ssl-cert!
apt-get install ssl-cert
adduser openldap ssl-cert
(of vi /etc/group
    ssl-cert:x:116:openldap)
 
- Zorg dat de LDAP daemon bij de certificaten kan komen.
LET OP: op alle hobbynet servers staan de certificaten in /disk/site/etc/ssl/hobby.nl/
chgrp ssl-cert /disk/site/etc/ssl/hobby.nl/hobby.nl.*
chmod 440      /disk/site/etc/ssl/hobby.nl/hobby.nl.key
LET OP: Als apparmor geïnstalleerd is moet het pad naar de certificaten vrijgegeven worden. Als alternatief kan apparmor verwijderd worden.
 
Het volgende is niet nodig voor ldap. Mischien voor mysql-server???
- mysql laat het bestand ibdata1 ongelimiteerd groeien (InnoDB bestanden)
/etc/mysql/mysql.conf.d/innodb_file_per_table.cnf
[mysql]
innodb_file_per_table
 
Nog meer Hobbynet aanpassingen Waarom???
/etc/bash.bashrc
export http_proxy=http://squid-int.hobby.nl:3128
export https_proxy=http://squid-int.hobby.nl:3128
export ftp_proxy=http://squid-int.hobby.nl:3128
</pre>


#
===Locatie bestanden===
# LDAPv3
Om de benodigde bestanden op de server te krijgen zal scp gebruikt moet worden. Upload alles in een privé subdirectory. Copiëer daarna alles naar de juiste plaats en verander de owner in root.
# base <cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#


# config
* Alle ldif em tmpl bestanden gaan naar /usr/local/hobbynet/lib
dn: cn=config
* init_ldap en andere scripts gaan naar /usr/local/hobbynet/bin
objectClass: olcGlobal
* alle data bestanden (dumps) en update ldifs gaan naar /usr/local/hobbynet/data
cn: config
* /usr/local/hobbynet/etc/ldap/schema/hcc_schema.* gaan naar /etc/ldap/schema
olcArgsFile: /var/run/slapd/slapd.args
* /usr/local/hobbynet/etc/ldap/schema/ppolicy.ldif gaat naar /etc/ldap/schema
olcLogLevel: none
* /usr/local/hobbynet/etc/ldap/schema/ldapns.ldif gaat naar /etc/ldap/schema
olcPidFile: /var/run/slapd/slapd.pid
olcToolThreads: 1


# schema, config
Ldapns en ppolicy moeten eventueel van een oudere release bewaard blijven! Waarom ze weg in 22.04 zijn is onduidelijk. hcc_schema.ldif wordt middels een script gemaakt. Dit script plaatst de ldif bestand(en) in /etc/ldap/schema. Zie de README en actuele scripts.
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema
.....


# {0}core, schema, config
==Initiële database==
dn: cn={0}core,cn=schema,cn=config
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. Wordt echter init_ldap.sh <admin-pw> gebruikt dan wordt een werkende directory gemaakt met alle statische data (in diverse ou's) erin. Gebruik na het maken van de initiële database restore_ldap.sh om de database te vullen met de data uit de data directory.
objectClass: olcSchemaConfig
cn: {0}core
.....


# {-1}frontend, config
===slapd.init.ldif ===
dn: olcDatabase={-1}frontend,cn=config
Bij installatie en reconfiguratie wordt /usr/share/slapd/slapd.init.ldif ingelezen. Zie aldaar indien nodig. Er wordt zowel voor de cn=config als voor de dc=hcc,dc=nl een RootDN aangemaakt. Echter wordt er geen password gezet op de RootDN voor config.
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
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
olcSizeLimit: 500


# {0}config, config
==init_ldap script==
dn: olcDatabase={0}config,cn=config
Het lokale script init-ldap doet een reset van de initiële Openldap configuratie. Dit heeft tot gevolg dat de DIT dc=hcc,dc=nl met een rootDN '''cn=admin,dc=hcc,dc=nl''' steeds opnieuw aangemaakt wordt. Alles wat we toegevoegd/gewijzigd willen hebben in de cn=config volgt daarna. Dit wordt afgesloten met een restart van de slapd server. Het script '''restore_ldap''' laadt vervolgens de laatste dump terug. Bij wijzigingen aan het schema is het raadzaam altijd een '''dump_ldap''' te doen zodat een later een actuele dump kan worden teruggeladen.
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth manage by * break


# search result
Het (plain text) password van cn=admin,dc=hcc,dc=nl moet bij het aanroepen van '''init_ldap''' op de commandline worden meegegeven. Tijdens de dpkg-reconfigure moet het password nog 2x gegeven worden. Lees eventueel ook de [http://www.openldap.org/doc/admin/ OpenLDAP Admin Guide].


# numResponses: 6
Het init_ldap script bevat allerlei logica om op meerdere ldap servers gedraaid te kunnen worden. In grote lijnen valt het script in een aantal blokken uiteen:
# numEntries: 5
* voorbereidingen om "dpkg-reconfigure slapd" te draaien
</pre>
* definities van input files
===backend.ldif===
* check host
Installeert de hdb module, configureert de suffix (hobby.nl), zet er een RootDN en PW op en plaatst indexen op enkele attrs.
* bouwen van het skelet van de nieuwe directory
<pre>
Zie voor details van de scripts '''init_ldap''', '''dump_ldap''' en '''restore_ldap''' op een van de servers (in /usr/local/hobbynet/bin).
# Load dynamic backend modules
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
olcModuleload: back_hdb


# Create the backend database
==onderdelen van init_ldap==
dn: olcDatabase=hdb,cn=config
Init_ldap is opgezet om stap voor stap de database op te bouwen. Hieronder een beschrijving van de losse ldif bestanden die ingelezen worden. Incidenteel wordt een ldif gewijzigd; kijk altijd in de actuele bestanden!
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.
===add-schema.ldif===
dn: cn=admin,dc=hobby,dc=nl
Omdat wij een aantal eigen attributes en Objectclasses hebben toegevoegd aam het schema, moeten deze aan OpenLDAP worden toegevoegd. Het schema moet nog worden omgezet naar ldif format.
objectClass: simpleSecurityObject
* Hiertoe wordt het onderstaande schema in /etc/ldap/schema geplaatst als hcc_schema.schema.
objectClass: organizationalRole
* Vervolgens worden de stappen uitgevoerd zoals beschreven in de [https://help.ubuntu.com/11.10/serverguide/C/openldap-server.html Ubuntu Server guide], onder '''Modifying the slapd Configuration Database'''.
cn: admin
* De resulterende output file '''cn=hcc_schema.ldif''' moet dan nog naar /etc/ldap/schema/hcc_schema.ldif gecopieerd worden.  
description: LDAP administrator for hobby.nl
Als dit proces herhaald moet worden, start dan met een lege output directory en verwijder een eventueel achtergebleven cn=hcc_schema.ldif bestand.
userPassword: {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==


dn: ou=people,dc=hobby,dc=nl
De extra schema's worden middels een '''include''' toegevoegd. '''Ppolicy''' is op gelijke wijze als '''hcc_schema''' tot .ldif geconverteerd. Alle stappen om een nieuwe '''hcc-schema.ldif''' te maken zijn gescript in '''upd_schema'''. In '''init_ldap''' wordt het eigen schema en de password policy geladen:
objectClass: organizationalUnit
<pre>
ou: people
#
# file: add-schema.ldif
# date: vbs20200415
# date: vbs20220511 ppolicy not included to get
#      of duplicate message
#
include: file:///etc/ldap/schema/hcc_schema.ldif
#include: file:///etc/ldap/schema/ppolicy.ldif
include: file:///etc/ldap/schema/ldapns.ldif
</pre>


dn: ou=groups,dc=hobby,dc=nl
====schema updates====
objectClass: organizationalUnit
Soms wordt een attribute toegevoegd of gewijzigd. Hiertoe dient het bestand hcc_schema.schema in /usr/local/hobbynet/etc/ldap/schema, gewijzigd te worden. Daarna dient er een ldif versie van gemaakt te worden. Gebruik hiervoor '''upd_schema.sh''' in dezelfde directory. De resulterende hcc_schema.ldif wordt in dit script naar /etc/ldap/schema gecopieërd. Bij grote wijzigingen is het aan te bevelen door de hele rebuild cycle te gaan (dump, init, restore). Bij triviale aanpassingen zou hcc_schema.ldif ook '''direct''' in de actieve directory geplaatst kunnen worden, gevolgd door slechts een '''service slapd restart'''. Gebruik hiervoor (blijf in de lokale schema directory):
ou: groups
<pre>
cp "ldif_output/cn=config/cn=schema/cn={14}hcc_schema.ldif" "/etc/ldap/slapd.d/cn=config/cn=schema/cn={4}hcc_schema.ldif"
</pre>
</pre>
====Voorbeeld van een entry in people en groups====
LET OP: De nummers tussen accolades zijn bepaald door de volgorde van andere scripts! Zolang geen andere schema's worden toegevoegd zullen ze niet veranderen.
Zodra de eerste twee ldifs geladen zijn kan een entry worden toegevoegd in people,hobby,nl.
<br>
Ook kan met de ldap-tools gewerkt worden. Gebruik ldapsearch en ldapmodify, eventueel met de -f optie om een voorbereide serie opdrachten uit te voeren. Gebruik ldapsearch om eerst de structuur te vinden:
<pre>
<pre>
dn: uid=egbert,ou=people,dc=hobby,dc=nl
$ sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn={4}hcc_schema,cn=schema,cn=config
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>
</pre>
 
Hier een voorbeeld om een objectClass aan te passen:
===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>
<pre>
# Remove any ACL on frontend
$ cat pas_aan.ldif
dn: olcDatabase={-1}frontend,cn=config
dn: cn={4}hcc_schema,cn=schema,cn=config
changetype: modify
changetype: modify
delete: olcAccess
delete: olcObjectClasses
olcObjectClasses: {7}( 1.3.6.1.4.1.12795.2.8 NAME 'hccRelatieNaam' \
  DESC 'Naam van een klant of partner' SUP top STRUCTURAL MUST ( cn $userPassword )
MAY ( hccXmlIp4 $ hccXmlIp6 $ hccXmlAllow $ description ) )
-
add: olcObjectClasses
olcObjectClasses: {7}( 1.3.6.1.4.1.12795.2.8 NAME 'hccRelatieNaam' \
  DESC 'Naam van een klant of partner' SUP top STRUCTURAL MUST ( cn $userPassword )
MAY ( hccXmlIp4 $ hccXmlIp6 $ hccXmlAllow $ description $ hccIg ) )
-


# Put new RootDN in config
$sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f pas_aan.ldif
dn: olcDatabase={0}config,cn=config
</pre>
changetype: modify
add: olcRootDN
olcRootDN: cn=admin,cn=config


# Set the passwd for RootDN
===modify_config.ldif===
dn: olcDatabase={0}config,cn=config
Dit template dient om de SSL/TLS instelling toe te voegen in de ldap configuratie. Toegevoegd worden de certificaat gegevens om met TLS te kunnen werken. Het loglevel wordt op '''STATS''' gezet. Dit geeft niet teveel logging maar is toch goed bruikbaar. Om extra logging te krijgen op b.v. ACL's, verander olcLogLevel dan in "stats ACL". 
<pre>
#
# file: modify-config.ldif
# date: vbs20200415
#
dn: cn=config
changetype: modify
changetype: modify
add: olcRootPW
add: olcTLSCACertificateFile
olcRootPW: {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
olcTLSCACertificateFile: /disk/site/etc/ssl/hobby.nl/CA-bundel.crt
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /disk/site/etc/ssl/hobby.nl/hobby.nl.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /disk/site/etc/ssl/hobby.nl/hobby.nl.key
-
add: olcPasswordHash
olcPasswordHash: {CRYPT}
-
add: olcPasswordCryptSaltFormat
olcPasswordCryptSaltFormat: $6$%.16s
-
replace: olcLogLevel
olcLogLevel: stats
</pre>
Om de logging in een apart bestand te krijgen moet in /etc/rsyslog.d een extra bestand '''openldap.conf''' geplaatst worden.
<pre>
local4.*  -/var/log/openldap.log
</pre>
Tevens willen we logrotate op dit bestand. Plaats in /etc/logrotate.d het bestand '''openldap''' met de volgende inhoud
<pre>
/var/log/openldap.log
{
        rotate 4
        weekly
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                reload rsyslog >/dev/null 2>&1 || true
        endscript
}
</pre>


# Delete any ACL on config
===modify-mdb.ldif===
dn: olcDatabase={0}config,cn=config
Hier worden de wijzigingen op de backend db gemaakt.
changetype: modify
delete: olcAccess
</pre>
===acl.ldif.ldif===
Acl.ldif plaatst een ALL op de backend database.
<pre>
<pre>
dn: olcDatabase={1}hdb,cn=config
#
add: olcAccess
# file: modify-mdb.ldif
olcAccess: to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=hobby,dc=nl" write by anonymous auth by self write by * none
# date: vbs20200415
olcAccess: to dn.base="" by * read
# hjv 2020.06.07 (oldSizeLimit toegevoegd)
olcAccess: to * by dn="cn=admin,dc=hobby,dc=nl" write by * read
#
dn: olcDatabase={1}mdb,cn=config
replace: olcDbCheckpoint
olcDbCheckpoint: 4096 1
-
replace: olcDbNoSync
olcDbNoSync: TRUE
-
replace: olcSizeLimit
olcSizeLimit: 100000
</pre>
</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.
===modify-acl.ldif===
===Shell script===
Hier worden de rechten bepaald van de diverse rollen en groepen
Dit script moet uitgevoerd worden wanneer de 4 minimale ldifs klaar zijn om in OpenLDAP gezet te worden (dynamische configuratie).
<pre>
<pre>
#
#
# Initial part.
# file: modify-acl.ldif
# date: vbs20200415
#
dn: olcDatabase={1}mdb,cn=config
replace: olcAccess
# hobbynetlogin heeft lees rechten t.b.v. MySecureShell aanloggen
olcAccess: to attrs=@posixAccount,@posixGroup,@shadowAccount,@hostObject
  by dn="cn=hobbynetlogin,ou=applicaties,dc=hcc,dc=nl" read
  by * break
#
olcAccess: to attrs=@posixAccount
  by anonymous read
  by * break
#
#
# Add the three main schemas
# sta anonymous search toe (t.b.v. Apache authenticatie)
# Load the database backend module and create the database
olcAccess: to attrs=hccLogin,hccRol,hccProfiel,entry
# Create the base dn and the admin account for the openldap server
  by anonymous read
# There are some acl's set in the openldap setup that prevent phpldapadmin
  by * break
# 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
# olcAccess: to attrs=hccOptIn
#  by self write
#  by dn="cn=drupal-hcc-nl,ou=klanten,dc=hcc,dc=nl" write
#  by * break
#
#
# See: http://www.howtoforge.com/install-and-configure-openldap-on-ubuntu-karmic-koala
# Anonieme klanten moeten kunnen inloggen
# en mogen hun eigen password wijzigen
olcAccess: to attrs=userPassword,shadowLastChange
  by self write
  by anonymous auth
  by * break
#
#
tmpdir=~/ldap
# Gebruiker mag zijn kader email wachtwoord aanpassen
# Cleanup
olcAccess: to attrs=hccKaderPassword,hccKaderForward
echo "Remove old databases"
  by self write
rm -R /var/lib/ldap/hcc/*
  by * break
rm -R /var/lib/ldap/hobby/*
#
# Add schemas
# beheerders hebben schrijfrechten op alles (updateDN)
echo "Add the cosine, nis and inetorgperson schema's"
# klanten hebben alleen lees rechten op alles (readDN)
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
# self mag lezen
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif
olcAccess: to *
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
  by self read
# Add database module and configure
  by dn="cn=xml-hoge-rechten,ou=applicaties,dc=hcc,dc=nl" write
echo "Add backend.ldif"
  by dn="cn=xml-lage-rechten,ou=applicaties,dc=hcc,dc=nl" read
ldapadd -Y EXTERNAL -H ldapi:/// -f $tmpdir/backend.ldif
  by dn.one="ou=beheer,dc=hcc,dc=nl" write
# Add base DN
  by dn.one="ou=klanten,dc=hcc,dc=nl" read
echo "Add frontend.ldif"
  by * break
ldapadd -Y EXTERNAL -H ldapi:/// -f $tmpdir/frontend.ldif
#
# Place RootDN and remove ACLs
# PC30 helpdesk heeft leesrechten op ou=leden
echo "Add config.ldif"
olcAccess: to attrs=@hccOrgPerson,@hccKaderFunctie
ldapadd -Y EXTERNAL -H ldapi:/// -f $tmpdir/config.ldif
  by dn.one="ou=helpdesk,dc=hcc,dc=nl" read
# Place ACL
  by * break
echo "Add acl.ldif"
#
ldapmodify -x -D cn=admin,cn=config -W -f $tmpdir/acl.ldif
# partners mogen een paar attrs lezen
# Restart slapd
olcAccess: to attrs=hccLidNummer,hccPostcode,hccPostcodeZoekveld,hccIg
/etc/init.d/slapd restart
  by dn.one="ou=partners,dc=hcc,dc=nl" read
  by * break
#
# iedereen moet (pseudo attr) entry en objectClass kunnen lezen
olcAccess: to attrs=entry,objectClass
  by * read
#
olcAccess: to *
  by * none
</pre>
</pre>
===Pre Karmic situatie===
 
Na het uitvoeren vna het script ziet het totaal over zich er zo uit:
===modify_index.ldif===
Een kale configuratie is heel snel voor wat betreft het opnieuw vullen met gegevens. Bij het aanmaken van een verse LDAP database worden er dan ook zo min mogelijk indexen aangemaakt.<br>
Zodra de inhoud is ingelezen kunnen de 'echte' indexen aangemaakt worden.
<pre>
<pre>
# extended LDIF
#
#
# LDAPv3
# file: modify-index.ldif
# base <cn=config> with scope subtree
# date: vbs20200415
# filter: (objectclass=*)
# requesting: ALL
#
#
dn: olcDatabase={1}mdb,cn=config
replace: olcDbIndex
olcDbIndex: default pres,eq
olcDbIndex: objectClass,entryUUID,entryCSN eq
olcDbIndex: hccLidNummer,hccLogin,hccForumLogin eq
olcDbIndex: uid,uidNumber,gidNumber,memberUid,member eq
olcDbIndex: cn,host,hccPseudoniem,hccOptin,hccLocatie eq
olcDbIndex: sn,hccPostcodeZoekveld,hccIg,hccRegio eq,subfinal
olcDbIndex: hccRol,hccBezoek eq,pres,subfinal
olcDbIndex: hccBulletins pres
olcDbIndex: aboNummer eq
olcDbIndex: aboPostcodeZoekveld eq,subfinal
olcDbIndex: mail,mailHccnet,hccKaderMail,hccKaderForward pres,eq
olcDbIndex: hccProfiel pres,eq
olcDbindex: hccKaderUniekeURL eq
olcDbindex: hccOnderwerp eq,subfinal
</pre>


# config
===ppolicy overlay===
* vanuit LDAP de minimale lengte van een wachtwoord afdwingen
* in LDAP SSHA versleuteling activeren<br>
(olcPPolicyHashCleartext: TRUE)
<pre>
#
# file: add-ppolicy.ldif
# date: vbs20200415
#
dn: cn=module, cn=config
cn: module
objectClass: olcModuleList
objectClass: top
olcModuleLoad: ppolicy
olcmodulepath: /usr/lib/ldap
 
dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=policies,dc=hcc,dc=nl
olcPPolicyUseLockout: TRUE
olcPPolicyHashCleartext: TRUE
</pre>
The default ppolicy looks like this:
<pre>
dn: cn=default,ou=policies,dc=hcc,dc=nl
objectClass: pwdPolicy
objectClass: device
cn: default
pwdCheckQuality: 1
pwdMinLength: 8
pwdAttribute: 2.5.4.35
pwdAllowUserChange: TRUE
</pre>
 
===Syncrepl overlay===
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. Wij gebruiken de z.g. Mirror Mode. Zie de [http://www.openldap.org/doc/admin/ LDAP Admin Guide]. '''Mirror configuratie is specifiek per server!'''
<pre>
#######################################
## add-syncrepl.tmpl                ##
#######################################
dn: cn=config
dn: cn=config
objectClass: olcGlobal
changetype: modify
cn: config
replace: olcServerID
olcArgsFile: /var/run/slapd/slapd.args
olcServerID: @SID@
olcLogLevel: none
olcPidFile: /var/run/slapd/slapd.pid
olcToolThreads: 1


# module{0}, config
dn: cn=module{0},cn=config
dn: cn=module{0},cn=config
objectClass: olcModuleList
changetype: modify
cn: module{0}
add: olcModuleLoad
olcModulePath: /usr/lib/ldap
olcModuleLoad: syncprov
olcModuleLoad: {0}back_hdb
 
dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 5
olcSpSessionlog: 100
 
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=@RID@
  provider=ldap://@PROVIDER@
  binddn="cn=admin,dc=hcc,dc=nl" bindmethod=simple credentials="@PASSWORD@"
  searchbase="dc=hcc,dc=nl"
  type=refreshAndPersist
  interval=00:00:00:10
  retry="5 5 300 5"
  timeout=1
  starttls=yes
-
add: olcMirrorMode
olcMirrorMode: TRUE
</pre>
De andere server krijgt ServerID 2 en de provider is het IP adres van de andere server.
 
===Unique overlay===
Deze overlay dient er voor te zorgen dat o.a het attribuut hccLogin een unieke waarde bevat.
<pre>
#######################################
## add-unique.ldif                  ##
#######################################
dn: cn=module,cn=config
cn: module
objectclass: olcModuleList
objectclass: top
olcmoduleload: unique
olcmodulepath: /usr/lib/ldap
 
dn: olcOverlay=unique,olcDatabase={1}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcUniqueConfig
olcOverlay: unique
olcUniqueAttribute: uid uidNumber hccLogin
</pre>
 
==SSL/TLS beveiliging==
Gebruik de juiste .pem bestanden in /etc/ssl/certs en /etc/ssl/private.
 
We maken gebruik van een RapidSSL certificaat. Als dit niet standaard in Ubuntu bekend is, zet dan eerst GeoTrust_RapidSSL_-_ca-bundle.pem in de map /etc/ssl/certs neer. Voer nu een '''c_rehash .''' uit in /etc/ssl/certs om de cache te updaten (omdat GeoTrust_RapidSSL_-_ca-bundle.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/hobby.nl.*
chmod 440      /etc/ssl/private/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 hobby.nl.crt
-r--r----- 1 root    ssl-cert 1679 Nov 22 20:25 hobby.nl.key
 
root@hcc-ldap-lb1:~# grep openldap /etc/group
ssl-cert:x:114:openldap
openldap:x:118:
 
2020.12.09: Op een nieuwe Ubuntu installatie staat apparmor standaard aan. Weg ermee!
apt remove --assume-yes --purge apparmor
<strike>Per september 2017 staan de certificaten in /disk/site/etc/ssl/hobby.nl, net als op alle andere servers. Omdat apparmor actief is moet deze directory worden toegevoegd aan /etc/apparmor.d/local/usr.sbin.slapd. Die file ziet er dan als volgt uit:
<pre>
# Site-specific additions and overrides for usr.sbin.slapd.
# For more details, please see /etc/apparmor.d/local/README.
#include <abstractions/ssl_certs>
/disk/site/etc/ssl/hobby.nl/ r,
/disk/site/etc/ssl/hobby.nl/* r,
</pre>
</strike>
 
Als Openldap ook op poort 636 benaderd wordt (naast TLS op 389), moet in /etc/default/slapd ldaps:/// opgenomen worden bij de SLAPD_SERVICES.<br>
'netstat -an' dient dan 636 te laten zien voor zowel IPv4 als IPv6.
 
Om de cn=config te zien kan je het volgende commando gebruiken:
<pre>
ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config
 
of, wat botter maar korter:
cat /etc/ldap/slapd.d/cn\=config.ldif
</pre>
 
==Backup, initialize, restore==
Om het hele skelet van ldap in één keer te herstellen dient '''init_ldap''' gebruikt te worden. Als argument '''moet''' het admin beheer wachtwoord mee gegeven worden.
 
===lokaal===
Backups kunnen gemaakt worden terwijl slapd draait maar geadviseerd wordt slapd te stoppen. Voor dumpen moet '''slapcat''' gebruikt worden. Backups kunnen gemaakt worden per database of een filter daarop, 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, hdb is gewoonlijk 1.
 
Het '''dump_ldap''' script dumpt alle ou's in aparte .ldif bestanden; het omgekeerde doet '''restore_ldap'''. 
Terug inlezen kan alleen in een lege directory, dus direct nadat '''init_ldap''' is gedaan. Gebruik voor het terugplaatsen '''slapadd'''. Aan te bevelen is '''-c''' mee te geven zodat ondanks fouten doorgegaan wordt.
 
Voor slapadd '''moet''' slapd gestopt zijn. Denk er om alvorens te slapd starten het ownership van de bestanden in /var/lib/ldap recht te zetten! (dit lijkt niet meer nodig te zijn vbs20130526)
/etc/init.d/slapd stop
slapadd -l hcc-dump.ldif -w -c >errors.txt
chown openldap:openldap /var/lib/ldap/*
/etc/init.d/slapd start
 
===remote===
Er wordt dagelijks een encrypted remote backup gemaakt naar backup2bit. Zie voor meer info [[Encrypted_backup]]. Dit script maakt gebruik van unieke gpg keys. Op elke server is dus een eigen versie nodig van '''backup-encrypted'''.<br>
Recente lokale backups zijn te vinden in '''/usr/local/hobbynet/tmp'''.
 
===Verse ldap maken===
Transactie log bij het toevoegen van b.v. een nieuwe ou:
 
<pre>
Op beide servers:
schema van test server gecopieerd en geactiveerd
dump-ldap gedraaid
systemctl stop slapd.service
 
Er is nu géén ldap service! Werk dus snel...
 
op ldap-lb1:
init-ldap.sh <adminpw>
restore-ldap.sh
wacht op indexering (tot slapd uit top verdwijnt)
Slapd service is nu in de lucht op ldap-lb1
systemctl stop slapd.service
 


# schema, config
op ldap-lb2:
dn: cn=schema,cn=config
init-ldap.sh <adminpw>
objectClass: olcSchemaConfig
restore-ldap.sh
cn: schema
wacht op indexering (tot slapd uit top verdwijnt)
.....
Slapd service is nu in de lucht op ldap-lb2


# {0}core, schema, config
op ldap-lb1:
dn: cn={0}core,cn=schema,cn=config
systemctl start slapd.service
objectClass: olcSchemaConfig
Beide slapd servers zijn in de lucht en moeten synchroniseren.
cn: {0}core
.....


# {1}cosine, schema, config
op beide servers:
dn: cn={1}cosine,cn=schema,cn=config
check replicatie (netstat en functioneel)
objectClass: olcSchemaConfig
cn: {1}cosine
.....


# {2}nis, schema, config
root@ldap-lb1:/usr/local/hobbynet/bin# netstat -n | grep 389
dn: cn={2}nis,cn=schema,cn=config
tcp6      0      0 2a02:968:ffff:910:172:31:8:5:49510 2a02:968:ffff:910:172:31:8:4:389 ESTABLISHED
objectClass: olcSchemaConfig
tcp6      0      0 2a02:968:ffff:910:172:31:8:5:389 2a02:968:ffff:910:172:31:8:4:37490 ESTABLISHED
cn: {2}nis
tcp6      0      0 2a02:968:ffff:910:172:31:8:5:49508 2a02:968:ffff:910:172:31:8:4:389 ESTABLISHED
.....
tcp6      0      0 2a02:968:ffff:910:172:31:8:5:389 2a02:968:ffff:910:172:31:8:4:37488 ESTABLISHED


# {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
Functioneel door met ADS op beide servers in te loggen en een willekeurig veld in je eigen entry te wijzigen op lb1. Kijk of het gebeurd is op lb2 en wijzig het daar terug. Check op de andere server of het gebeurd is. Er kan een zekere vertraging in optreden.
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcRootDN: cn=admin,cn=config
olcRootPW: {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==


# {1}hdb, config
Stel er is een nieuwe ou gemaakt: denk aan het bij werken van de dump en restore scripts.
dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap/hobby/
olcSuffix: dc=hobby,dc=nl
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=hobby,
dc=nl" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=hobby,dc=nl" write by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=hobby,dc=nl
olcRootPW: {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
olcDbCheckpoint: 512 30
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
olcDbIndex: uid pres,eq
olcDbIndex: cn,sn,mail pres,eq,approx,sub
olcDbIndex: objectClass eq


# search result
update dump-ldap.sh en restore-ldap.sh met de nieuwe ou
search: 2
result: 0 Success


# numResponses: 11
op ldap-lb1:
# numEntries: 10
export tarieven.ldif op test server en import op ldap-lb1
</pre>
</pre>
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?).


==Replicatie==
==crontab==
Voor master/slave replicatie kan de configuratie in [https://help.ubuntu.com/10.04/serverguide/C/openldap-server.html Ubuntu Server Guide] gevonden worden.
# script dat updates ophaalt (maar niet installeert), zodat nagios ze ook detecteert
===Uitbreiding tot single master===
0 9 * * * /usr/local/hobbynet/bin/upd_srv >/dev/null
In ldap terminologie spreken we van een '''provider'''. In dit geval en single-master. De provider.ldif:
0 18 * * * /usr/local/hobbynet/bin/upd_srv >/dev/null
 
==LDAP Clients==
Er zijn meerdere LDAP clients. De meest populaire zijn Apache Directory Studio ("ADS") en phpLdapAdmin ("PLA").<br>
De eerste is veel uitgbreider maar vereist een Java Runtime Environment ("JRE"). Onder Windows is dat JRE(13) of (open)JDK-(13).<br>
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.
 
Binnen Hobbynet wordt uitsluitend gebruik gemaakt van ADS.
 
===StartTLS===
Aanbevolen wordt StartTLS op poort 389 te gebruiken. Alternatief is LDAPS op poort 636 maar dat is deprecated.  
 
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===
<i>2019-10-31 HJV: Oude info, als referentie leuk, maar niet meer relevant</i><br>
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:
<pre>
<pre>
# Add indexes to the frontend db.
Haal de benodigde bestanden op (op een Linux systeem):
dn: olcDatabase={1}hdb,cn=config
wget http://www.cacert.org/certs/root.der -O root.der
changetype: modify
wget http://www.cacert.org/certs/class3.der -O class3.der
add: olcDbIndex
copieer de bestanden naar de Windows omgeving in C:\Program Files (x86)\Java\jre6\lib\security.
olcDbIndex: entryCSN eq
 
-
Open een commandwindow:
add: olcDbIndex
cd C:\Program Files (x86)\Java\jre6\lib\security
olcDbIndex: entryUUID eq
..\..\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
</pre>
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 laat zich uit een tarball installeren. Dit kan geheel in userspace; er is geen make install o.i.d. nodig. ADS loopt vanuit de lokatie waar het uitgepakt is.
 
===ADS gebruik===
ADS kan erg handig zijn voor het snel dumpen van hele ou's in .ldif formaat. Zo'n dump kan direct op een andere server worden ingelezen.


#Load the syncprov and accesslog modules.
===PhpLdapAdmin onder Linux===
dn: cn=module{0},cn=config
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].
changetype: modify
<pre>
add: olcModuleLoad
#
olcModuleLoad: syncprov
# LDAP Defaults
-
#
add: olcModuleLoad
olcModuleLoad: accesslog


# Accesslog database definitions
# See ldap.conf(5) for details
dn: olcDatabase={2}hdb,cn=config
# This file should be world readable but not world writable.
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.
#BASE  dc=example,dc=com
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpNoPresent: TRUE
olcSpReloadHint: TRUE


# syncrepl Provider for primary db
#SIZELIMIT      12
dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
#TIMELIMIT      15
changetype: add
#DEREF          never
objectClass: olcOverlayConfig
TLS_CACERT      /etc/ssl/certs/CAcert_org.pem
objectClass: olcSyncProvConfig
TLS_CERT        /etc/ssl/private/hobby.nl.crt
olcOverlay: syncprov
TLS_KEY        /etc/ssl/private/hobby.nl.key
olcSpNoPresent: TRUE
TLS_REQCERT    allow
#TLS_REQCERT never
</pre>
Denk er wel aan na wijzigingen Apache te herstarten.
===PAM en NSS via LDAP===
Het inloggen van gebruikers kan ook via een LDAP server en client geschieden. Hiervoor dienen enkele pakketten geïnstalleerd en geconfigureerd te worden. Er zijn wijzigingen nodig in /etc/nsswitch.conf en de /etc/pam.d/common-* bestanden. Beide zijn via dedicated tools aan te passen.


# accesslog overlay definitions for primary db
Installeer '''libnss-ldapd''' om de benodigde libraries te verkrijgen. Apt-get zal tevens '''libpam-ldapd''', '''nslcd''' en '''nscd''' binnen brengen.
dn: olcOverlay=accesslog,olcDatabase={1}hdb,cn=config
<pre>
objectClass: olcOverlayConfig
apt-get install libnss-ldapd auth-client-config ldap-utils
objectClass: olcAccessLogConfig
The following extra packages will be installed:
olcOverlay: accesslog
    libpam-ldapd nscd nslcd
olcAccessLogDB: cn=accesslog
</pre>
olcAccessLogOps: writes
Libnss-ldapd is een doorontwikkeling van libnss-ldap en bevat meerdere verbeteringen. Zie: [http://arthurdejong.org/nss-pam-ldapd/ deze site] van de ontwikkelaar. Bij de installatie wordt een user '''nslcd''' aangemaakt; denk erom die in de .tmpl bestanden te zetten!
olcAccessLogSuccess: TRUE
 
# scan the accesslog DB every day, and purge entries older than 7 days
nsswitch.conf laat zich configureren via '''auth-client-config''' maar lac_ldap is alleen aanwezig als '''ldap-auth-config''' ook is geinstalleerd. Zo niet gebruik dan de tweede regel:
olcAccessLogPurge: 07+00:00 01+00:00
<pre>
auth-client-config -t nss -p lac_ldap
auth-client-config -t nss -p ldap_example
</pre>
</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.
Het resultaat is dat nsswitch.conf zowel in files (/etc/passwd etc.) zoekt als in ldap.
===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>
<pre>
#Load the syncprov module.
# /etc/nsswitch.conf
dn: cn=module{0},cn=config
#
changetype: modify
# Example configuration of GNU Name Service Switch functionality.
add: olcModuleLoad
# If you have the `glibc-doc-reference' and `info' packages installed, try:
olcModuleLoad: syncprov
# `info libc "Name Service Switch"' for information about this file.
 
# pre_auth-client-config # passwd:        compat
passwd: files ldap
# pre_auth-client-config # group:          compat
group: files ldap
# pre_auth-client-config # shadow:        compat
shadow: files ldap
 
hosts:          files dns
networks:      files
 
protocols:      db files
services:       db files
ethers:         db files
rpc:           db files


# syncrepl specific indices
# pre_auth-client-config # netgroup:       nis
dn: olcDatabase={1}hdb,cn=config
netgroup: nis
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>
</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.
Het aanpassen van de PAM bestanden gaat sinds enige releases met '''pam-auth-update'''. Kies in het menu voor zowel unix als ldap. Default wordt nu ldap authenticatie gebruikt voor uid >= 1000. Bij Hobbynet willen we vanaf 300 ldap gebruiken. Door een licht gemodificeerde versie van /usr/share/pam-configs/ldap te maken (ldap-hobbynet), kan ook voor de hobbynet instelling gekozen worden. Dit is de ldap-hobbynet versie:
===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>
<pre>
dn: cn=module{0},cn=config
Name: LDAP Authentication (uid>300)
changetype: modify
Default: yes
add: olcModuleLoad
Priority: 128
olcModuleLoad: syncprov
Auth-Type: Primary
Auth-Initial:
        [success=end default=ignore]    pam_ldap.so minimum_uid=300
Auth:
        [success=end default=ignore]    pam_ldap.so minimum_uid=300 use_first_pass
Account-Type: Additional
Account:
        [success=ok new_authtok_reqd=done ignore=ignore user_unknown=ignore authinfo_unavail=ignore default=bad]        pam_ldap.so minimum_uid=300
Password-Type: Primary
Password-Initial:
        [success=end default=ignore]    pam_ldap.so minimum_uid=300
Password:
        [success=end default=ignore]    pam_ldap.so minimum_uid=300 try_first_pass
Session-Type: Additional
Session:
        [success=ok default=ignore]    pam_ldap.so minimum_uid=300
</pre>
 
Dit is in een standaard opzet van LDAP voldoende om zowel lokale gebruikers als gebruikers opgeslagen in LDAP, te laten inloggen en hun password te laten wijzigen. In de Hobbynet setup moet er echter nog meer gebeuren in de ACL's van de LDAP server configuratie. Omdat Hobbynet de laatste ACL regel heeft gewijzigd in een '''deny-all''', is er een helper of proxy account nodig dat read access heeft of een aantal cruciale velden in de posixAccount objectClass. Zie verder de lsiting van nslcd.conf.
 
Libnss-ldapd en libpam-ldapd hebben een gezamelijke daemon '''nslcd''' die z'n configuratie uit '''/etc/nslcd.conf''' haalt. Hierin is ook een voorziening voor het helper account. Aan het eind vande '''nslcd.conf''' staat de voorziening voor host-based login. Als het attribute '''host''' de fqdn of alleen de host naam bevat, bepaald dat of inloggen op die host mogelijk is. '''*''' staat inloggen op alle hosts toe.
 
Eventueel kan het daemon proces voor debugging doeleinden ook als command ('''nslcd -d''') gestart worden. Om de bevragingen van de LDAP server wat te verminderen, kan '''nscd''' voor caching zorgen. Deze cache daemon heeft zijn eigen configuratie bestand: '''/etc/nslcd.conf'''. De default instellingen zijn goed; eventueel kan de logging naar een bestand gestuurd worden.
 
Verbinding met de LDAP server kan met StartTLS beveiligd worden. Hier de inhoud van nslcd.conf:
<pre>
# /etc/nslcd.conf
# nslcd configuration file. See nslcd.conf(5)
# for details.
 
# The user and group nslcd should run as.
uid nslcd
gid nslcd
 
# log location and level
#log /var/log/nslcd.log debug
 
# The location at which the LDAP server(s) should be reachable.
uri ldap://ldap2-int.hobby.nl/
 
# The search base that will be used for all queries.
base dc=hcc,dc=nl
 
# Other base mappings
base  group  ou=groups,dc=hcc,dc=nl
base  passwd ou=users,dc=hcc,dc=nl
base  shadow ou=users,dc=hcc,dc=nl
 
# The search scope.
#scope sub
 
# The LDAP protocol version to use.
ldap_version 3
 
# The DN to bind with for normal lookups.
#binddn cn=annonymous,dc=example,dc=net
#bindpw secret
binddn cn=hobbynetlogin,ou=applicaties,dc=hcc,dc=nl
bindpw xxxxxxxxxxxxxxxxx
 
# The DN used for password modifications by root.
#rootpwmoddn cn=admin,dc=example,dc=com


dn: cn=config
# SSL options
changetype: modify
ssl off
replace: olcServerID
ssl start_tls
olcServerID: 1 ldap://ubuntu.vandenbussche.nl
#tls_reqcert never
olcServerID: 2 ldap://ns2.vandenbussche.nl
tls_cacertfile /etc/ssl/certs/cacert.org.pem
#tls_cert /etc/ssl/private/server.crt
#tls_key /etc/ssl/private/server.key


dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
# The minimum uid
changetype: add
nss_min_uid 300
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov


dn: olcDatabase={0}config,cn=config
pam_authz_search (&(objectClass=posixAccount)(uid=$username)(|(host=$hostname)(host=$fqdn)(host=\\*)))
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>
</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:
 
===users en groepen toevoegen===
Hiervoor moet '''ldapscripts''' zijn geïnstalleerd. Dit is het geval op de ldap-lb1 server. Dat levert de volgende extra commando's op:
<pre>
<pre>
dn: olcDatabase={1}hdb,cn=config
ldaprenamemachine
changetype: modify
ldapadduser
add: olcSyncRepl
ldapdeleteuserfromgroup
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
ldapfinger
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
ldapid
-
ldapgid
add: olcMirrorMode
ldapmodifyuser
olcMirrorMode: TRUE
ldaprenameuser
lsldap
ldapaddusertogroup
ldapsetpasswd
ldapinit
ldapaddgroup
ldapdeletegroup
ldapmodifygroup
ldapdeletemachine
ldaprenamegroup
ldapaddmachine
ldapmodifymachine
ldapsetprimarygroup
ldapdeleteuser
</pre>
Meest gebruikt zijn '''ldapaddgroup, ldapadduser, ldapsetpasswd'''. 
Er zijn manpages maar er is ook uitgebreide uitleg in de [https://help.ubuntu.com/14.04/serverguide/openldap-server.html Ubuntu server guide]. Omdat wij het automatisch maken van de home dir uit hebben staan, moet die met de hand aangemaakt worden en moet de owner goed gezet worden.
 
===host-based login===
Met een kleine uitbreiding in het schema van de LDAP server, kan host-based login gerealiseerd worden. Ook in de '''nslcd.conf''' is een uitbreiding nodig.
 
In de LDAP server dient de objectClass '''hostObject''' aan de entries in de ou=users toegevoegd te worden. Deze (auxilary) objectClass brengt slechts één attribute met zich mee: '''host'''. De regel in nslcd.conf checkt of één van de waarden van '''host''' gelijk is aan de naam van de server waarop ingelogd wordt. De waarde '''*''' geldt als wildcard. Zie de regel ''
'pam_authz_search'''' in '''nslcd.conf'''.
 
===Password aanpassen===
Via LDAP ingelogde gebruikers kunnen net als lokale gebruikers hun wachtwoord met '''passwd''' wijzigen. Wel moet aan de eisen in de LDAP ppolicy module voldaan worden.
 
==PHP scripting==
Initieel worden alle leden op basis van hun hcc lidnummer ingelezen. Zodra de profielwizard doorlopen is, zal het lidnummer vervangen moeten worden door de gebruikersnaam. Er zijn verschillende php-scripts gemaakt, o.a. om snel alle kaderrollen te verwijderen. Php-scripts staan in de '''/usr/local/hobbynet/bin''' directory.
Voor de php-scripting zijn enkele php7.x pakketten nodig. Installeer deze met apt-get. Het gaat om:
* php-cli
* php-ldap
 
== Apache authenticatie via LDAP ==
In plaats van .htpassword authenticatie, kan ook LDAP gebruikt worden. Activeer daartoe de Apache module
'authnz_ldap'.
a2enmod authnz_ldap
Denk er om dat dit in een loadbalanced situatie op beide servers gedaan dient te worden!


dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
=== Voorbeeld van een LDAP configuratie in de Apache config ===
changetype: add
(alleen als voorbeeld, niet zo gebruiken!)<br>
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
<pre>
changetype: add
# // 1) Hobbynet webmaster
objectClass: olcOverlayConfig
# // 2) Vraagbaak medewerker van een willekeurige groepering
objectClass: olcSyncProvConfig
# (|(hccRol=*#VRBK)(hccRol=HN#WM))
olcOverlay: syncprov
  <Location "/apps/vraagbaak">
    <RequireAll>
      Authname "HCC!vraagbaak (gebruik uw hcc.nl gebruikersnaam/wachtwoord)"
      AuthType Basic
      AuthBasicProvider ldap
      AuthLDAPUrl ldap://hcc-ldap-int.hobby.nl/ou=leden,dc=hcc,dc=nl?hccLogin??(|(hccRol=*#VRBK)(hccRol=HN#WM))(hccProfiel=TRUE) TLS
      require valid-user
    </RequireAll>
  </Location>
</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.
 
=== Hoe kan LDAP veilig gebruikt worden vanuit Apache===
Zet een script neer in de gebruikersomgeving, en gebruik mod_authz_external. Doe de controle vervolgens via de XML-RPC server.<br>
 
'''Zie [[Kadernet]] voor een voorbeeld.'''
 
== TODO lijst ==
''Dit is een lijst in wording, graag aanvullen''
* 'dun' loadbalancer script maken om te controleren dat LDAP echt luistert

Latest revision as of 11:48, 7 June 2022

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 alles opgeslagen wat nodig is voor het functioneren van de site, inclusief NAW gegevens.

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 (ldap-lb1 en ldap-lb2) die achter een loadbalancer in preferred server mode staan 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.

Tevens zijn er een test en een development server: ldap-test en ldap-dev.

Installatie

Installatie van OpenLDAP is simpel:

aptitude install slapd ldap-utils

Omdat er gebruikgemaakt wordt van php scripts, is het ook nodig php-cli en php-ldap te installeren. 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 "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 volgende pakketten dienen geïnstalleerd te zijn ('php -m' toont de geactiveerde modules):

Mogelijk ontbrekende pakketten:

apt-get install aptitude 
apt-get install php-mbstring
apt-get install php-xmlrpc
apt-get install php-ldap
apt-get install ldapscripts
apt-get install php-xml
apt-get install slapd
apt-get install ldap-utils

- openldap moet lid zijn van de groep ssl-cert!
apt-get install ssl-cert
adduser openldap ssl-cert
(of vi /etc/group
    ssl-cert:x:116:openldap)

- Zorg dat de LDAP daemon bij de certificaten kan komen. 
LET OP: op alle hobbynet servers staan de certificaten in /disk/site/etc/ssl/hobby.nl/
 chgrp ssl-cert /disk/site/etc/ssl/hobby.nl/hobby.nl.*
 chmod 440      /disk/site/etc/ssl/hobby.nl/hobby.nl.key
LET OP: Als apparmor geïnstalleerd is moet het pad naar de certificaten vrijgegeven worden. Als alternatief kan apparmor verwijderd worden.

Het volgende is niet nodig voor ldap. Mischien voor mysql-server???
- mysql laat het bestand ibdata1 ongelimiteerd groeien (InnoDB bestanden)
 /etc/mysql/mysql.conf.d/innodb_file_per_table.cnf
 [mysql]
 innodb_file_per_table

Nog meer Hobbynet aanpassingen Waarom??? 
/etc/bash.bashrc
export http_proxy=http://squid-int.hobby.nl:3128
export https_proxy=http://squid-int.hobby.nl:3128
export ftp_proxy=http://squid-int.hobby.nl:3128

Locatie bestanden

Om de benodigde bestanden op de server te krijgen zal scp gebruikt moet worden. Upload alles in een privé subdirectory. Copiëer daarna alles naar de juiste plaats en verander de owner in root.

  • Alle ldif em tmpl bestanden gaan naar /usr/local/hobbynet/lib
  • init_ldap en andere scripts gaan naar /usr/local/hobbynet/bin
  • alle data bestanden (dumps) en update ldifs gaan naar /usr/local/hobbynet/data
  • /usr/local/hobbynet/etc/ldap/schema/hcc_schema.* gaan naar /etc/ldap/schema
  • /usr/local/hobbynet/etc/ldap/schema/ppolicy.ldif gaat naar /etc/ldap/schema
  • /usr/local/hobbynet/etc/ldap/schema/ldapns.ldif gaat naar /etc/ldap/schema

Ldapns en ppolicy moeten eventueel van een oudere release bewaard blijven! Waarom ze weg in 22.04 zijn is onduidelijk. hcc_schema.ldif wordt middels een script gemaakt. Dit script plaatst de ldif bestand(en) in /etc/ldap/schema. Zie de README en actuele scripts.

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. Wordt echter init_ldap.sh <admin-pw> gebruikt dan wordt een werkende directory gemaakt met alle statische data (in diverse ou's) erin. Gebruik na het maken van de initiële database restore_ldap.sh om de database te vullen met de data uit de data directory.

slapd.init.ldif

Bij installatie en reconfiguratie wordt /usr/share/slapd/slapd.init.ldif ingelezen. Zie aldaar indien nodig. Er wordt zowel voor de cn=config als voor de dc=hcc,dc=nl een RootDN aangemaakt. Echter wordt er geen password gezet op de RootDN voor config.

init_ldap script

Het lokale script init-ldap doet een reset van de initiële Openldap configuratie. Dit heeft tot gevolg dat de DIT dc=hcc,dc=nl met een rootDN cn=admin,dc=hcc,dc=nl steeds opnieuw aangemaakt wordt. Alles wat we toegevoegd/gewijzigd willen hebben in de cn=config volgt daarna. Dit wordt afgesloten met een restart van de slapd server. Het script restore_ldap laadt vervolgens de laatste dump terug. Bij wijzigingen aan het schema is het raadzaam altijd een dump_ldap te doen zodat een later een actuele dump kan worden teruggeladen.

Het (plain text) password van cn=admin,dc=hcc,dc=nl moet bij het aanroepen van init_ldap op de commandline worden meegegeven. Tijdens de dpkg-reconfigure moet het password nog 2x gegeven worden. Lees eventueel ook de OpenLDAP Admin Guide.

Het init_ldap script bevat allerlei logica om op meerdere ldap servers gedraaid te kunnen worden. In grote lijnen valt het script in een aantal blokken uiteen:

  • voorbereidingen om "dpkg-reconfigure slapd" te draaien
  • definities van input files
  • check host
  • bouwen van het skelet van de nieuwe directory

Zie voor details van de scripts init_ldap, dump_ldap en restore_ldap op een van de servers (in /usr/local/hobbynet/bin).

onderdelen van init_ldap

Init_ldap is opgezet om stap voor stap de database op te bouwen. Hieronder een beschrijving van de losse ldif bestanden die ingelezen worden. Incidenteel wordt een ldif gewijzigd; kijk altijd in de actuele bestanden!

add-schema.ldif

Omdat wij een aantal eigen attributes en Objectclasses hebben toegevoegd aam het schema, moeten deze aan OpenLDAP worden toegevoegd. Het schema moet nog worden omgezet naar ldif format.

  • Hiertoe wordt het onderstaande schema in /etc/ldap/schema geplaatst als hcc_schema.schema.
  • Vervolgens worden de stappen uitgevoerd zoals beschreven in de Ubuntu Server guide, onder Modifying the slapd Configuration Database.
  • De resulterende output file cn=hcc_schema.ldif moet dan nog naar /etc/ldap/schema/hcc_schema.ldif gecopieerd worden.

Als dit proces herhaald moet worden, start dan met een lege output directory en verwijder een eventueel achtergebleven cn=hcc_schema.ldif bestand.

De extra schema's worden middels een include toegevoegd. Ppolicy is op gelijke wijze als hcc_schema tot .ldif geconverteerd. Alle stappen om een nieuwe hcc-schema.ldif te maken zijn gescript in upd_schema. In init_ldap wordt het eigen schema en de password policy geladen:

#
# file: add-schema.ldif
# date: vbs20200415
# date: vbs20220511 ppolicy not included to get
#       of duplicate message
#
include: file:///etc/ldap/schema/hcc_schema.ldif
#include: file:///etc/ldap/schema/ppolicy.ldif
include: file:///etc/ldap/schema/ldapns.ldif

schema updates

Soms wordt een attribute toegevoegd of gewijzigd. Hiertoe dient het bestand hcc_schema.schema in /usr/local/hobbynet/etc/ldap/schema, gewijzigd te worden. Daarna dient er een ldif versie van gemaakt te worden. Gebruik hiervoor upd_schema.sh in dezelfde directory. De resulterende hcc_schema.ldif wordt in dit script naar /etc/ldap/schema gecopieërd. Bij grote wijzigingen is het aan te bevelen door de hele rebuild cycle te gaan (dump, init, restore). Bij triviale aanpassingen zou hcc_schema.ldif ook direct in de actieve directory geplaatst kunnen worden, gevolgd door slechts een service slapd restart. Gebruik hiervoor (blijf in de lokale schema directory):

cp "ldif_output/cn=config/cn=schema/cn={14}hcc_schema.ldif" "/etc/ldap/slapd.d/cn=config/cn=schema/cn={4}hcc_schema.ldif"

LET OP: De nummers tussen accolades zijn bepaald door de volgorde van andere scripts! Zolang geen andere schema's worden toegevoegd zullen ze niet veranderen.
Ook kan met de ldap-tools gewerkt worden. Gebruik ldapsearch en ldapmodify, eventueel met de -f optie om een voorbereide serie opdrachten uit te voeren. Gebruik ldapsearch om eerst de structuur te vinden:

$ sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn={4}hcc_schema,cn=schema,cn=config

Hier een voorbeeld om een objectClass aan te passen:

$ cat pas_aan.ldif
dn: cn={4}hcc_schema,cn=schema,cn=config
changetype: modify
delete: olcObjectClasses
olcObjectClasses: {7}( 1.3.6.1.4.1.12795.2.8 NAME 'hccRelatieNaam' \
   DESC 'Naam van een klant of partner' SUP top STRUCTURAL MUST ( cn $userPassword )
MAY ( hccXmlIp4 $ hccXmlIp6 $ hccXmlAllow $ description ) )
-
add: olcObjectClasses
olcObjectClasses: {7}( 1.3.6.1.4.1.12795.2.8 NAME 'hccRelatieNaam' \
   DESC 'Naam van een klant of partner' SUP top STRUCTURAL MUST ( cn $userPassword )
MAY ( hccXmlIp4 $ hccXmlIp6 $ hccXmlAllow $ description $ hccIg ) )
-

$sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f pas_aan.ldif 

modify_config.ldif

Dit template dient om de SSL/TLS instelling toe te voegen in de ldap configuratie. Toegevoegd worden de certificaat gegevens om met TLS te kunnen werken. Het loglevel wordt op STATS gezet. Dit geeft niet teveel logging maar is toch goed bruikbaar. Om extra logging te krijgen op b.v. ACL's, verander olcLogLevel dan in "stats ACL".

#
# file: modify-config.ldif
# date: vbs20200415
#
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /disk/site/etc/ssl/hobby.nl/CA-bundel.crt
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /disk/site/etc/ssl/hobby.nl/hobby.nl.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /disk/site/etc/ssl/hobby.nl/hobby.nl.key
-
add: olcPasswordHash
olcPasswordHash: {CRYPT}
-
add: olcPasswordCryptSaltFormat
olcPasswordCryptSaltFormat: $6$%.16s
-
replace: olcLogLevel
olcLogLevel: stats

Om de logging in een apart bestand te krijgen moet in /etc/rsyslog.d een extra bestand openldap.conf geplaatst worden.

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

Tevens willen we logrotate op dit bestand. Plaats in /etc/logrotate.d het bestand openldap met de volgende inhoud

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

modify-mdb.ldif

Hier worden de wijzigingen op de backend db gemaakt.

#
# file: modify-mdb.ldif
# date: vbs20200415
# hjv 2020.06.07 (oldSizeLimit toegevoegd)
#
dn: olcDatabase={1}mdb,cn=config
replace: olcDbCheckpoint
olcDbCheckpoint: 4096 1
-
replace: olcDbNoSync
olcDbNoSync: TRUE
-
replace: olcSizeLimit
olcSizeLimit: 100000

modify-acl.ldif

Hier worden de rechten bepaald van de diverse rollen en groepen

#
# file: modify-acl.ldif
# date: vbs20200415
#
dn: olcDatabase={1}mdb,cn=config
replace: olcAccess
# hobbynetlogin heeft lees rechten t.b.v. MySecureShell aanloggen
olcAccess: to attrs=@posixAccount,@posixGroup,@shadowAccount,@hostObject
  by dn="cn=hobbynetlogin,ou=applicaties,dc=hcc,dc=nl" read
  by * break
#
olcAccess: to attrs=@posixAccount
  by anonymous read
  by * break
#
# sta anonymous search toe (t.b.v. Apache authenticatie)
olcAccess: to attrs=hccLogin,hccRol,hccProfiel,entry
  by anonymous read
  by * break
#
# olcAccess: to attrs=hccOptIn
#   by self write
#   by dn="cn=drupal-hcc-nl,ou=klanten,dc=hcc,dc=nl" write
#   by * break
#
# Anonieme klanten moeten kunnen inloggen
# en mogen hun eigen password wijzigen
olcAccess: to attrs=userPassword,shadowLastChange
  by self write
  by anonymous auth
  by * break
#
# Gebruiker mag zijn kader email wachtwoord aanpassen
olcAccess: to attrs=hccKaderPassword,hccKaderForward
  by self write
  by * break
#
# beheerders hebben schrijfrechten op alles (updateDN)
# klanten hebben alleen lees rechten op alles (readDN)
# self mag lezen
olcAccess: to *
  by self read
  by dn="cn=xml-hoge-rechten,ou=applicaties,dc=hcc,dc=nl" write
  by dn="cn=xml-lage-rechten,ou=applicaties,dc=hcc,dc=nl" read
  by dn.one="ou=beheer,dc=hcc,dc=nl" write
  by dn.one="ou=klanten,dc=hcc,dc=nl" read
  by * break
#
# PC30 helpdesk heeft leesrechten op ou=leden
olcAccess: to attrs=@hccOrgPerson,@hccKaderFunctie
  by dn.one="ou=helpdesk,dc=hcc,dc=nl" read
  by * break
#
# partners mogen een paar attrs lezen
olcAccess: to attrs=hccLidNummer,hccPostcode,hccPostcodeZoekveld,hccIg
  by dn.one="ou=partners,dc=hcc,dc=nl" read
  by * break
#
# iedereen moet (pseudo attr) entry en objectClass kunnen lezen
olcAccess: to attrs=entry,objectClass
  by * read
#
olcAccess: to *
  by * none

modify_index.ldif

Een kale configuratie is heel snel voor wat betreft het opnieuw vullen met gegevens. Bij het aanmaken van een verse LDAP database worden er dan ook zo min mogelijk indexen aangemaakt.
Zodra de inhoud is ingelezen kunnen de 'echte' indexen aangemaakt worden.

#
# file: modify-index.ldif
# date: vbs20200415
#
dn: olcDatabase={1}mdb,cn=config
replace: olcDbIndex
olcDbIndex: default pres,eq
olcDbIndex: objectClass,entryUUID,entryCSN eq
olcDbIndex: hccLidNummer,hccLogin,hccForumLogin eq
olcDbIndex: uid,uidNumber,gidNumber,memberUid,member eq
olcDbIndex: cn,host,hccPseudoniem,hccOptin,hccLocatie eq
olcDbIndex: sn,hccPostcodeZoekveld,hccIg,hccRegio eq,subfinal
olcDbIndex: hccRol,hccBezoek eq,pres,subfinal
olcDbIndex: hccBulletins pres
olcDbIndex: aboNummer eq
olcDbIndex: aboPostcodeZoekveld eq,subfinal
olcDbIndex: mail,mailHccnet,hccKaderMail,hccKaderForward pres,eq
olcDbIndex: hccProfiel pres,eq
olcDbindex: hccKaderUniekeURL eq
olcDbindex: hccOnderwerp eq,subfinal

ppolicy overlay

  • vanuit LDAP de minimale lengte van een wachtwoord afdwingen
  • in LDAP SSHA versleuteling activeren

(olcPPolicyHashCleartext: TRUE)

#
# file: add-ppolicy.ldif
# date: vbs20200415
#
dn: cn=module, cn=config
cn: module
objectClass: olcModuleList
objectClass: top
olcModuleLoad: ppolicy
olcmodulepath: /usr/lib/ldap

dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=policies,dc=hcc,dc=nl
olcPPolicyUseLockout: TRUE
olcPPolicyHashCleartext: TRUE

The default ppolicy looks like this:

dn: cn=default,ou=policies,dc=hcc,dc=nl
objectClass: pwdPolicy
objectClass: device
cn: default
pwdCheckQuality: 1
pwdMinLength: 8
pwdAttribute: 2.5.4.35
pwdAllowUserChange: TRUE

Syncrepl overlay

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. Wij gebruiken de z.g. Mirror Mode. Zie de LDAP Admin Guide. Mirror configuratie is specifiek per server!

#######################################
## add-syncrepl.tmpl                 ##
#######################################
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: @SID@

dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov

dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 5
olcSpSessionlog: 100

dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=@RID@
  provider=ldap://@PROVIDER@
  binddn="cn=admin,dc=hcc,dc=nl" bindmethod=simple credentials="@PASSWORD@"
  searchbase="dc=hcc,dc=nl"
  type=refreshAndPersist
  interval=00:00:00:10
  retry="5 5 300 5"
  timeout=1
  starttls=yes
-
add: olcMirrorMode
olcMirrorMode: TRUE

De andere server krijgt ServerID 2 en de provider is het IP adres van de andere server.

Unique overlay

Deze overlay dient er voor te zorgen dat o.a het attribuut hccLogin een unieke waarde bevat.

#######################################
## add-unique.ldif                   ##
#######################################
dn: cn=module,cn=config
cn: module
objectclass: olcModuleList
objectclass: top
olcmoduleload: unique
olcmodulepath: /usr/lib/ldap

dn: olcOverlay=unique,olcDatabase={1}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcUniqueConfig
olcOverlay: unique
olcUniqueAttribute: uid uidNumber hccLogin

SSL/TLS beveiliging

Gebruik de juiste .pem bestanden in /etc/ssl/certs en /etc/ssl/private.

We maken gebruik van een RapidSSL certificaat. Als dit niet standaard in Ubuntu bekend is, zet dan eerst GeoTrust_RapidSSL_-_ca-bundle.pem in de map /etc/ssl/certs neer. Voer nu een c_rehash . uit in /etc/ssl/certs om de cache te updaten (omdat GeoTrust_RapidSSL_-_ca-bundle.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/hobby.nl.*
chmod 440      /etc/ssl/private/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 hobby.nl.crt
-r--r----- 1 root     ssl-cert 1679 Nov 22 20:25 hobby.nl.key
root@hcc-ldap-lb1:~# grep openldap /etc/group
ssl-cert:x:114:openldap
openldap:x:118:

2020.12.09: Op een nieuwe Ubuntu installatie staat apparmor standaard aan. Weg ermee!

apt remove --assume-yes --purge apparmor

Per september 2017 staan de certificaten in /disk/site/etc/ssl/hobby.nl, net als op alle andere servers. Omdat apparmor actief is moet deze directory worden toegevoegd aan /etc/apparmor.d/local/usr.sbin.slapd. Die file ziet er dan als volgt uit:

# Site-specific additions and overrides for usr.sbin.slapd.
# For more details, please see /etc/apparmor.d/local/README.
#include <abstractions/ssl_certs>
/disk/site/etc/ssl/hobby.nl/ r,
/disk/site/etc/ssl/hobby.nl/* r,

Als Openldap ook op poort 636 benaderd wordt (naast TLS op 389), moet in /etc/default/slapd ldaps:/// opgenomen worden bij de SLAPD_SERVICES.
'netstat -an' dient dan 636 te laten zien voor zowel IPv4 als IPv6.

Om de cn=config te zien kan je het volgende commando gebruiken:

ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config

of, wat botter maar korter:
cat /etc/ldap/slapd.d/cn\=config.ldif

Backup, initialize, restore

Om het hele skelet van ldap in één keer te herstellen dient init_ldap gebruikt te worden. Als argument moet het admin beheer wachtwoord mee gegeven worden.

lokaal

Backups kunnen gemaakt worden terwijl slapd draait maar geadviseerd wordt slapd te stoppen. Voor dumpen moet slapcat gebruikt worden. Backups kunnen gemaakt worden per database of een filter daarop, 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, hdb is gewoonlijk 1.

Het dump_ldap script dumpt alle ou's in aparte .ldif bestanden; het omgekeerde doet restore_ldap. Terug inlezen kan alleen in een lege directory, dus direct nadat init_ldap is gedaan. Gebruik voor het terugplaatsen slapadd. Aan te bevelen is -c mee te geven zodat ondanks fouten doorgegaan wordt.

Voor slapadd moet slapd gestopt zijn. Denk er om alvorens te slapd starten het ownership van de bestanden in /var/lib/ldap recht te zetten! (dit lijkt niet meer nodig te zijn vbs20130526)

/etc/init.d/slapd stop
slapadd -l hcc-dump.ldif -w -c >errors.txt
chown openldap:openldap /var/lib/ldap/*
/etc/init.d/slapd start

remote

Er wordt dagelijks een encrypted remote backup gemaakt naar backup2bit. Zie voor meer info Encrypted_backup. Dit script maakt gebruik van unieke gpg keys. Op elke server is dus een eigen versie nodig van backup-encrypted.
Recente lokale backups zijn te vinden in /usr/local/hobbynet/tmp.

Verse ldap maken

Transactie log bij het toevoegen van b.v. een nieuwe ou:

Op beide servers:
schema van test server gecopieerd en geactiveerd
dump-ldap gedraaid
systemctl stop slapd.service 

Er is nu géén ldap service! Werk dus snel...

op ldap-lb1:
init-ldap.sh <adminpw>
restore-ldap.sh
wacht op indexering (tot slapd uit top verdwijnt)
Slapd service is nu in de lucht op ldap-lb1
systemctl stop slapd.service


op ldap-lb2:
init-ldap.sh <adminpw>
restore-ldap.sh
wacht op indexering (tot slapd uit top verdwijnt)
Slapd service is nu in de lucht op ldap-lb2

op ldap-lb1:
systemctl start slapd.service
Beide slapd servers zijn in de lucht en moeten synchroniseren.

op beide servers:
check replicatie (netstat en functioneel)

root@ldap-lb1:/usr/local/hobbynet/bin# netstat -n | grep 389
tcp6       0      0 2a02:968:ffff:910:172:31:8:5:49510 2a02:968:ffff:910:172:31:8:4:389 ESTABLISHED
tcp6       0      0 2a02:968:ffff:910:172:31:8:5:389 2a02:968:ffff:910:172:31:8:4:37490 ESTABLISHED
tcp6       0      0 2a02:968:ffff:910:172:31:8:5:49508 2a02:968:ffff:910:172:31:8:4:389 ESTABLISHED
tcp6       0      0 2a02:968:ffff:910:172:31:8:5:389 2a02:968:ffff:910:172:31:8:4:37488 ESTABLISHED



Functioneel door met ADS op beide servers in te loggen en een willekeurig veld in je eigen entry te wijzigen op lb1. Kijk of het gebeurd is op lb2 en wijzig het daar terug. Check op de andere server of het gebeurd is. Er kan een zekere vertraging in optreden.

Stel er is een nieuwe ou gemaakt: denk aan het bij werken van de dump en restore scripts.

update dump-ldap.sh en restore-ldap.sh met de nieuwe ou

op ldap-lb1:
export tarieven.ldif op test server en import op ldap-lb1

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

LDAP Clients

Er zijn meerdere LDAP clients. De meest populaire zijn Apache Directory Studio ("ADS") en phpLdapAdmin ("PLA").
De eerste is veel uitgbreider maar vereist een Java Runtime Environment ("JRE"). Onder Windows is dat JRE(13) of (open)JDK-(13).
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.

Binnen Hobbynet wordt uitsluitend gebruik gemaakt van ADS.

StartTLS

Aanbevolen wordt StartTLS op poort 389 te gebruiken. Alternatief is LDAPS op poort 636 maar dat is deprecated.

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

2019-10-31 HJV: Oude info, als referentie leuk, maar niet meer relevant
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:

Haal de benodigde bestanden op (op een Linux systeem):
wget http://www.cacert.org/certs/root.der -O root.der
wget http://www.cacert.org/certs/class3.der -O class3.der
copieer de bestanden naar de Windows omgeving in C:\Program Files (x86)\Java\jre6\lib\security.

Open een commandwindow:
cd C:\Program Files (x86)\Java\jre6\lib\security
..\..\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 laat zich uit een tarball installeren. Dit kan geheel in userspace; er is geen make install o.i.d. nodig. ADS loopt vanuit de lokatie waar het uitgepakt is.

ADS gebruik

ADS kan erg handig zijn voor het snel dumpen van hele ou's in .ldif formaat. Zo'n dump kan direct op een andere server worden ingelezen.

PhpLdapAdmin 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/hobby.nl.crt
TLS_KEY         /etc/ssl/private/hobby.nl.key
TLS_REQCERT     allow
#TLS_REQCERT never

Denk er wel aan na wijzigingen Apache te herstarten.

PAM en NSS via LDAP

Het inloggen van gebruikers kan ook via een LDAP server en client geschieden. Hiervoor dienen enkele pakketten geïnstalleerd en geconfigureerd te worden. Er zijn wijzigingen nodig in /etc/nsswitch.conf en de /etc/pam.d/common-* bestanden. Beide zijn via dedicated tools aan te passen.

Installeer libnss-ldapd om de benodigde libraries te verkrijgen. Apt-get zal tevens libpam-ldapd, nslcd en nscd binnen brengen.

apt-get install libnss-ldapd auth-client-config ldap-utils
The following extra packages will be installed:
    libpam-ldapd nscd nslcd

Libnss-ldapd is een doorontwikkeling van libnss-ldap en bevat meerdere verbeteringen. Zie: deze site van de ontwikkelaar. Bij de installatie wordt een user nslcd aangemaakt; denk erom die in de .tmpl bestanden te zetten!

nsswitch.conf laat zich configureren via auth-client-config maar lac_ldap is alleen aanwezig als ldap-auth-config ook is geinstalleerd. Zo niet gebruik dan de tweede regel:

auth-client-config -t nss -p lac_ldap
auth-client-config -t nss -p ldap_example

Het resultaat is dat nsswitch.conf zowel in files (/etc/passwd etc.) zoekt als in ldap.

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

# pre_auth-client-config # passwd:         compat
passwd: files ldap
# pre_auth-client-config # group:          compat
group: files ldap
# pre_auth-client-config # shadow:         compat
shadow: files ldap

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

# pre_auth-client-config # netgroup:       nis
netgroup: nis

Het aanpassen van de PAM bestanden gaat sinds enige releases met pam-auth-update. Kies in het menu voor zowel unix als ldap. Default wordt nu ldap authenticatie gebruikt voor uid >= 1000. Bij Hobbynet willen we vanaf 300 ldap gebruiken. Door een licht gemodificeerde versie van /usr/share/pam-configs/ldap te maken (ldap-hobbynet), kan ook voor de hobbynet instelling gekozen worden. Dit is de ldap-hobbynet versie:

Name: LDAP Authentication (uid>300)
Default: yes
Priority: 128
Auth-Type: Primary
Auth-Initial:
        [success=end default=ignore]    pam_ldap.so minimum_uid=300
Auth:
        [success=end default=ignore]    pam_ldap.so minimum_uid=300 use_first_pass
Account-Type: Additional
Account:
        [success=ok new_authtok_reqd=done ignore=ignore user_unknown=ignore authinfo_unavail=ignore default=bad]        pam_ldap.so minimum_uid=300
Password-Type: Primary
Password-Initial:
        [success=end default=ignore]    pam_ldap.so minimum_uid=300
Password:
        [success=end default=ignore]    pam_ldap.so minimum_uid=300 try_first_pass
Session-Type: Additional
Session:
        [success=ok default=ignore]     pam_ldap.so minimum_uid=300

Dit is in een standaard opzet van LDAP voldoende om zowel lokale gebruikers als gebruikers opgeslagen in LDAP, te laten inloggen en hun password te laten wijzigen. In de Hobbynet setup moet er echter nog meer gebeuren in de ACL's van de LDAP server configuratie. Omdat Hobbynet de laatste ACL regel heeft gewijzigd in een deny-all, is er een helper of proxy account nodig dat read access heeft of een aantal cruciale velden in de posixAccount objectClass. Zie verder de lsiting van nslcd.conf.

Libnss-ldapd en libpam-ldapd hebben een gezamelijke daemon nslcd die z'n configuratie uit /etc/nslcd.conf haalt. Hierin is ook een voorziening voor het helper account. Aan het eind vande nslcd.conf staat de voorziening voor host-based login. Als het attribute host de fqdn of alleen de host naam bevat, bepaald dat of inloggen op die host mogelijk is. * staat inloggen op alle hosts toe.

Eventueel kan het daemon proces voor debugging doeleinden ook als command (nslcd -d) gestart worden. Om de bevragingen van de LDAP server wat te verminderen, kan nscd voor caching zorgen. Deze cache daemon heeft zijn eigen configuratie bestand: /etc/nslcd.conf. De default instellingen zijn goed; eventueel kan de logging naar een bestand gestuurd worden.

Verbinding met de LDAP server kan met StartTLS beveiligd worden. Hier de inhoud van nslcd.conf:

# /etc/nslcd.conf
# nslcd configuration file. See nslcd.conf(5)
# for details.

# The user and group nslcd should run as.
uid nslcd
gid nslcd

# log location and level
#log /var/log/nslcd.log debug

# The location at which the LDAP server(s) should be reachable.
uri ldap://ldap2-int.hobby.nl/

# The search base that will be used for all queries.
base dc=hcc,dc=nl

# Other base mappings
base   group  ou=groups,dc=hcc,dc=nl
base   passwd ou=users,dc=hcc,dc=nl
base   shadow ou=users,dc=hcc,dc=nl

# The search scope.
#scope sub

# The LDAP protocol version to use.
ldap_version 3

# The DN to bind with for normal lookups.
#binddn cn=annonymous,dc=example,dc=net
#bindpw secret
binddn cn=hobbynetlogin,ou=applicaties,dc=hcc,dc=nl
bindpw xxxxxxxxxxxxxxxxx

# The DN used for password modifications by root.
#rootpwmoddn cn=admin,dc=example,dc=com

# SSL options
ssl off
ssl start_tls
#tls_reqcert never
tls_cacertfile /etc/ssl/certs/cacert.org.pem
#tls_cert /etc/ssl/private/server.crt
#tls_key /etc/ssl/private/server.key

# The minimum uid
nss_min_uid 300

pam_authz_search (&(objectClass=posixAccount)(uid=$username)(|(host=$hostname)(host=$fqdn)(host=\\*)))

users en groepen toevoegen

Hiervoor moet ldapscripts zijn geïnstalleerd. Dit is het geval op de ldap-lb1 server. Dat levert de volgende extra commando's op:

ldaprenamemachine
ldapadduser
ldapdeleteuserfromgroup
ldapfinger
ldapid
ldapgid
ldapmodifyuser
ldaprenameuser
lsldap
ldapaddusertogroup
ldapsetpasswd
ldapinit
ldapaddgroup
ldapdeletegroup
ldapmodifygroup
ldapdeletemachine
ldaprenamegroup
ldapaddmachine
ldapmodifymachine
ldapsetprimarygroup
ldapdeleteuser

Meest gebruikt zijn ldapaddgroup, ldapadduser, ldapsetpasswd. Er zijn manpages maar er is ook uitgebreide uitleg in de Ubuntu server guide. Omdat wij het automatisch maken van de home dir uit hebben staan, moet die met de hand aangemaakt worden en moet de owner goed gezet worden.

host-based login

Met een kleine uitbreiding in het schema van de LDAP server, kan host-based login gerealiseerd worden. Ook in de nslcd.conf is een uitbreiding nodig.

In de LDAP server dient de objectClass hostObject aan de entries in de ou=users toegevoegd te worden. Deze (auxilary) objectClass brengt slechts één attribute met zich mee: host. De regel in nslcd.conf checkt of één van de waarden van host gelijk is aan de naam van de server waarop ingelogd wordt. De waarde * geldt als wildcard. Zie de regel 'pam_authz_search' in nslcd.conf.

Password aanpassen

Via LDAP ingelogde gebruikers kunnen net als lokale gebruikers hun wachtwoord met passwd wijzigen. Wel moet aan de eisen in de LDAP ppolicy module voldaan worden.

PHP scripting

Initieel worden alle leden op basis van hun hcc lidnummer ingelezen. Zodra de profielwizard doorlopen is, zal het lidnummer vervangen moeten worden door de gebruikersnaam. Er zijn verschillende php-scripts gemaakt, o.a. om snel alle kaderrollen te verwijderen. Php-scripts staan in de /usr/local/hobbynet/bin directory. Voor de php-scripting zijn enkele php7.x pakketten nodig. Installeer deze met apt-get. Het gaat om:

  • php-cli
  • php-ldap

Apache authenticatie via LDAP

In plaats van .htpassword authenticatie, kan ook LDAP gebruikt worden. Activeer daartoe de Apache module 'authnz_ldap'.

a2enmod authnz_ldap

Denk er om dat dit in een loadbalanced situatie op beide servers gedaan dient te worden!

Voorbeeld van een LDAP configuratie in de Apache config

(alleen als voorbeeld, niet zo gebruiken!)

# // 1) Hobbynet webmaster
# // 2) Vraagbaak medewerker van een willekeurige groepering
# (|(hccRol=*#VRBK)(hccRol=HN#WM))
  <Location "/apps/vraagbaak">
    <RequireAll>
      Authname "HCC!vraagbaak (gebruik uw hcc.nl gebruikersnaam/wachtwoord)"
      AuthType Basic
      AuthBasicProvider ldap
      AuthLDAPUrl ldap://hcc-ldap-int.hobby.nl/ou=leden,dc=hcc,dc=nl?hccLogin??(|(hccRol=*#VRBK)(hccRol=HN#WM))(hccProfiel=TRUE) TLS
      require valid-user
    </RequireAll>
  </Location>

Hoe kan LDAP veilig gebruikt worden vanuit Apache

Zet een script neer in de gebruikersomgeving, en gebruik mod_authz_external. Doe de controle vervolgens via de XML-RPC server.

Zie Kadernet voor een voorbeeld.

TODO lijst

Dit is een lijst in wording, graag aanvullen

  • 'dun' loadbalancer script maken om te controleren dat LDAP echt luistert