Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:ldap_centos_5

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 management
  • 32 Search filter processing
  • 256 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:

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)
---
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/ldap_centos_5.txt · Zuletzt geändert: 2012/06/11 11:14 von klaus