Inhaltsverzeichnis
LDAP CentOS 5
LDAP ist ein Netzwerkprotokoll und dient zur Bereitstellung von Verzeichnisdiensten. Es vermittelt die Kommunikation zwischen dem LDAP-Client mit dem Directory Server.
Die hier beschriebene Variante von LDAP ist OpenLDAP, welche eine freie Implementierung des Lightweight Directory Access Protocols ist.
Installation
Folgende Pakete sollten für den Betrieb von OpenLDAP als Server und Client installiert werden:
openldap
(openldap.i386)openldap-clients
(openldap-clients.i386)openldap-devel
(openldap-devel.i386)compat-openldap
(compat-openldap.i386)openldap-servers
(openldap-servers.i386)openldap-servers-sql
(openldap-servers-sql.i386)
Konfiguration
Um einen LDAP-Server betreiben zu können, sind einige Grundkonfigurationen notwendig. Ohne grundlegende Einstellungen kann der LDAP-Server nicht betrieben werden.
Konfigurationsdateien
Es gibt zwei wichtige Konfigurationsdateien:
/etc/openldap/ldap.conf
/etc/openldap/slapd.conf
Konfigurationsdatei /etc/openldap/ldap.conf
In der Konfigurationsdatei /etc/openldap/ldap.conf
wird die Basis-Domain für den LDAP-Client festgelegt. Dies ist die Standard-Konfigurationsdatei:
# # 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
Mit der Variable BASE wird der standardmäßig abgefragte Teilbaum festgelegt. Das bedeutet, dass alle Anfragen unterhalb von dc=tachtler, dc=net
durchzuführen sind. Dies wird häufig „Suchbasis“ (Searchbase) genannt. Die Variable URI gibt den Server an und wie dieser standardmäßig abgefragt wird.
Folgende Anpassungen der Konfigurationsdatei /etc/openldap/ldap.conf
genügen, um grundsätzlich einen LDAP-Server zu betreiben:
# # LDAP Defaults # # See ldap.conf(5) for details # This file should be world readable but not world writable. BASE dc=tachtler, dc=net URI ldap://ldap.tachtler.net #SIZELIMIT 12 #TIMELIMIT 15 #DEREF never
Konfigurationsdatei /etc/openldap/sldap.conf
In der Konfigurationsdatei /etc/openldap/slapd.conf
sind die Einträge für die Konfiguration des slapd
Standalone-Servers enthalten. Der slapd
beantwortet die LDAP Anfragen der Clients - es ist der LDAP-Server oder Verzeichnis-Server. Dies ist die Standard-Konfigurationsdatei:
# # See slapd.conf(5) for details on configuration options. # This file should NOT be world readable. # include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/nis.schema # Allow LDAPv2 client connections. This is NOT the default. allow bind_v2 # 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/lib/openldap # moduleload back_bdb.la # moduleload back_ldap.la # moduleload back_ldbm.la # moduleload back_passwd.la # moduleload back_shell.la # The next three lines allow use of TLS for encrypting connections using a # dummy test certificate which you can generate by changing to # /etc/pki/tls/certs, running "make slapd.pem", and fixing permissions on # slapd.pem so that the ldap user or group can read it. Your client software # may balk at self-signed certificates, however. # TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt # TLSCertificateFile /etc/pki/tls/certs/slapd.pem # TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem # 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 # # 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! ####################################################################### # ldbm and/or bdb database definitions ####################################################################### database bdb suffix "dc=my-domain,dc=com" rootdn "cn=Manager,dc=my-domain,dc=com" # Cleartext passwords, especially for the rootdn, should # be avoided. See slappasswd(8) and slapd.conf(5) for details. # Use of strong authentication encouraged. # rootpw secret # rootpw {crypt}ijFYNcSNctBYg # 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/lib/ldap # Indices to maintain for this database index objectClass eq,pres index ou,cn,mail,surname,givenname eq,pres,sub index uidNumber,gidNumber,loginShell eq,pres index uid,memberUid eq,pres,sub index nisMapName,nisMapEntry eq,pres,sub # Replicas of this database #replogfile /var/lib/ldap/openldap-master-replog #replica host=ldap-1.example.com:389 starttls=critical # bindmethod=sasl saslmech=GSSAPI # authcId=host/ldap-master.example.com@EXAMPLE.COM
Folgende Anpassungen der Konfigurationsdatei /etc/openldap/sldap.conf
sind notwendig, um grundsätzlich einen LDAP-Server zu betreiben:
# # See slapd.conf(5) for details on configuration options. # This file should NOT be world readable. # include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/nis.schema # Allow LDAPv2 client connections. This is NOT the default. # Tachtler # default: allow bind_v2 allow bind_v2 # disallow bind_anon # Tachtler # no default entry for: schemacheck schemacheck on # Do not enable referrals until AFTER you have a working directory # service AND an understanding of referrals. # Tachtler # default: referral ldap://root.openldap.org referral ldap://ldap.tachtler.net # Tachtler # no default entry for: loglevel # loglevel 296 loglevel 256 # Tachtler # Timeout for stored actions idletimeout 20 pidfile /var/run/openldap/slapd.pid argsfile /var/run/openldap/slapd.args # Tachtler # no default entry for: password-hash password-hash {SSHA} # Load dynamic backend modules: modulepath /usr/lib/openldap # moduleload back_bdb.la # moduleload back_ldap.la # moduleload back_ldbm.la # moduleload back_passwd.la # moduleload back_shell.la # The next three lines allow use of TLS for encrypting connections using a # dummy test certificate which you can generate by changing to # /etc/pki/tls/certs, running "make slapd.pem", and fixing permissions on # slapd.pem so that the ldap user or group can read it. Your client software # may balk at self-signed certificates, however. # TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt # TLSCertificateFile /etc/pki/tls/certs/slapd.pem # TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem # 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 # # 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! # Tachtler # no default entry for: Access Control Lists (ACLs) access to attrs=userPassword by self write by dn="cn=Manager,dc=tachtler,dc=net" write by anonymous auth by * none access to * by self write by dn="cn=Manager,dc=tachtler,dc=net" write by * read ####################################################################### # ldbm and/or bdb database definitions ####################################################################### database bdb # Tachtler # default: suffix "dc=my-domain,dc=com" suffix "dc=tachtler,dc=net" # Tachtler # default: rootdn "cn=Manager,dc=my-domain,dc=com" rootdn "cn=Manager,dc=tachtler,dc=net" # Cleartext passwords, especially for the rootdn, should # be avoided. See slappasswd(8) and slapd.conf(5) for details. # Use of strong authentication encouraged. # rootpw secret # rootpw {crypt}ijFYNcSNctBYg # Tachtler # no default entry for: rootpw rootpw {SSHA}XOUSdepOhCsSIfqaSGGiiDk0/b285Z7m # 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/lib/ldap # Tachtler # no default entry for: mode mode 0600 # Tachtler # no default entry for: lastmod lastmod on # Indices to maintain for this database index objectClass eq,pres index ou,cn,mail,surname,givenname eq,pres,sub index uidNumber,gidNumber,loginShell eq,pres index uid,memberUid eq,pres,sub index nisMapName,nisMapEntry eq,pres,sub # Replicas of this database #replogfile /var/lib/ldap/openldap-master-replog #replica host=ldap-1.example.com:389 starttls=critical # bindmethod=sasl saslmech=GSSAPI # authcId=host/ldap-master.example.com@EXAMPLE.COM
schemacheck
Der Wert für den Eintrag schemacheck
wird auf on
gesetzt so dass bei der Modifizierung mit Hilfe von ldapadd
überprüft wird, ob die Einträge in Objektklassen spezifizert sind. Um zu vermeiden, dass falsche Eigenschaften (z.B. der Nachname eines Landes) gesetzt werden können sollte hier die Einstellung auf on
gesetzt sein.
schemacheck on
loglevel
Der Wert für den Eintrag loglevel
setzte sich wie folgt zusammen:
8
Connection management32
Search filter processing256
Statistics for connection, operations and results
Die Summe der Werte 8+32+256=296. Welche Werte und welche Optionen sich hinter diesen Werten befinden, kann in der man
-Page für die Konfigurationsdatei /etc/openldap/sldap.conf
mit folgendem Befehl nachgelesen werden:
# man slapd.conf
* 256 sollte für den „normal“ Betrieb ausreichend sein!
idletimeout
Der Wert für den Eintrag idletimeout
setzte eine Ablaufzeit für offene Abfragen, welche noch nicht beendet wurden. Dies sollte auf jeden Fall gesetzt werden, da es sonst bei sehr vielen Abfragen zu einem „Stillstand“ des LDAP-Daemons kommen kann:
idletimeout 20
password-hash
Die Angabe für den Eintrag password-hash
, setzt den Standard-Algorithmus, welcher zwar SSHA
ist, jedoch hier explizit angegeben werden soll.
password-hash {SSHA}
Access Control Lists (ACLs)
Die erste der beide ACLs
access to attrs=userPassword by self write by dn="cn=Manager,dc=tachtler,dc=net" write by anonymous auth by * none
besagt, dass ein Zugriff auf das Attribut userPassword
nur dem Eigentümer, einer Instanz des Objekts Manager
mit Schreibrechten erlaubt sind. Desweiteren können anonyme Anfragen anonymous
zur Authentifizierung das Attribut userPassword
vergleichen. Alle anderen Anfragen auf das Attribut userPassword
sind nicht gestattet.
Die zweite der beiden ACLs
access to * by self write by dn="cn=Manager,dc=tachtler,dc=net" write by * read
besagt, dass ein Zugriff auf alle Objekte (außer userPassword
, siehe vorherige ACL), vom Besitzer mit Schreibrechten durchgeführt werden können. Alle anderen Anfragen sind mit Leserechten gestattet. ( Zu Testzwecken !!!)
rootpw
Um ein Passwort für den Eintrag rootpw
mit der Verschlüsselungsmethode SSHA
, welche einem SHA-1 Algorithmus (FIPS 160-1) entspricht, zu generieren, wird das Programm /usr/sbin/slappasswd
mit folgendem Befehl aufgerufen:
# /usr/sbin/slappasswd -h {SSHA} New password: Re-enter new password: {SSHA}XOUSdepOhCsSIfqaSGGiiDk0/b285Z7m
mode
Der Eintrag mode
mit der entsprechenden Angabe 0600
bewirkt, dass Dateien mit nur für den Eigentüber der Datei mit den Rechten rw
(lesen+schreiben) angelegt werden.
mode 0600
lastmod
Der Wert für den Eintrag lastmod
bewirkt, dass Einträge mit einem Datum versehen werden.
lastmod on
Konfigurationsdatei /var/lib/ldap/DB_CONFIG
Zum Abschluss muss noch eine Kopie der Beispiel-Konfigurationsdatei für die Datenbank-Konfiguration, in diesem Beispiel eine BDB-Datenbank (welches der Standard ist) in das Verzeichnis /var/lib/ldap
kopiert werden. Dies kann mit folgendem Befehl erledigt werden:
# cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
Konfigurationsdatei /etc/sysconfig/ldap
Falls weitere Konfigurationen des Programmes slapd
z.B. (Startoptionen) gesetzt werden sollen, muss eine weitere Konfigurationsdatei mit der Bezeichnung /etc/sysconfig/ldap
erstellt werden:
Hier als Beispiel:
- keine Unterstütztung für
IPv6
# Parameters to ulimit called right before starting slapd # - use this to change system limits for slapd ULIMIT_SETTINGS= # How long to wait between sending slapd TERM and KILL # signals when stopping slapd by init script # - format is the same as used when calling sleep STOP_DELAY=3s # By default only listening on ldap:/// is turned on. # If you want to change listening options for slapd, # set following three variables to yes or no SLAPD_LDAP=yes # Tachtler # default: SLAPD_LDAPS=no SLAPD_LDAPS=yes SLAPD_LDAPI=no # Tachtler # Disable support for IPv6 (-4) SLAPD_OPTIONS="-4"
Konfiguration als LDAP-Server ohne anonymous Authentifizierung
Als besondere Variante soll hier noch ein LDAP-Server konfiguriert werden, welcher keine anonymen Anfragen „anonymous bind“ erlaubt! Eine weitere Ergänzung soll bei der nachfolgenden Konfiguration sein, dass nur der Hauptbenutzer, hier cn=Manager,dc=tachtler,dc=net
komplette Schreibrechte besitzt und einen Benutzer als „Ersatzauthentifizierer“ für anonyme Anfragen fungiert, hier cn=Ersatzbenutzer,dc=tachtler,dc=net
und zu Abschluss noch die Konfiguration, dass nur der jeweilige Benutzer nur seine eigenen Daten sieht und verändern kann.
Zuerst die komplette Konfigurationsdatei /etc/openldap/slapd.conf
:
# # See slapd.conf(5) for details on configuration options. # This file should NOT be world readable. # include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/nis.schema # Allow LDAPv2 client connections. This is NOT the default. allow bind_v2 # Tachtler # no default entry for: disallow disallow bind_anon require authc # Tachtler # no default entry for: schemacheck schemacheck on # Do not enable referrals until AFTER you have a working directory # service AND an understanding of referrals. # Tachtler # default: referral ldap://root.openldap.org referral ldap://ldap.tachtler.net # Tachtler # no default entry for: loglevel # loglevel 296 loglevel 256 # Tachtler # Timeout for stored actions idletimeout 60 pidfile /var/run/openldap/slapd.pid argsfile /var/run/openldap/slapd.args # Tachtler # no default entry for: password-hash password-hash {SSHA} # Load dynamic backend modules: modulepath /usr/lib/openldap # moduleload back_bdb.la # moduleload back_ldap.la # moduleload back_ldbm.la # moduleload back_passwd.la # moduleload back_shell.la # The next three lines allow use of TLS for encrypting connections using a # dummy test certificate which you can generate by changing to # /etc/pki/tls/certs, running "make slapd.pem", and fixing permissions on # slapd.pem so that the ldap user or group can read it. Your client software # may balk at self-signed certificates, however. # TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt # TLSCertificateFile /etc/pki/tls/certs/slapd.pem # TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem # 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 # # 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! # Tachtler # no default entry for: Access Control Lists (ACLs) ### Attributes access to attrs=userPassword,shadowLastChange,shadowMax,shadowWarning by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" read by anonymous auth by * none ### Ersatzbenutzer access to dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" by self write by * none ### Manager access to dn="cn=Manager,dc=tachtler,dc=net" by self write by * none ### Group, People access to dn.regex="cn=([^,]+),ou=Group,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=tachtler,dc=net" read by * none access to dn.regex="uid=([^,]+),ou=People,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=tachtler,dc=net" read by * none ### Others access to * by dn="cn=Manager,dc=tachtler,dc=net" write by * read ####################################################################### # ldbm and/or bdb database definitions ####################################################################### database bdb # Tachtler # default: suffix "dc=my-domain,dc=com" suffix "dc=tachtler,dc=net" # Tachtler # default: rootdn "cn=Manager,dc=my-domain,dc=com" rootdn "cn=Manager,dc=tachtler,dc=net" # Cleartext passwords, especially for the rootdn, should # be avoided. See slappasswd(8) and slapd.conf(5) for details. # Use of strong authentication encouraged. # rootpw secret # rootpw {crypt}dfeYNffrctswg # Tachtler # no default entry for: rootpw rootpw {SSHA}5rTfe32wztdA7z0oeRw34GY/thtc+tbCd # 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/lib/ldap # Tachtler # no default entry for: mode mode 0600 # Tachtler # no default entry for: lastmod lastmod on # Indices to maintain for this database index objectClass eq,pres index ou,cn,mail,surname,givenname eq,pres,sub index uidNumber,gidNumber,loginShell eq,pres index uid,memberUid eq,pres,sub index nisMapName,nisMapEntry eq,pres,sub # Replicas of this database #replogfile /var/lib/ldap/openldap-master-replog #replica host=ldap-1.example.com:389 starttls=critical # bindmethod=sasl saslmech=GSSAPI # authcId=host/ldap-master.example.com@EXAMPLE.COM
Besonders zu beachten sind hier die Zeilen:
# Allow LDAPv2 client connections. This is NOT the default. allow bind_v2 # Tachtler # no default entry for: disallow disallow bind_anon require authc
* Hier wird die Version 2 von „bind“ erlaubt und der „anonymous bind“ verboten! - Desweiteren wird eine Authentifizierung in jedem Fall und für jede Art der Abfrage verlangt!
Desweiteren sind folgende Zeilen für die Benutzergesteuerten Sichten auf die Daten zuständig:
# Tachtler # no default entry for: Access Control Lists (ACLs) ### Attributes access to attrs=userPassword,shadowLastChange,shadowMax,shadowWarning by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" read by anonymous auth by * none
* Hier werden folgende „Attribute“ ausgeblendet - userPassword,shadowLastChange,shadowMax,shadowWarning
.
### Ersatzbenutzer access to dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" by self write by * none ### Manager access to dn="cn=Manager,dc=tachtler,dc=net" by self write by * none
* Hier werden die Benutzer Ersatzbenutzer
und Manager
so konfiguriert, dass nur sie selbst sich sehen und auch nur sie ihre Daten verändern können!
### Group, People access to dn.regex="cn=([^,]+),ou=Group,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=tachtler,dc=net" read by * none access to dn.regex="uid=([^,]+),ou=People,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=tachtler,dc=net" read by * none
* Hier werden per RegEx-Formulierung nur dem jeweiligen Benutzer erlaubt, seine eigenen Daten zu sehen und zu verändern. Globale Schreibrechte bleiben dem Benutzer Manager
vorbehalten. Globale Leserechten dem Benutzer Ersatzbenutzer
. Alle Rechte zum schreiben und lesen basieren immer auf einer korrekten Authentifizierung mit dem entsprechenden benutzerbezogenen Passwort!
### Others access to * by dn="cn=Manager,dc=tachtler,dc=net" write by * read
* Hier wird für alle Objekten - welche ohne spezielle Rechte sind - Leseerlaubnis erteilt. Dies ist zum Teil erforderlich, um die Wurzel lesbar zu machen. Da aber keine Objekte mehr ohne spezielle Rechte vorhanden sind (aussser die Wurzel selbst), können hier auch keine Objekte mehr unberechtigt gelesen werden!
Start-Script Anpassungen
Nachfolgende Anpassungen des Start-Script des des LDAP-Deamon führen dazu, das des LDAP-Deamon NUR noch auf der
- IP-Adresse
192.168.0.1
horcht!
Änderungen bzw. Ergänzungen an dem Start-Script sind mit
# Tachtler
gekennzeichnet.
Hier das komplette Start-Script:
#!/bin/bash # # ldap This shell script takes care of starting and stopping # ldap servers (slapd and slurpd). # # chkconfig: - 27 73 # description: LDAP stands for Lightweight Directory Access Protocol, used \ # for implementing the industry standard directory services. # processname: slapd # config: /etc/openldap/slapd.conf # pidfile: /var/run/openldap/slapd.pid # Source function library. . /etc/init.d/functions # Source networking configuration and check that networking is up. if [ -r /etc/sysconfig/network ] ; then . /etc/sysconfig/network [ ${NETWORKING} = "no" ] && exit 1 fi # Source an auxiliary options file if we have one, and pick up OPTIONS, # SLAPD_OPTIONS, SLURPD_OPTIONS, SLAPD_LDAPS, SLAPD_LDAPI, and maybe # KRB5_KTNAME and SLURPD_KRB5CCNAME. if [ -r /etc/sysconfig/ldap ] ; then . /etc/sysconfig/ldap fi slapd=/usr/sbin/slapd slurpd=/usr/sbin/slurpd slaptest=/usr/sbin/slaptest [ -x ${slapd} ] || exit 1 [ -x ${slurpd} ] || exit 1 RETVAL=0 # # Pass commands given in $2 and later to "test" run as user given in $1. # function testasuser() { local user= cmd= user="$1" shift cmd="$@" if test x"$user" != x ; then if test x"$cmd" != x ; then /sbin/runuser -f -m -s /bin/sh -c "test $cmd" -- "$user" else false fi else false fi } # # Check for read-access errors for the user given in $1 for a service named $2. # If $3 is specified, the command is run if "klist" can't be found. # function checkkeytab() { local user= service= klist= default= user="$1" service="$2" default="${3:-false}" if test -x /usr/kerberos/bin/klist ; then klist=/usr/kerberos/bin/klist elif test -x /usr/bin/klist ; then klist=/usr/bin/klist fi KRB5_KTNAME="${KRB5_KTNAME:-/etc/krb5.keytab}" export KRB5_KTNAME if test -s "$KRB5_KTNAME" ; then if test x"$klist" != x ; then if LANG=C $klist -k "$KRB5_KTNAME" | tail -n 4 | awk '{print $2}' | grep -q ^"$service"/ ; then if ! testasuser "$user" -r ${KRB5_KTNAME:-/etc/krb5.keytab} ; then true else false fi else false fi else $default fi else false fi } function configtest() { local user= ldapuid= dbdir= file= # Check for simple-but-common errors. user=ldap prog=`basename ${slapd}` ldapuid=`id -u $user` # Unaccessible database files. slaptestflags= for dbdir in `LANG=C egrep '^directory[[:space:]]+[[:print:]]+$' /etc/openldap/slapd.conf | sed s,^directory,,` ; do for file in `find ${dbdir}/ -not -uid $ldapuid -and \( -name "*.dbb" -or -name "*.gdbm" -or -name "*.bdb" -or -name "__db.*" \)` ; do echo -n $"$file is not owned by \"$user\"" ; warning ; echo done if ! test -s ${dbdir}/id2entry.dbb ; then if ! test -s ${dbdir}/id2entry.gdbm ; then if ! test -s ${dbdir}/id2entry.bdb ; then slaptestflags=-u fi fi fi done # Unaccessible keytab with an "ldap" key. if checkkeytab $user ldap ; then file=${KRB5_KTNAME:-/etc/krb5.keytab} echo -n $"$file is not readable by \"$user\"" ; warning ; echo fi # Unaccessible TLS configuration files. tlsconfigs=`LANG=C egrep '^(TLS_CACERT|TLSCACertificateFile|TLSCertificateFile|TLSCertificateKeyFile)[[:space:]]' /etc/openldap/slapd.conf /etc/openldap/ldap.conf | awk '{print $2}'` for file in $tlsconfigs ; do if ! testasuser $user -r $file ; then echo -n $"$file is not readable by \"$user\"" ; warning ; echo fi done # Check the configuration file. if ! action $"Checking configuration files for $prog: " /sbin/runuser -m -s "$slaptest" -- "$user" $slaptestflags; then if /sbin/runuser -m -s "$slaptest" -- "$user" "-u" > /dev/null 2> /dev/null ; then dirs=`LANG=C egrep '^directory[[:space:]]+[[:print:]]+$' /etc/openldap/slapd.conf | awk '{print $2}'` for directory in $dirs ; do if test -r $directory/__db.001 ; then echo -n $"stale lock files may be present in $directory" ; warning ; echo fi done fi exit 1 fi } function start() { configtest # Define a couple of local variables which we'll need. Maybe. user=ldap prog=`basename ${slapd}` if test x$SLAPD_LDAP = xyes ; then # Tachtler # default: harg="ldap:///" # harg="ldap://127.0.0.1:389/ ldap://192.168.0.1:389/" harg="ldap://192.168.0.1:389/" fi if grep -q ^TLS /etc/openldap/slapd.conf || test x$SLAPD_LDAPS = xyes ; then # Tachtler # default: harg="$harg ldaps:///" # harg="$harg ldaps://127.0.0.1:636/ ldaps://192.168.0.1:636/" harg="$harg ldaps://192.168.0.1:636/" fi if test x$SLAPD_LDAPI = xyes ; then # Tachtler # default harg="$harg ldapi:///" # harg="$harg ldapi://127.0.0.1/ ldapi://192.168.0.1/" harg="$harg ldapi://192.168.0.1/" fi # Start daemons. echo -n $"Starting $prog: " ulimit $ULIMIT_SETTINGS > /dev/null 2>&1 daemon --check=$prog ${slapd} -h \"$harg\" -u ${user} $OPTIONS $SLAPD_OPTIONS RETVAL=$? echo if [ $RETVAL -eq 0 ]; then if grep -q "^replogfile" /etc/openldap/slapd.conf; then prog=`basename ${slurpd}` echo -n $"Starting $prog: " if [ -n "$SLURPD_KRB5CCNAME" ]; then export KRB5CCNAME="$SLURPD_KRB5CCNAME"; fi daemon ${slurpd} $OPTIONS $SLURPD_OPTIONS RETVAL=$? echo fi fi [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ldap return $RETVAL } function stop() { # Stop daemons. prog=`basename ${slapd}` echo -n $"Stopping $prog: " killproc -d $STOP_DELAY ${slapd} RETVAL=$? echo if [ $RETVAL -eq 0 ]; then if grep -q "^replogfile" /etc/openldap/slapd.conf; then prog=`basename ${slurpd}` echo -n $"Stopping $prog: " killproc ${slurpd} RETVAL=$? echo fi fi [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/ldap /var/run/slapd.args return $RETVAL } # See how we were called. case "$1" in configtest) configtest ;; start) start RETVAL=$? ;; stop) stop RETVAL=$? ;; status) status ${slapd} RETVAL=$? if grep -q "^replogfile" /etc/openldap/slapd.conf ; then status ${slurpd} RET=$? if [ $RET -ne 0 ] ; then RETVAL=$RET; fi fi ;; restart) stop start ;; condrestart) if [ -f /var/lock/subsys/ldap ] ; then stop start RETVAL=$? fi ;; *) echo $"Usage: $0 {start|stop|restart|status|condrestart}" RETVAL=1 esac exit $RETVAL
Start des LDAP-Servers
Als erstes sollte mit folgendem Befehl die Konfigurationsdatei /etc/openldap/sldap.conf
auf Fehler überprüft werden:
# service ldap configtest
welcher mit fogender Ausgabe enden sollte:
Checking configuration files for slapd: config file testing succeeded [ OK ]
Ein Start des LDAP-Servers wird mit folgenden Befehl durchgeführt:
# service ldap start
welcher mit folgender Ausgabe enden sollte:
Checking configuration files for slapd: config file testing succeeded [ OK ] Starting slapd: [ OK ]
Eine Überprüfung ob der Start des LDAP-Server erfolgreich war kann mit folgendem Befehl durchgeführt werden, welcher nachfolgende Ausgabe erzeugen sollte:
# netstat -tulpen Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 0 838381 23992/slapd
Die Ausgabe in der Log-Datei, hier /var/log/ldap.log
sollte folgendermassen aussehen:
Jul 30 09:19:11 nss slapd[23987]: @(#) $OpenLDAP: slapd 2.3.27 (Jul 9 2008 13:10:56) $#012#011mockbuild@builder16.centos.org:/builddir/build/BUILD/openldap- 2.3.27/openldap-2.3.27/build-servers/servers/slapd Jul 30 09:19:11 nss slapd[23987]: daemon: IPv6 socket() failed errno=97 (Address family not supported by protocol) Jul 30 09:19:11 nss slapd[23992]: slapd starting Jul 30 09:19:11 nss slapd[23992]: daemon: added 4r Jul 30 09:19:11 nss slapd[23992]: daemon: added 7r Jul 30 09:19:11 nss slapd[23992]: daemon: select: listen=7 active_threads=0 tvp=NULL
Um den LDAP-Daemon dauerhaft bei jedem Neustart des Rechners automatisch zu starten geben Sie bitte als root
folgenden Befehl ein, um zu überprüfen wie die aktuelle Konfiguration des Startverhaltens des aktuellen LDAP-Daemons aussieht:
# chkconfig --list | grep ldap ldap 0:off 1:off 2:off 3:off 4:off 5:off 6:offf
Falls die Ausgabe wie oben gezeigt erscheinen sollte, wird der LDAP-Daemon nicht bei jedem Neustart des Rechners gestartet. Um dies zu ändern geben Sie bitte folgende Befehle ein:
# chkconfig ldap on
* Aktivieren des automatischen Startens des LDAP-Daemons.
Das erneute Eingeben des Befehls zur Überprüfung, wie die aktuelle Konfiguration des Startverhaltens des LDAP-Daemons aussieht, sollte dann wie folgt erscheinen:
# chkconfig --list | grep ldap ldap 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Initiale DIT erstellen
Nach der Installation und Konfiguration des LDAP-Servers muss dieser mit Daten gefüttert werden. Die Daten müssen in den DIT Directory Information Tree eingestellt werden.
Dies soll hier anhand einer Migration von bereits bestehenden Benutzers in den DIT Directory Information Tree veranschaulicht werden. Die Informationen werden in sogenannten *.ldif
-Dateien gespeichert.
Als erstes wird ein neues Verzeichnis mit folgendem Befehl erstellt (um die neuen *.ldif
-Dateien zu separieren):
# mkdir /etc/openldap/ldif
Als nächtes wird nun eine Datei mit z.B. dem Namen der verwendeten Domain, hier tachtler.net.ldif
mit folgendem Befehl und nachfolgendem Inhalt erstellt:
# vim /etc/openldap/ldif/tachtler.net.ldif
## Build the root node. dn: dc=tachtler,dc=net dc: Tachtler objectClass: dcObject objectClass: organizationalUnit ou: tachtler Dot net ## Build the Manager cn. dn: cn=Manager,dc=tachtler,dc=net cn: Manager objectClass: organizationalRole ## Build the People ou. dn: ou=People,dc=tachtler,dc=net ou: People objectClass: organizationalUnit ## Build the Group ou. dn: ou=Group,dc=tachtler,dc=net ou: Group objectClass: organizationalUnit
Es ist erforderlich, dass der LDAP-Daemon mit folgendem Befehl gestoppt wird:
# service ldap stop Stopping slapd: [ OK ]
Mit folgendem Befehl werden nun die Daten aus der Datei /etc/openldap/ldif/tachtler.net.ldif
in den DIT Directory Information Tree eingestellt:
# slapadd -v -l /etc/openldap/ldif/tachtler.net.ldif added: "dc=tachtler,dc=net" (00000001) added: "cn=Manager,dc=tachtler,dc=net" (00000002) added: "ou=People,dc=tachtler,dc=net" (00000003) added: "ou=Group,dc=tachtler,dc=net" (00000004)
Anschließend wird im Verzeichnis /var/lib/ldap
mit folgendem Befehl allen Dateien der Besitzer ldap
und die Gruppe ldap
zugewiesen:
# chown ldap.ldap /var/lib/ldap/*
Eine Überprüfung des Verzeichnises mit folgendem Befehl, ob das setzen der Besitzrechte erfolgreich war, sollte folgende Ausgabe erzeugen:
# ll /var/lib/ldap total 800 -rw-r--r-- 1 ldap ldap 2048 Jul 30 10:34 alock -rw------- 1 ldap ldap 8192 Jul 30 10:33 cn.bdb -rw------- 1 ldap ldap 24576 Jul 30 10:33 __db.001 -rw------- 1 ldap ldap 278528 Jul 30 10:33 __db.002 -rw------- 1 ldap ldap 270336 Jul 30 10:33 __db.003 -rw------- 1 ldap ldap 98304 Jul 30 10:33 __db.004 -rw------- 1 ldap ldap 352256 Jul 30 10:33 __db.005 -rw------- 1 ldap ldap 24576 Jul 30 10:33 __db.006 -rw-r----- 1 ldap ldap 886 Jul 30 09:18 DB_CONFIG -rw------- 1 ldap ldap 8192 Jul 30 10:33 dn2id.bdb -rw------- 1 ldap ldap 32768 Jul 30 10:33 id2entry.bdb -rw------- 1 ldap ldap 10485760 Jul 30 10:33 log.0000000001 -rw------- 1 ldap ldap 8192 Jul 30 10:33 objectClass.bdb -rw------- 1 ldap ldap 8192 Jul 30 10:33 ou.bdb
Es ist erforderlich, dass der LDAP-Daemon mit folgendem Befehl gestartet wird:
# service ldap start Checking configuration files for slapd: config file testing succeeded [ OK ] Starting slapd: [ OK ]
Ein Suchanfrage zum Testen, ob die Datenmigration erfolgreich war, kann mit folgendem Befehl durchgeführt werden:
# ldapsearch -x -b "dc=tachtler,dc=net" "(objectclass=*)" # extended LDIF # # LDAPv3 # base <dc=tachtler,dc=net> with scope subtree # filter: (objectclass=*) # requesting: ALL # # tachtler.net dn: dc=tachtler,dc=net dc: Tachtler objectClass: dcObject objectClass: organizationalUnit ou: tachtler Dot net # Manager, tachtler.net dn: cn=Manager,dc=tachtler,dc=net cn: Manager objectClass: organizationalRole # People, tachtler.net dn: ou=People,dc=tachtler,dc=net ou: People objectClass: organizationalUnit # Group, tachtler.net dn: ou=Group,dc=tachtler,dc=net ou: Group objectClass: organizationalUnit # klaus, People, tachtler.net dn: uid=klaus,ou=People,dc=tachtler,dc=net uid: klaus cn: Klaus Tachtler objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount shadowLastChange: 13990 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 500 gidNumber: 500 homeDirectory: /home/klaus gecos: Klaus Tachtler # petra, People, tachtler.net dn: uid=petra,ou=People,dc=tachtler,dc=net uid: petra cn: Petra Tachtler objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount shadowLastChange: 13990 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 501 gidNumber: 501 homeDirectory: /home/petra gecos: Petra Tachtler # klaus, Group, tachtler.net dn: cn=klaus,ou=Group,dc=tachtler,dc=net objectClass: posixGroup objectClass: top cn: klaus gidNumber: 500 # petra, Group, tachtler.net dn: cn=petra,ou=Group,dc=tachtler,dc=net objectClass: posixGroup objectClass: top cn: petra gidNumber: 501 # search result search: 2 result: 0 Success # numResponses: 9 # numEntries: 8
Datenmigration
Ziel dieser „Datenmigration“ soll es sein, aus den Dateien:
/etc/passwd
und/etc/group
alle Benutzer und Gruppen herauszufiltern, welche eine Benutzer bzw. Gruppenkennung größer/gleich der Zahl 500
haben. Dies sind in der Regel alle tatsächlichen Benutzer und keine technischen Benutzer wie z.B. httpd
usw. Diese sollen dann in den LDAP-Directory Server überführt werden.
Vorbereitung
Zur Vorbereitung ist es notwenig, dass ein mitgeliefertes Script angepasst wird. Das Script /usr/share/openldap/migration/migrate_common.ph
sollte an den entsprechenden Stellen wie folgt beschrieben angepasst werden: (Hier nur ein Auszug aus dem Script)
... # Default DNS domain $DEFAULT_MAIL_DOMAIN = "tachtler.net"; # Default base $DEFAULT_BASE = "dc=tachtler,dc=net"; ...
Nach erfolgreicher Anpassung, kann mit dem extrahieren der beschriebenen Benutzer begonnen werden. Dazu sind die folgenden beiden Befehle notwendig. Die Befehle extrahieren alle Benutzer mit einer Benutzerkennung grösser/gleich 500
und einer Gruppenkennung, ebenfalls grösser/gleich 500
in jeweils zwei separate Dateien mit den Namen:
/etc/openldap/ldif/passwd
und/etc/openldap/ldif/group
Die Befehle lauten wie folgt:
# grep ":5[0-9][0-9]" /etc/passwd > /etc/openldap/ldif/passwd
und
# grep ":5[0-9][0-9]" /etc/group > /etc/openldap/ldif/group
Der Inhalt der Dateien sollte in etwa wie folgt aussehen:
# cat /etc/openldap/ldif/passwd klaus:x:500:500:Klaus Tachtler:/home/klaus:/bin/bash petra:x:501:501:Petra Tachtler:/home/petra:/bin/bash
und
# cat /etc/openldap/ldif/group klaus:x:500: petra:x:501:
Migration
Zur Durchführung der Migration kommen folgende Scripte (Perl) zum Einsatz, welche sich im Verzeichnis /usr/share/openldap/migration/
befinden und mit den nachfolgenden Befehlen aufgerufen werden:
# ./migrate_passwd.pl /etc/openldap/ldif/passwd > /etc/openldap/ldif/passwd.ldif
und
# ./migrate_group.pl /etc/openldap/ldif/group > /etc/openldap/ldif/group.ldif
Es ist erforderlich, dass der LDAP-Daemon mit folgendem Befehl gestoppt wird:
# service ldap stop Stopping slapd: [ OK ]
Mit folgenden Befehlen werden nun die beiden Daten aus der Datei
/etc/openldap/ldif/passwd.ldif
und/etc/openldap/ldif/group.ldif
in den DIT Directory Information Tree eingestellt:
# slapadd -v -l /etc/openldap/ldif/passwd.ldif added: "uid=klaus,ou=People,dc=tachtler,dc=net" (00000005) added: "uid=petra,ou=People,dc=tachtler,dc=net" (00000006)
und
# slapadd -v -l /etc/openldap/ldif/group.ldif added: "cn=klaus,ou=Group,dc=tachtler,dc=net" (00000007) added: "cn=petra,ou=Group,dc=tachtler,dc=net" (00000008)
Anschließend wird im Verzeichnis /var/lib/ldap
mit folgendem Befehl allen Dateien der Besitzer ldap
und die Gruppe ldap
zugewiesen:
# chown ldap.ldap /var/lib/ldap/*
Eine Überprüfung des Verzeichnises mit folgendem Befehl, ob das setzen der Besitzrechte erfolgreich war, sollte folgende Ausgabe erzeugen:
# ll /var/lib/ldap total 932 -rw-r--r-- 1 ldap ldap 2048 Jul 30 14:19 alock -rw------- 1 ldap ldap 8192 Jul 30 14:19 cn.bdb -rw------- 1 ldap ldap 24576 Jul 30 10:33 __db.001 -rw------- 1 ldap ldap 278528 Jul 30 10:33 __db.002 -rw------- 1 ldap ldap 270336 Jul 30 10:33 __db.003 -rw------- 1 ldap ldap 98304 Jul 30 10:33 __db.004 -rw------- 1 ldap ldap 352256 Jul 30 10:33 __db.005 -rw------- 1 ldap ldap 24576 Jul 30 10:33 __db.006 -rw-r----- 1 ldap ldap 886 Jul 30 09:18 DB_CONFIG -rw------- 1 ldap ldap 8192 Jul 30 14:19 dn2id.bdb -rw------- 1 ldap ldap 8192 Jul 30 14:19 gidNumber.bdb -rw------- 1 ldap ldap 32768 Jul 30 14:19 id2entry.bdb -rw------- 1 ldap ldap 10485760 Jul 30 14:19 log.0000000001 -rw------- 1 ldap ldap 8192 Jul 30 14:19 loginShell.bdb -rw------- 1 ldap ldap 8192 Jul 30 14:19 objectClass.bdb -rw------- 1 ldap ldap 8192 Jul 30 10:33 ou.bdb -rw------- 1 ldap ldap 8192 Jul 30 14:19 uid.bdb -rw------- 1 ldap ldap 8192 Jul 30 14:19 uidNumber.bdb
Es ist erforderlich, dass der LDAP-Daemon mit folgendem Befehl gestartet wird:
# service ldap start Checking configuration files for slapd: config file testing succeeded [ OK ] Starting slapd: [ OK ]
Zur Überprüfung ob die Migration korrekt funktioniert hat, kann folgender Befehl verwendet werden, welche die nachfolgende Ausgabe erzeugen sollte:
# ldapsearch -x -b "uid=klaus,ou=People,dc=tachtler,dc=net" "(objectclass=*)" # extended LDIF # # LDAPv3 # base <uid=klaus,ou=People,dc=tachtler,dc=net> with scope subtree # filter: (objectclass=*) # requesting: ALL # # klaus, People, tachtler.net dn: uid=klaus,ou=People,dc=tachtler,dc=net uid: klaus cn: Klaus Tachtler objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount shadowLastChange: 13990 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 500 gidNumber: 500 homeDirectory: /home/klaus gecos: Klaus Tachtler # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
Beispielabfragen
1. Eine einfache Suchabfrage mittels ldapsearch
nach der uid
:
# ldapsearch -x -LLL -H ldap://ldap.tachtler.net -b "dc=tachtler,dc=net" "uid=klaus" dn: uid=klaus,ou=People,dc=tachtler,dc=net uid: klaus cn: Klaus Tachtler objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount shadowLastChange: 13990 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 500 gidNumber: 500 homeDirectory: /home/klaus gecos: Klaus Tachtler
2. Eine einfache Suchabfrage mittels ldapsearch
inclusive Anmeldung als „Benutzer“ klaus
nach der uid
:
# ldapsearch -x -LLL -H ldap://ldap.tachtler.net -b "dc=tachtler,dc=net" "uid=petra" -W -D "uid=klaus,ou=People,dc=tachtler,dc=net" Enter LDAP Password: dn: uid=petra,ou=People,dc=tachtler,dc=net uid: petra cn: Petra Tachtler objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount shadowLastChange: 13990 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 501 gidNumber: 501 homeDirectory: /home/petra gecos: Petra Tachtler
3. Ein einfacher Vergleich von Daten mittels ldapcompare
auf die uidNumber
:
# ldapcompare -x uid=klaus,ou=People,dc=tachtler,dc=net uidNumber:500 TRUE
und mit einem falschen Wert:
# ldapcompare -x uid=klaus,ou=People,dc=tachtler,dc=net uidNumber:501 FALSE
Apache .htaccess Nutzung
LDAP kann sehr gut dazu genutzt werden, um Verzeichnisse z.B. innerhalb des DokumentRoot
-Verzeichnisses von Apache HTTP Server mit einem Zugriffsschutz zu versehen.
Alles was Sie dazu benötigen ist eine .htaccess
-Datei innerhalb des zu schützenden Verzeichnisses der Web-Anwendung. Ein Beispiel mit Erkllärungen könnte wie folgt aussehen:
Ab Apache HTTP Server-Version 2.2 nutzbar !
Benutzerauthentifizierung
AuthType Basic AuthName "Beispielanwendung - example.com" AuthBasicProvider ldap AuthzLDAPAuthoritative off AuthLDAPURL "ldap://ldap.tachtler.net:389/dc=tachtler,dc=net?uid" Require valid-user
Zeile 1 - AuthType Basic
Die Direktive wählt die Art der Benutzer-Authentisierung für ein Verzeichnis aus. Derzeit sind lediglich Basic und Digest implementiert. Um zu funktionieren, muss die Anweisung von den Direktiven AuthName und Require sowie von Direktiven wie AuthUserFile und AuthGroupFile begleitet werden.
Zeile 2 - AuthName „Beispielanwendung - example.com“
Die Direktive legt den Namen des Autorisierungsbereiches (Anm.d.Ü.: Der Autorisierungsbereich wird auch Realm genannt.) für ein Verzeichnis fest.
Zeile 3 - AuthBasicProvider ldap
Angabe des Authentifizierungsanbieters (Standard wäre file
)
Zeile 4 - AuthzLDAPAuthoritative off
Ermöglicht die Zulassung von allen LDAP-Nutzern ohne Angabe einer speziellen Gruppe.
Zeile 5 - AuthLDAPURL
ldap://ldap.tachtler.net:389/dc=tachtler,dc=net?uid
URL zum LDAP-Server.
Zeile 6 - Require valid-user
Zulassung aller User auf dem LDAP-Server.
Um den Zugriff auf nur bestimmte Nutzer im LDAP zu begrenzen kann die Zeile 6 wie folgt abgeändetr werden:
Require ldap-user klaus petra
Gruppenauthentifizierung
WICHTIG, nur zusätzliche Zeilen, sonst wie Benutzerauthentifizierung!
AuthType Basic AuthName "phpLDAPadmin" AuthBasicProvider ldap AuthzLDAPAuthoritative off AuthLDAPURL "ldap://ldap.tachtler.net:389/dc=tachtler,dc=net?uid" Require ldap-user klaus petra AuthLDAPGroupAttribute memberUid AuthLDAPGroupAttributeIsDN off Require ldap-group cn=<posixGroup with memberUid>,ou=<organizationalUnit>,dc=tachtler,dc=net
Zeile 7 - AuthLDAPGroupAttribute memberUid
In welchem Attribut nach den „Mitgliedern“ dieser Gruppe über das Attribut uid
gesucht werden soll.
Zeile 8 - AuthLDAPGroupAttributeIsDN off
Verhindert, dass auf der DN in der Zeile 9 aufgesetzt wird (WICHTIG).
Zeile 9 - Require ldap-group cn=<posixGroup with memberUid>,ou=<organizationalUnit>,dc=tachtler,dc=net
In welcher Gruppe gesucht werden soll.
Authentifizierung LDAP-Server ohne anonymous Authentifizierung
WICHTIG, nur zusätzliche Zeilen, sonst wie Gruppenauthentifizierung!
AuthType Basic AuthName "phpLDAPadmin" AuthBasicProvider ldap AuthzLDAPAuthoritative off AuthLDAPURL "ldap://ldap.tachtler.net:389/dc=tachtler,dc=net?uid" Require ldap-user klaus petra AuthLDAPGroupAttribute memberUid AuthLDAPGroupAttributeIsDN off Require ldap-group cn=<posixGroup with memberUid>,ou=<organizationalUnit>,dc=tachtler,dc=net AuthLDAPBindDN "cn=<organizationalUnit with simpleSecurityObject>,dc=tachtler,dc=net" AuthLDAPBindPassword "geheim"
Zeile 10 - AuthLDAPBindDN „cn=<organizationalUnit with simpleSecurityObject>,dc=tachtler,dc=net“
Pfad zum Benutzer, der als „Ersatzauthentifizierer“ bei quasi anonymen bind zum LDAP-Server dient.
Zeile 11 - AuthLDAPBindPassword „geheim“
Passwort des „Ersatzauthentifizierers“.
LDAPS Self-Signed-Certificate
Um den LDAP-Server OpenLDAP auch via LDAPS erreichbar zu machen sind nachfolgende Schritte notwendig. Es soll hier ein Self-Signed-Certificate zum Einsatz kommen, da dies für den eigenen Gebrauch am kostengünstigsten um vom Aufwand her, auch am realistischen durchzuführen ist (Kein Einsatz einer eigenen Zertifikatsverwaltung usw.).
Wie eine eigenes Zertifikat
- erstellt
- signiert
- ohne Passwortabfrage versehen
erstellt werden kann, kann am besten in diesem DokuWiki-Eintrag nachvollzogen werden:
- Erstellen eines Self-Signed-Certificate, entstanden im Rahmen des Einsatzes von Postfix –> Postfix TLS einsetzen
Installation Zertifikat
Nach dem ein Zertifikat wie hier –> Postfix TLS einsetzen beschrieben erstellt wurden, müssen die benötigen Komponenten noch an die entsprechenden Stellen im Betriebssystem kopiert werden. Dazu sind nachfolgende Befehle notwendig.
Bevor mit der abschließenden Konfiguration von OpenLDAP zur Nutzung von LDAPS begonnen werden kann, sind die in den vorhergehenden Schritten erstellten Dateien:
/etc/pki/tls/misc/key.pem
/etc/pki/tls/misc/newcert.pem
/etc/pki/CA/cacert.pem
noch zu kopieren und ggf. umzubenennen und die Dateirechte der entsprechend anzupassen!
Als erstes werden mit den nachfolgenden Befehlen drei neue Verzeichnisse im bestehen Verzeichnis /etc/pki
angelegt:
# mkdir /etc/pki/openldap # mkdir /etc/pki/openldap/certs # mkdir /etc/pki/openldap/private
Anschließend werden mit den nachfolgenden Befehlen die entsprechenden Dateien an den jeweiligen Bestimmungsort kopiert und ggf. umbenannt:
# cp /etc/pki/tls/misc/key.pem /etc/pki/openldap/private/key.pem # cp /etc/pki/tls/misc/newcert.pem /etc/pki/openldap/certs/cert.pem # cp /etc/pki/CA/cacert.pem /etc/pki/openldap/certs/CAcert.pem
Die Benutzer- und Dateirechte der soeben kopieren und ggf. umbenannten Dateien
/etc/pki/openldap/private/key.pem
/etc/pki/openldap/certs/cert.pem
/etc/pki/openldap/certs/CAcert.pem
können mit folgenden Befehlen die Benutzerrechte wie folgt korrigiert werden:
# chown root.ldap /etc/pki/openldap/private/key.pem # chown root.ldap /etc/pki/openldap/certs/cert.pem # chown root.ldap /etc/pki/openldap/certs/CAcert.pem
und mit folgenden Befehlen die Dateirechte:
# chmod 640 /etc/pki/openldap/private/key.pem # chmod 640 /etc/pki/openldap/certs/cert.pem # chmod 640 /etc/pki/openldap/certs/CAcert.pem
Durch Ausführen der oben genannten Befehle sieht der Inhalt des Verzeichnisses
/etc/pki/openldap
wie folgt aus, welches mit nachfolgendem Befehl aufgelistet werden kann:
# ls -la /etc/pki/openldap/* /etc/pki/openldap/certs: total 16 drwxr-xr-x 2 root root 4096 Dec 10 22:30 . drwxr-xr-x 4 root root 4096 Apr 21 10:04 .. -rw-r----- 1 root ldap 3248 May 5 2009 CAcert.pem -rw-r----- 1 root ldap 3318 May 5 2009 cert.pem /etc/pki/openldap/private: total 12 drwxr-xr-x 2 root root 4096 Dec 10 22:31 . drwxr-xr-x 4 root root 4096 Apr 21 10:04 .. -rw-r----- 1 root ldap 887 May 5 2009 key.pem
Die jeweiligen Arbeitskopien der gerade kopierten Dateien, können mit nachfolgenden Befehlen gelöscht werden:
# rm /etc/pki/tls/misc/*.pem rm: remove regular file `/etc/pki/tls/misc/key.pem'? y rm: remove regular file `/etc/pki/tls/misc/newcert.pem'? y rm: remove regular file `/etc/pki/tls/misc/newkey.pem'? y rm: remove regular file `/etc/pki/tls/misc/newreq.pem'? y
LDAPS Konfiguration: ldap.conf
Folgende Anpassungen der Konfigurationsdatei /etc/openldap/ldap.conf
genügen, um grundsätzlich einen LDAP-Server zu betreiben:
# # LDAP Defaults # # See ldap.conf(5) for details # This file should be world readable but not world writable. BASE dc=tachtler, dc=net URI ldap://ldap.tachtler.net #SIZELIMIT 12 #TIMELIMIT 15 #DEREF never # Tachtler TLS_REQCERT allow
WICHTIG - Der Eintrag
TLS_REQCERT allow
ignoriert das Scheitern der Überprüfung des Server-Zertifikats !!!
LDAPS Konfiguration: slapd.conf
Folgende Anpassungen der Konfigurationsdatei /etc/openldap/sldap.conf
sind notwendig, um grundsätzlich einen LDAP-Server zu betreiben (nur relevanter Ausschnitt):
...
# The next three lines allow use of TLS for encrypting connections using a
# dummy test certificate which you can generate by changing to
# /etc/pki/tls/certs, running "make slapd.pem", and fixing permissions on
# slapd.pem so that the ldap user or group can read it. Your client software
# may balk at self-signed certificates, however.
# Tachtler
TLSCipherSuite HIGH
# Tachtler
# default: TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
TLSCACertificateFile /etc/pki/openldap/certs/CAcert.pem
# Tachtler
# default: # TLSCertificateFile /etc/pki/tls/certs/slapd.pem
TLSCertificateFile /etc/pki/openldap/certs/cert.pem
# Tachtler
# default: # TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem
TLSCertificateKeyFile /etc/pki/openldap/private/key.pem
...
Beispielabfrage
1. Eine einfache Suchabfrage mittels ldapsearch
inklusive Anmeldung als „Ersatzbenutzer“ Ersatzauthentifizierer
nach der uid
:
# ldapsearch -d8 -x -LLL -H ldaps://ldap.tachtler.net -b "ou=People,dc=tachtler,dc=net" "uid=klaus" -W -D "cn=Ersatzauthentifizierer,dc=tachtler,dc=net" Enter LDAP Password: TLS certificate verification: Error, unable to get local issuer certificate TLS certificate verification: Error, certificate not trusted TLS certificate verification: Error, unable to verify the first certificate TLS: unable to get peer certificate. request done: ld 0x883c530 msgid 1 dn: uid=klaus,ou=People,dc=tachtler,dc=net uid: klaus cn: Klaus Tachtler objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount userPassword:: e3NaeBB0qSSxODhXSVQ3a1hiJgI2TZFqYU1MBiRlYtR0jXQ8dkRnGzP= shadowLastChange: 13990 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 500 gidNumber: 500 homeDirectory: /home/klaus gecos: Klaus Tachtler request done: ld 0x883c530 msgid 2
HINWEIS - Bitte beachten Sie die Angabe -d8
- Erweitertes Debugging
HINWEIS - Bitte beachten Sie die Abfrage mittels ldaps
2. Eine Überprüfung, ob das CACertificate, das Certificate und der Key zueinanderpassen, kann mit nachfolgender Abfrage durchgeführt werden:
# openssl s_client -connect ldap.tachtler.net:636 -showcerts -state -CAfile /etc/pki/openldap/certs/CAcert.pem -cert /etc/pki/openldap/certs/cert.pem -key /etc/pki/openldap/private/key.pem CONNECTED(00000003) SSL_connect:before/connect initialization SSL_connect:SSLv2/v3 write client hello A SSL_connect:SSLv3 read server hello A depth=1 /C=DE/ST=Bavaria (Bayern)/O=Klaus Tachtler/CN=tachtler.net/emailAddress=postmaster@tachtler.net verify return:1 depth=0 /C=DE/ST=Bavaria (Bayern)/O=Klaus Tachtler/CN=ldap.tachtler.net/emailAddress=postmaster@tachtler.net verify return:1 SSL_connect:SSLv3 read server certificate A SSL_connect:SSLv3 read server done A SSL_connect:SSLv3 write client key exchange A SSL_connect:SSLv3 write change cipher spec A SSL_connect:SSLv3 write finished A SSL_connect:SSLv3 flush data SSL_connect:SSLv3 read finished A --- Certificate chain 0 s:/C=DE/ST=Bavaria (Bayern)/O=Klaus Tachtler/CN=ldap.tachtler.net/emailAddress=postmaster@tachtler.net i:/C=DE/ST=Bavaria (Bayern)/O=Klaus Tachtler/CN=tachtler.net/emailAddress=postmaster@tachtler.net -----BEGIN CERTIFICATE----- MIIC+DACAmGgAwIBAgIBAjANBgkqhkiG9w0BAQUFADCBgDELMAkGA1UEBhMCREUx GTAXBgNVBAgTEEJhdmFyaWEgKEJheWVybikxFzAVBgNVBAoTDktsYXVzIFRhY2h0 bGVyMRUwEwYDVQQDEwx0YWNodGxlci5uZXQxJjAkBgkqhkiG9w0BCQEWF3Bvc3Rt YXN0ZXJAdGFjaHRsZXIubmV0MB4XDTEwMDQyMTEyNTc1M1oXDTM0MDIxNjEyNTc1 M1owgYUxCzAJBgNVBAYTAkRFMRkwFwYDVQQIExBCYXZhcmlhIChCYXllcm4pMRcw FQYDVQQKEw5LbGF1ccBUYWNodGxlcjEaMBgGA1UEAxMRbGRhcC50YWNodGxlci5u ZXQxJjAkBgkqhkiG9w0BCQEWF3Bvc3RtYXN0ZXJAdGFjaHRsZXIubmV0MIGfMA0G CSqGSIb3DQEBAQUAADFWADCBiQKBgQDFyzdPMAZVoX/w9q8Zh2CFWA6lAR94WnU1 BnUn6jqQxOX6YhnDGf/LH/AubRp65CRhpNKsEebp3bQO9B0ZLngvIeFoi1xvzGgi OkpYIRaF81frJ3rF6QYaXd3INUZTdTep/pzOrIYGEE80ob0+zGF5UW5v4mHD0QyI mrt4d9p4rQIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVu U1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUQbV3Z4CR1sqsIZyi 8Y6MJcttTnQwHwYDVR0jBBgwFoAUmq7rhfBOkI0MwsxiIT8JVi+aYaMwDQYJKoZI hvcNAQEFBQADgYEACMDYmhZxXhYVnazF1kiyHyzoF37gX6816RkNcxk9ODpaU0qL Ww+ftgXue+5BDbOwvQ7oJ1ZWHaxAQ7MST/uSkffFWiKj8PqmLyyDwxcZa7v/s4Ia ufj160M7f8E1iafxsrq6ZPQlEaAeBPn3ysxzIlrEOQNqR7xmb7t4Bzbi3mDc= -----END CERTIFICATE----- 1 s:/C=DE/ST=Bavaria (Bayern)/O=Klaus Tachtler/CN=tachtler.net/emailAddress=postmaster@tachtler.net i:/C=DE/ST=Bavaria (Bayern)/O=Klaus Tachtler/CN=tachtler.net/emailAddress=postmaster@tachtler.net -----BEGIN CERTIFICATE----- MIIC8zCCAlygAwIBAgIBADANBgkqhkiG9w0BAQUFADCBgDELMAkGA1UEBhMCREUx GTAXBgNVBAgTEEJhdmFyaWEgKEJztawybikxFzAVBgNVBAoTDktsYXVzIFRhY2h0 bGVyMRUwEwYDVQQDEwx0YWNodGxlci5uZXQxJjAkBgkqhkiG9w0BCQEWF3Bvc3Rt YXN0ZXJAdGFjaHRsZXIubmV0MB4XDTA5MDUwNTIwMzczMFoXDTM0MDIxNjIwMzcz MFowgYAxCzAJBgNVBAYTAkRFMRkwFwYDVQQIExBCYXZhcmlhIChCYXllcm4pMRcw FQYDVQQKEw5LbGF1cyBUYWNodGxlcjEVMBMGA1UEAxMMdGFjaHRsZXIubmV0MSYw JAYJKoZIhvcNAQkBFhdwb3N0bWFzdGVyQHRhY2h0bGVyLm5ldDCBnzANBgkqhkiG 9w0BAQEFAAOBjQAwgYkCgYEA269sjg3qloFyHZ7Nlsq/1kugUWkixyrIhC7YesAA 9Fqac8lzXP5WgwvlNQnrcrKNVolXI6mLsXp/CM6iH6V3pKFDXS7wQtfI8C86Kpc6 b5z02YoiWGcflYEhlQePfxv9Jpofeul8buYUBQWIW36ycLxbJ4J5JmuG1Byz0xc9 NDMCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFJopFmugTpCNDMLMYiE/CVYv mmGjMB8GA1UdIwwwtraAFJopFmugTpCNDMLMYiE/CVYvmmGjMA0GCSqGSIb3DQEB BQUAA4GBAI/uEyx+/xG0+gnCMrs5I3/qRlwhHgwejRBX793XRzss05UVBO6dfeXl r/GP4oKKpLW/PLsOaQeQ7OBrhmBOVGztNY91X81heQ7EhDaYt3iLl+ep87zuMDbc 42Nt40sBXZYpHarNNZLr0/684Niucx1GkKw/ax+enol5XSOnU5aU -----END CERTIFICATE----- --- Server certificate subject=/C=DE/ST=Bavaria (Bayern)/O=Klaus Tachtler/CN=ldap.tachtler.net/emailAddress=postmaster@tachtler.net issuer=/C=DE/ST=Bavaria (Bayern)/O=Klaus Tachtler/CN=tachtler.net/emailAddress=postmaster@tachtler.net --- No client certificate CA names sent --- SSL handshake has read 1695 bytes and written 319 bytes --- New, TLSv1/SSLv3, Cipher is AES256-SHA Server public key is 1024 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1 Cipher : AES256-SHA Session-ID: D1BCB9A0B9723D60EA2921965245F1F9DEBDD948D95107C11CB3649057884546 Session-ID-ctx: Master-Key: A6DDDE8AB60C1C7BE91E836CD5F6D3BBE3D8C6F5F0389B3116ACB450340CAB5D749AE0E4FE7B4506ED96E5AAF968ACDF Key-Arg : None Krb5 Principal: None Start Time: 1271855651 Timeout : 300 (sec) Verify return code: 0 (ok) ---