OpenLdap
Der folgende Artikel ist noch völlig Alpha und wird demnächst überarbeiet.
1. Installation
- OpenLDAP 2.1.23 aus den Ports installieren, vorher muss das Makefile angepasst werden, so dass alle benoetigten Funktionen des LDAP Servers mit einkompiliert werden.
CONFIGURE_ARGS= --with-threads \
- --with-tls=openssl \
- --with-sasl \
- --with-monitor-module=dynamic \
- --enable-dynamic \
- --enable-crypt \
- --enable-dnsserv \
- --enable-shared \
- --enable-ldap \
- -enable-meta \
- --enable-monitor \
- --enable-rewrite \
- --enable-cache
Wie gewohnt ein "make install clean" in /usr/ports/net/openldap21-server absetzen.
Default Installations Pfad ist /usr/local/etc/openldap.
Dort finden sich die meisten der benoetigten Schemas (Eigentlich sollte es ja Schemata heissen, hat sich aber wohl so eingebuergert). Fuer die hier verwendete Konfiguration, werden allderdings ein paar weitere Schemas benoetigt.
Die Reihenfolge der verwendeten Schemas ist von Bedeutung, da die verwendeten Objektklassen von einander Abhaengig sind.
/usr/local/etc/openldap/schema/core.schema (default) /usr/local/etc/openldap/schema/cosine.schema (default) /usr/local/etc/openldap/schema/inetorgperson.schema (default) /usr/local/etc/openldap/schema/nis.schema (default) /usr/local/etc/openldap/schema/locking.schema /usr/local/etc/openldap/schema/openldap.schema /usr/local/etc/openldap/schema/solaris.schema /usr/local/etc/openldap/schema/DUAConfig.schema
2. Konfigurationdateien
- Die zentrale Konfigurationdatei fuer den LDAP Server heisst slapd.conf und befindet sich in /usr/local/etc/openldap/slapd.conf.
---slapd.conf---
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/misc.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
#include /usr/local/etc/openldap/schema/MailScanner.schema
include /usr/local/etc/openldap/schema/amavisd.schema
include /usr/local/etc/openldap/schema/pilgerer.schema
include /usr/local/etc/openldap/schema/sendmail.schema
# Define global ACLs to disable default read access.
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
# Load dynamic backend modules:
modulepath /usr/local/libexec/openldap
moduleload back_bdb
# moduleload back_ldap
# moduleload back_ldbm
# moduleload back_passwd
# moduleload back_shell
# Sample security restrictions
# Require integrity protection (prevent hijacking)
# Require 112-bit (3DES or better) encryption for updates
# Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64
# Sample access control policy:
# Root DSE: allow anyone to read it
# Subschema (sub)entry DSE: allow anyone to read it
# Other DSEs:
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
# Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
# by self write
# by users read
# by anonymous auth
access to attrs=userPassword
by self write
by * auth
access to *
by * read
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn. (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!
loglevel 256
#######################################################################
# BDB database definitions
#######################################################################
database bdb
suffix "o=pilgerer,c=de"
rootdn "cn=mgmroot,o=pilgerer,c=de"
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw passwordhash
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory /var/db/openldap-data
# Indices to maintain
index objectClass pres,eq
index mail pres,eq
index uid eq
# for LASER schema
index mailLocalAddress pres,eq
index mailRoutingAddress pres,eq
index mailHost pres,eq
# for sendmail.schema
index sendmailMTACluster pres,eq
index sendmailMTAHost pres,eq
index sendmailMTAMapName pres,eq
index sendmailMTAMapValue pres,eq
index sendmailMTAKey pres,eq
index sendmailMTAAliasGrouping pres,eq
index sendmailMTAAliasValue pres,eq
index sendmailMTAClassName pres,eq
index sendmailMTAClassValue pres,eq
# for MailScanner schema
#index mailScannerSite eq
#index mailScannerConfBranch eq
#index mailscannerRuleSetName eq
#index mailscannerFileRuleName eq
# uniq attributes
unique_attributes uidNumber,uid
---slapd.conf--- 2.1) Access Control Lists
- Der Aufbau der ACLs gliedert sich wie folgt:
access to <Beschreibung des Datensatzes>
by <Zugrffsberechtigter> <Berechtigungsart>
Zulaessige Merkmale fuer die Beschreibung des Datensatzen sind:
* dn <dn muster> filter=<ldapfilter> attrs=<liste der attribute>
Merkmale der Zugriffsberechtigten:
dn dn.<style> dnattr=<attribute> group group.<style> peername sockname domain ssf=<wert> transport_ssf=<wert> tls_ssf=<wert> sasl_ssf=<wert>
Zulaessige Styles sind: base, sub(tree), one und children
2.2) TLS Konfiguration
- TLSCertificateFile Aufbewahrungsort des signierten Server Zertifikat des LDAP Servers.
TLSCertificateKeyFile Hier befindet sich das unverschluesselte Zertifikat des LDAP Servers. Diese Datei darf lediglich fuer Root zugaenglich sein.
TLSCACertificateFile Dieses Certificat dient dazu die Clients zu authentifizieren, Client Zertifikate werden mit diesem signiert.
3.) Die Clientkonfigurationsdatei ldap.conf
- Da einige Module mal auf /etc/ldap.conf und mal auf /usr/local/etc/ldap.conf zugreifen, ich aber meine unter /usr/local/etc/openldap/ldap.conf aufbewahre muessen Symlinks gesetzt werden.
ln -s /usr/local/etc/openldap/ldap.conf /etc/ldap.conf ln -s /usr/local/etc/openldap/ldap.conf /etc/ldap.conf
---ldap.conf---
host nibbler BASE o=pilgerer, dc=de
# Wird auf dem Server erstellt und muss auf den Client kopiert werden. TLS_CACERT /usr/local/etc/LocalCA/cacert.pem
uri ldap://nibbler
ssl start_tls rootbinddn cn=admin,dc=pilgerer,dc=de pam_filter objectclass=posixAccount pam_member_attribute memberUid pam_password exop
nss_base_passwd ou=people,dc=pilgerer,dc=de?one nss_base_shadow ou=people,dc=pilgerer,dc=de?one nss_base_group ou=Group,dc=pilgerer,dc=de?one nss_base_hosts ou=Hosts,dc=pilgerer,dc=de?one nss_base_services ou=Services,dc=pilgerer,dc=de?one nss_base_networks ou=Networks,dc=pilgerer,dc=de?one nss_base_protocols ou=Protocols,dc=pilgerer,dc=de?one nss_base_rpc ou=Rpc,dc=pilgerer,dc=de?one nss_base_ethers ou=Ethers,dc=pilgerer,dc=de?one nss_base_netmasks ou=Networks,dc=pilgerer,dc=de?ne nss_base_bootparams ou=Ethers,dc=pilgerer,dc=de?one nss_base_aliases ou=Aliases,dc=pilgerer,dc=de?one nss_base_netgroup ou=Netgroup,dc=pilgerer,dc=de?one
#SIZELIMIT 12 #TIMELIMIT 15 #DEREF never
---ldap.conf---
Neben Servername, LDAP Base und Zertifikat werden hier auch die Schalter fuer die Name Service Switch festgelegt. Um LDAP als vollstaendigen Ersatz fuer NIS verwenden zu koennen, werden die Module pam_ldap und nss_ldap benoetigt. Leider ist die in den Ports befindliche Version von nss_ldap hoffnungslos veraltet und unterstuetzt nur die passwd und group Datenbank Funktionalitaet. Eine neuere Version die alle benoetigten Features enthaelt, ist auf http://padl.com erhaeltlich.
Alle Versuche das Prachtstueck auf FreeBSD zu kompilieren scheiterten.
4.) Den LDAP Server besiedeln
Die Datenstruktur der Daten die in den LDAP Server eingepflegt werden sollen, werden in LDIF Dateien gespeichert, ich werde hier nur die Initiale LDIF vorstellen. Alle anderen koennen mit hilfe der Migration Tools sehr einfach erzeugt werden. Die Migration Tools sind erhaeltlich unter: http://www.padl.com/OSS/MigrationTools.html
Alle ldif Dateien habe ich der Einfachheit halber in /usr/local/etc/openldap/ldif abgelegt.
Um das Kommando ldapadd verwenden zu koennen, muss der LDAP Server gestartet werden.
/etc/rc.d/slapd start
---ldif.init---
# Our base domain object # dn:dc=pilgerer,dc=de objectClass:top objectClass:dcObject objectClass:domain objectClass:nisDomainObject dc: pilgerer nisDomain:pilgerer
# Aliases organizational Unit # # NIS maps covered # # aliases # dn: ou=aliases,dc=pilgerer,dc=de objectClass: top objectClass: organizationalUnit ou: aliases
# Ethers organizational Unit # # NIS maps covered # # bootparams # ethers # dn: ou=ethers,dc=pilgerer,dc=de objectClass: top objectClass: organizationalUnit ou: ethers
# Group organizational Unit # # NIS maps covered # # group # dn: ou=group,dc=pilgerer,dc=de objectClass: top objectClass: organizationalUnit ou: group
# Hosts organizational Unit # # NIS maps covered # # hosts # dn: ou=hosts,dc=pilgerer,dc=de objectClass: top objectClass: organizationalUnit ou: hosts
# Netgroup organizational Unit # # NIS maps covered # # netgroup # dn: ou=netgroup,dc=pilgerer,dc=de objectClass: top objectClass: organizationalUnit ou: netgroup
# Networks organizational Unit # # NIS maps covered # # netmasks # networks # dn: ou=networks,dc=pilgerer,dc=de objectClass: top objectClass: organizationalUnit ou: networks
# People organizational Unit # # NIS maps covered # # passwd # dn: ou=people,dc=pilgerer,dc=de objectClass: top objectClass: organizationalUnit ou: people
# Profile organizational Unit # dn: ou=profile,dc=pilgerer,dc=de objectClass: top objectClass: organizationalUnit ou: profile
# Protocols organizational Unit # # NIS maps covered # # protocols # dn: ou=protocols,dc=pilgerer,dc=de objectClass: top objectClass: organizationalUnit ou: protocols
# Rpc organizational Unit # # NIS maps covered # # rpc # dn: ou=rpc,dc=pilgerer,dc=de objectClass: top objectClass: organizationalUnit ou: rpc
# Services organizational Unit # # NIS maps covered # # rpc # dn: ou=services,dc=pilgerer,dc=de objectClass: top objectClass: organizationalUnit ou: services
---init.ldif---
Anwendung der Migration Tools
- /migrate_hosts.pl /etc/hosts /usr/local/etc/openldap/ldif.hosts ./migrate_hosts.pl /etc/passwd /usr/local/etc/openldap/ldif.passwd usw.
# cd /usr/local/etc/openldap/ldif
Verzeichnis fuer Fehlerdateien anlegen # mkdir ../errors
LDIF Dateien im LDAP Server ablegen # for i in ldif.*; do ldapadd -x -ZZ -D "cn=admin,dc=pilgerer,dc=de" \
- -w test -c -S ../errors/error.$i -f $i; done
-x fuehre ein simple bind aus (kein sasl) -ZZ start TLS, doppelte Nennung von Z erfordert das die Athentifizierung
- erfolgreich ist.
-w Passwort (festgelegt in slapd.conf (slappasswd -h {SSHA} -s passwort))
Es ist Sinnvoll statt der Option -w (erwartet das Passwort als Commandlineargument), die Option -W die nach dem Passwort fragt, zu verwenden.
Um die Authentifizierung via LDAP zu testen habe ich einen Testuser erstellt, dieser existiert lediglich in der LDAP Datenbank wobei sein Home Verzeichnis selbstverstaendlich existent sein muss, falls ein Login moeglich sein soll.
---ldif.testuser---
# Test user # dn: uid=tester,ou=people,dc=pilgerer,dc=de objectClass: top objectClass: account objectClass: posixAccount objectclass: shadowAccount uid: tester cn: Test User userPassword: {CRYPT}dl6RYlp5XMzS. gecos: Test User uidNumber: 100 gidNumber: 100 homeDirectory: /home/tester loginShell: /usr/local/bin/bash
---ldif.testuser---
Das Passwort kann mit slappasswd erstellt werden.
slappasswd -h {crypt} -s tester {CRYPT}dl6RYlp5XMzS.
#ldapadd -x -ZZ -D "cn=admin,dc=pilgerer,dc=de" -W -c \
- -S ../errors/error.ldif.testuser -f ldif.testuser
Nachdem auch diese LDIF Datei mit in die Datenbank aufgenommen wurde, koennen wir uns als dieser User authentifizieren und in unserem DIT suchen.
#ldapseach -x -ZZ -D "uid=tester,ou=people,dc=pilgerer,dc=de" -W \
'(&(uid=tester)(objectClass=posixAccount))'
Enter LDAP Password: # extended LDIF # # LDAPv3 # base <> with scope sub # filter: (&(uid=tester)(objectClass=posixAccount)) # requesting: ALL #
# tester, people, pilgerer.de dn: uid=tester,ou=people,dc=pilgerer,dc=de objectClass: top objectClass: account objectClass: posixAccount objectClass: shadowAccount uid: tester cn: Test User gecos: Test User uidNumber: 100 gidNumber: 100 homeDirectory: /home/tester loginShell: /usr/local/bin/bash userPassword:: e0NSWVBUfUMxa1MycmZlalhwd28=
# search result search: 3 result: 0 Success
# numResponses: 2 # numEntries: 1
5.) Das UNIX System auf LDAP Authentifizierung umstellen.
- Name Service Switch um den Eintrag ldap erweitern, es sollte immer als erstes in den localen Dateien gesucht werden. Dies verhindert boese Ueberaschungen wenn der LDAP Server mal nciht erreichbar sein sollte.
/etc/nsswitch.conf
passwd: files ldap group: files ldap
Die benoetigten Module nss_ldap und pam_ldap installieren
cd /usr/ports/net/nss_ldap && make install clean cd /usr/ports/security/pam_ldap && make install clean
PAM Konfiguration auf LDAP umstellen.
/etc/pam.d/sshd
# $FreeBSD: src/etc/pam.d/sshd,v 1.15 2003/04/30 21:57:54 markm Exp $ # # PAM configuration for the "sshd" service #
# auth auth required pam_nologin.so no_warn auth sufficient pam_opie.so no_warn no_fake_prompts auth requisite pam_opieaccess.so no_warn allow_local #auth sufficient pam_krb5.so no_warn try_first_pass #auth sufficient pam_ssh.so no_warn try_first_pass auth sufficient /usr/local/lib/pam_ldap.so no_warn try_first_pass <--- neu auth required pam_unix.so no_warn try_first_pass
Je nachdem welche Dienste auf dem System angeboten werden, die entsprechenden Dateien unter /etc/pam.d editieren.
ssh tester@localhost Password: bash-2.05b$ id uid=100(tester) gid=100(tester) groups=100(tester)
-su-2.05b# su tester su-2.05b$ id uid=100(tester) gid=100(tester) groups=100(tester)
6.) Das Globale Adressbuch
- Ldifs in die LDAP Datenbank aufnehmen
---ldif.abook--- dn: ou=abook,dc=pilgerer,dc=de objectclass: top objectclass: organizationalUnit ou: abook description: Zentrales Adressbuch ---ldif.abook---
---ldif.admanager--- dn: cn=admanager,dc=pilgerer,dc=de objectClass: top objectClass: person cn: admanager sn: admanager ---ldif.admanager---
Folgende Ports installieren
/usr/ports/net/p5-perl-ldap /usr/ports/devel/p5-Date-Manip /usr/ports/databases/p5-DBI /usr/ports/textproc/p5-XML-DOM
PDA::Pilot falls benoetigt von CPAN fetchen.
ftp://ftp.eenet.ee/mirrors/cpan/authors/id/D/DL/DLEIGH/AddressBook-0.16.tar.gz herunterladen, auspacken und installieren
# perl Makefile.PL
- Fragen beantworten ou=abook,dc=pilgerer,dc=de
# make
# make test
# make install
http://cesnet.dl.sourceforge.net/sourceforge/ldap-abook/ldap-abook-1.00.tar.gz herunterladen, auspacken und installieren
# perl Makefile.PL
# make
# cp ./examples/default/AddressBook.conf /etc/AddressBook.conf
# make test
# make install
combiCalender.schema in slapd.conf einfuegen (auf Abhaengigkeiten achten)
/etc/AddressBook.conf editieren und die Objektklasse objectclass="abookperson" durch objectclass="addressbookperson" ersetzen.
Ausserdem muss noch die richtige Base sowie der Adressbuchverwalter eingetargen werden.
Wenn das Utility abook.cgi verwendet werden soll, das unter /home/httpd installiert wurde, wird ein Webserver benoetigt.
cd $HOME/httpd mkdir cgi-bin cp abook.cgi $HOME/httpd/cgi-bin/.
echo "<meta http-equiv="refresh" content="0; URL=cgi-bin/abook.cgi">" \ > $HOME/httpd/index.htm
Um LDAP Querys von unterschiedlichen MUAs durchzufuehren ist je nach MUA eine unterschiedliche KOnfiguration notwendig.
Viele MUA koennen lediglich LDAPv2, mit folgendem Eintrag laesst sich der LDAP Server darauf einrichten.
allow bind_v2
Mutt
Perl Skript herunterladen und anpassen wget ftp://ftp.mutt.org/mutt/contrib/mutt_ldap_query-3.0.pl.gz
my $ldap_server = "nibbler"; my $search_base = "ou=abook,dc=pilgerer,dc=de"; my $LDAPSEARCH="/usr/local/bin/ldapsearch -ZZ -W -D 'uid=tester,ou=people,dc=pilgerer,dc=de'";
uid muss die im LDAP DIT vorhandene und gueltige Kennung des Users sein, da der Zugriff aufs Adessbuch nur fuer authentifizierte User gestattet ist.
.muttrc
set query_command = "perl ~/bin/mutt_ldap_query-3.0.pl -s nibbler \ -b 'ou=abook,dc=pilgerer,dc=de' '%s'"
Mozilla-Mail
AddressBook aufrufen / Preferences / Mail & Newsgroups / Addressing / Directory Server / Edit Directories / Add
Name: ldapserver Hostname: ldapserver Base-DN: ou=abook,dc=people,dc=de Port number: 389 Bind-DN: uid=$whoami,ou=people,dc=pilgerer,dc=de
Angeblich soll Mozilla 1.5 ueber eine anstaendige TLS Implementierung verfuegen. Ich habe es leider nicht zum laufen bekommen. Aber wer will schon Mozilla
Querys mit Authentifizierung sind moeglich allerdings nur unverschluesselt.
Sylpheed
- In Version 0.9.8.a liess sich obwohl es mit --enable-ldap gebaut wurde keine LDAP Option ausfindig machen.
Evolution
Hab ich nicht gebaut bekommen und mangels INteresse an diesem MUA auch nciht weiter versucht
7.) Userpasswort aendern.
- Nur authentifizierten Usern ist es erlaubt Ihr Passwort zu Modifizieren. ldappasswd -ZZ -D "uid=tester,ou=people,dc=pilgerer,dc=de" -W -S New password: Re-enter new password: Enter LDAP Password: Result: Success (0)
URLs
http://www.openldap.org/ OpenLdap offizielle Webseite
http://www.openldap.org/doc/ OpenLdap offizielle Dokumentation
http://www.openldap.org/doc/admin23/replication.html OpenLdap Kapitel ueber Replikation
http://linsec.ca/usermgmt/openldap.php Nette Step-by-Step Dokumentation.
http://www-unix.mcs.anl.gov/~gawor/ldap/download.htmlldapbrowser
Terminologie
Important RFCs for Ldap Directory Services

