%
% ldapserver.tex
% Last Update: $Id$
%
%%%%%%%%%%%%%%%%%%%%%%%%%%% Kapitel Ldapserver %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Achtung: Dateien muessen mit latin1-Encoding gespeichert werden!
% Attention: Files must be saved using latin1 encoding!
%

\chapter{Das LDAPserver-Paket}

    Dieses Paket ist eine Weiterentwicklung des openldap-Paketes von
    Jens Vehlhaber (E-MAIL \kmail{jvehlhaber@buchenwald.de}). Es
    enth"alt einzig die LDAP-Server-Programme, die LDAP-Client-Programme
    wurden in ein eigenst"andiges Paket mit Namen 'LDAPclient' ausgelagert.


\section{Die Einleitung}

    In diesem Paket wurden die f"ur den Betrieb eines LDAP-Servers
    (Lightweight Directory Access Protocol) ben"otigten Programme
    zusammengefasst.


\section{Die Funktionen}

    Das LDAPserver-Paket besteht aus folgenden Komponenten:

    \begin{itemize}
        \item openldap - enth"alt die LDAP Serverkomponenten.\\
            (\url{http://www.openldap.org/})
    \end{itemize}


\section{Die Voraussetzungen}

    Dieses Paket ben"otigt zur korrekten Funktion die folgenden Pakete:
    certs (bei Aktivierung der Verschl"usselung), ldapclient,
    libdb4, libkrb5-1-4, libldap, libsasl, libssl und libwrap7-6.


\section{Die Installation}

    Das LDAPserver-Paket wird "uber das Setup-Men"u installiert. Wird eine
    "altere Paketversion vorgefunden, so wird diese deinstalliert bevor die
    neuen Programmdateien installiert werden. Nach dem Installieren der
    Programmdateien wird direkt der Konfigurations-Editor gestartet um die
    Konfiguration anzupassen. Nach Beendigung dieses Schrittes werden die
    Konfigurationsdateien generiert und alle ben"otigten Programme gestartet.


\section{Das Men"u im Setup-Programm}

    Das Men"u im Setup-Programm ist wie folgt aufgebaut:

    \begin{itemize}
        \item OpenLDAP Server Administration
        \begin{itemize}
            \item View documentation: Anzeigen der Dokumentation
            \item Edit configuration: Bearbeiten der Konfiguration
            \item Advanced configuration file handling: Konfigurationen verwalten
            \item Show status: Status des LDAP-Daemon anzeigen
            \item Start service: Starten des LDAP-Daemon
            \item Stop service: Stoppen LDAP-Daemon
            \item Restart service: Neustarten des LDAP-Daemon
            \item Create new LDAP tree: Neuen LDAP-Verzeichnisbaum anlegen
            \item Backup LDAP database: LDAP-Verzeichnisbaum sichern
            \item Restore LDAP database: LDAP-Verzeichnisbaum wiederherstellen
            \item Return: Untermen"u verlassen
        \end{itemize}
    \end{itemize}

    Die Men"upunkte d"urften selbsterkl"arend sein, da sie keinerlei weitere
    Eingaben erwarten. Aus diesem Grund wird auf deren Funktion nicht weiter
    eingegangen.


\section{Die "Anderung der Konfiguration}

    Die Konfiguration kann "uber den Men"upunkt 'Edit configuration' ge"andert
    werden. Standardm"a"sig wird der Editor aufgerufen, der in der Environment-
    Konfiguration "uber die Variable 'EDITOR' festgelegt wurde. Nachdem der
    Editor beendet wurde wird abgefragt, ob die Konfiguration aktiviert werden
    soll. Wird dies best"atigt, werden "uber ein Skript die Anpassungen umgehend
    wirksam gemacht.


\section{Die Konfigurationsdatei}

    In der Konfigurationsdatei, die "uber das Men"u zug"anglich ist, sind
    folgende Parameter vorhanden; wer sie von Hand editieren will findet
    sie unter \texttt{/etc/config.d/ldapserver}.


\section{Die Parameter}

\begin{description}
%%  JED - show this description only in the help file
 %  \config{LDAPSERVER\_DO\_DEBUG}{LDAPSERVER\_DO\_DEBUG}{LDAPSERVERDODEBUG}
 %      Optionaler Parameter: Um den Debug-Modus zu aktivieren muss dieser
 %      Parameter auf den Wert `yes' gesetzt werden, der Wert `no' deaktivert
 %      den Debug-Modus.
 %
 %      G"ultige Werte: yes, no
 %
 %      Standardeinstellung: \texttt{LDAPSERVER\_DO\_DEBUG='no'}

    \config{START\_LDAPSERVER}{START\_LDAPSERVER}{STARTLDAPSERVER}
        Zur Aktivierung des LDAP-Serverprogramms muss dieser Parameter
        lediglich auf den Wert 'yes' gestellt werden. Die Einstellung
        'no' deaktiviert das Programm.

        G"ultige Werte: yes, no

        Standardeinstellung: \texttt{START\_LDAPSERVER='no'}

    \config{LDAPSERVER\_LDAP\_BASEDC}{LDAPSERVER\_LDAP\_BASEDC}{LDAPSERVERLDAPBASEDC}
        Dieser Parameter zeigt die Basisdomain des LDAP-Verzeichnisbaums
        an und kann einmalig nur beim Anlegen eines neuen LDAP-Verzeichnisbaums
        festgelegt werden. Falls noch kein LDAP-Verzeichnis existiert,
        wird dieser Parameter initial w"ahrend des Konfigurationsprozesses
        abgefragt.

        G"ultige Werte: Base Domain Component

        Standardeinstellung: \texttt{LDAPSERVER\_LDAP\_BASEDC='privatnet'}

    \config{LDAPSERVER\_LDAP\_BASEDN}{LDAPSERVER\_LDAP\_BASEDN}{LDAPSERVERLDAPBASEDN}
        Dieser Parameter zeigt den Base Distinguished Name des LDAP-Verzeichnisses
        an und kann einmalig nur beim Anlegen eines neuen LDAP-Verzeichnisbaums
        festgelegt werden. Falls noch kein LDAP-Verzeichnis existiert, wird
        dieser Parameter initial w"ahrend des Konfigurationsprozesses abgefragt.

        G"ultige Werte: Base Distinguished Name

        Standardeinstellung: \texttt{LDAPSERVER\_LDAP\_BASEDN='dc=privatnet,dc=lan'}

    \config{LDAPSERVER\_LDAP\_ADMIN\_NAME}{LDAPSERVER\_LDAP\_ADMIN\_NAME}{LDAPSERVERLDAPADMINNAME}
        Dieser Parameter zeigt den Namen des LDAP-Administrators an und
        kann einmalig nur beim Anlegen eines neuen LDAP-Verzeichnisbaums
        festgelegt werden. Falls noch kein LDAP-Verzeichnis existiert,
        wird dieser Parameter initial w"ahrend des Konfigurationsprozesses
        abgefragt.

        G"ultige Werte: LDAP-Accountname

        Standardeinstellung: \texttt{LDAPSERVER\_LDAP\_ADMIN\_NAME='ldapadmin'}

    \config{LDAPSERVER\_LDAP\_ADMIN\_PASS}{LDAPSERVER\_LDAP\_ADMIN\_PASS}{LDAPSERVERLDAPADMINPASS}
        "Uber diesen Parameter kann das Kennwort des LDAP-Administratorkontos
        festgelegt werden.

        G"ultige Werte: g"ultiges Kennwort

        Standardeinstellung: \texttt{LDAPSERVER\_LDAP\_ADMIN\_PASS=$''$}

    \config{LDAPSERVER\_TRANSPORT}{LDAPSERVER\_TRANSPORT}{LDAPSERVERTRANSPORT}
        "Uber diesen Parameter kann ausgew"ahlt werden "uber welchen Transport
        der LDAP-Server angesprochen werden kann. Es kann zwischen dem
        Standardtransport "uber Port 389/tcp, dem verschl"usselten Transport
        "uber Port 636/tcp oder der Aktivierung beider Varianten gew"ahlt werden.\\
        \achtung{Um den verschl"usselten Transport ausw"ahlen zu k"onnen muss
            ein g"ultiges Zertifikat mit Namen 'slapd.pem' oder ein symbolischer
            Link gleichen Namens, welcher auf ein g"ultiges Zertifikat verweist,
            existieren.}

        G"ultige Werte: default, tls or both

        Standardeinstellung: \texttt{LDAPSERVER\_TRANSPORT='default'}

    \config{LDAPSERVER\_TLS\_PROTOCOL}{LDAPSERVER\_TLS\_PROTOCOL}{LDAPSERVERTLSPROTOCOL}
        "Uber diesen Parameter kann festgelegt werden welches TLS-Protokoll
        f"ur die verschl"usselte Kommunikation verwendet werden soll.

        G"ultige Werte: none, auto, tls1, ssl3 oder ssl2

        Standardeinstellung: \texttt{LDAPSERVER\_TLS\_PROTOCOL='none'}

    \config{LDAPSERVER\_CLIENT\_FORCE\_TLS}{LDAPSERVER\_CLIENT\_FORCE\_TLS}{LDAPSERVERCLIENTFORCETLS}
        "Uber diesen Parameter kann festgelegt werden, ob ein Client-Zertifikat
        abgefragt werden soll und wie dieses gepr"uft werden soll.

        ignore - Ein Client-Zertifikat wird nicht abgefragt oder
                 ausgewertet.

        yes    - Ein Client-Zertifikat wird abgefragt. Wird kein
                 Zertifikat zur Verf"ugung gestellt oder ein
                 ung"ultiges Zertifikat zur Verf"ugung gestellt,
                 so wird eine Verbindung umgehend beendet.

        no     - Ein Client-Zertifikat wird abgefragt. Wird kein
                 Zertifikat zur Verf"ugung gestellt, so wird eine
                 Verbindung aufrecht erhalten. Wird ein ung"ultiges
                 Zertifikat zur Verf"ugung zur Verf"ugung gestellt,
                 so wird eine Verbindung umgehend beendet.

        G"ultige Werte: ignore, yes, no

        Standardeinstellung: \texttt{LDAPSERVER\_CLIENT\_FORCE\_TLS='ignore'}

    \config{LDAPSERVER\_MONITOR\_ENABLED}{LDAPSERVER\_MONITOR\_ENABLED}{LDAPSERVERMONITORENABLED}
        "Uber diesen Parameter kann man festlegen, ob die Monitoring-Funktion
        des LDAP-Servers aktiviert werden soll oder nicht. Mit welchen Befehlen
        diese Monitordaten abgefragt werden k"onnen wird sp"ater noch weiter
        eingegangen.

        G"ultige Werte: yes, no

        Standardeinstellung: \texttt{LDAPSERVER\_MONITOR\_ENABLED='no'}

    \config{LDAPSERVER\_BACKUP}{LDAPSERVER\_BACKUP}{LDAPSERVERBACKUP}
        "Uber diesen Parameter kann die regelm"a"sige Sicherung der
        LDAP-Datenbank aktiviert werden. Wird der Parameter auf `yes'
        gesetzt, so wird zum festgelegten Zeitpunkt der LDAP-Server
        gestoppt, die Datensicherung durchgef"uhrt und dann der
        LDAP-Server wieder gestartet. Die Einstellung 'no' deaktiviert
        die Sicherungsfunktion.

        G"ultige Werte: yes, no

        Standardeinstellung: \texttt{LDAPSERVER\_BACKUP='no'}

    \config{LDAPSERVER\_BACKUP\_PATH}{LDAPSERVER\_BACKUP\_PATH}{LDAPSERVERBSCKUPPATH}
        "Uber diesen Parameter wird der absolute Pfad festgelegt in
        welchem die LDAP-Datenbank gesichert werden soll. Im angegebenen
        Verzeichnis wird dann zum festgelegten Zeitpunkt eine
        Sicherungsdatei abgelegt, deren Dateiname sich wie folgt
        zusammensetzt: $<$LDAPSERVER\_LDAP\_BASEDN$>$-$<$DATE$>$-$<$TIME$>$.ldif

        G"ultige Werte: Absoluter Verzeichnispfad

        Standardeinstellung: \texttt{LDAPSERVER\_BACKUP\_PATH='/backup'}

    \config{LDAPSERVER\_BACKUP\_CRON\_SCHEDULE}{LDAPSERVER\_BACKUP\_CRON\_SCHEDULE}{LDAPSERVERBSCKUPCRONSCHEDULE}
        "Uber diesen Parameter wird festgelegt zu welchem Zeitpunkt bzw.
        in welchem Intervall die LDAP-Datenbank gesichert werden soll.
        Die f"unf Teilparameter haben dabei folgende Bedeutung:\\
        1 - Minuten, 2 - Stunden, 3 - Tag des Monats, 4 - Monat, 5 - Wochentag.

        D.h. bei Verwendung der Standardeinstellung wird jeden Sonntag
        um 02:03h eine Sicherung der LDAP-Datenbank durchgef"uhrt. Wer
        N"aheres "uber die verwendete Befehlssyntax erfahren m"ochte,
        sollte "uber eine Internet-Suchmaschine nach `man' und `crontab'
        suchen.

        G"ultige Werte: Crontab-spezifischer Parametereintrag

        Standardeinstellung: \texttt{LDAPSERVER\_BACKUP\_CRON\_SCHEDULE='3 2 * * 0'}
\end{description}


\section{Verschiedenes}
\begin{description}
    \config{Neuen LDAP-Verzeichnisbaum anlegen (Create new LDAP tree)}{Neuen LDAP-Verzeichnisbaum anlegen}{NeuenLDAP-Verzeichnisbaumanlegen}
        Nach der Installation des Paketes wird automatisch ein initialer
        LDAP-Verzeichnisbaum angelegt. Will man die grundlegende
        Struktur des Verzeichnisbaums jedoch modifizieren, so kann man
        "uber diesen Men"upunkt eine bestehende LDAP-Datenbank l"oschen
        und mittels einer LDIF-Datei neu anlegen.

    \config{LDAP-Monitorinformationen abfragen}{LDAP-Monitorinformationen abfragen}{LDAP-Monitorinformationenabfragen}
        Hat man den Parameter \jump{LDAPSERVERMONITORENABLED}{LDAPSERVER\_MONITOR\_ENABLED='yes'}
        gesetzt, so ist es m"oglich Statusinformationen vom LDAP-Server
        abzufragen. Eine Abfrage kann z.B. wie folgt aussehen (Nat"urlich
        sind die Parameter entsprechend der eigenen Konfiguration anzupassen):

        \texttt{ldapsearch -h localhost -x -D cn=ldapadmin,dc=privatnet,dc=lan -b 'cn=Monitor' -W -s base '(objectClass=*)' '*' '+'}

        Will man z.B. die verf"ugbaren Backends anzeigen, so gibt man den
        folgenden Befehl ein:

        \texttt{ldapsearch -h localhost -x -D cn=ldapadmin,dc=privatnet,dc=lan -b 'cn=Backends,cn=Monitor' -W -s base '(objectClass=*)' '*' '+'}

    \config{Verschl"usselte Verbindung testen}{Verschluesselte Verbindung testen}{VerschluesselteVerbindungtestenLDAPSERVER}
        Mit Hilfe des Openssl-Programms kann man testen, ob eine
        verschl"usselte Verbindung zum LDAP-Server aufgebaut werden
        kann. Hierzu gibt man z.B. an der Konsole folgenden Befehl
        ein (Nat"urlich sind die Parameter entsprechend der eigenen
        Konfiguration anzupassen):

        \texttt{openssl s\_client -connect localhost:636 -showcerts -state -CAfile /var/certs/ssl/certs/ca.pem}

    \config{SQL-Fehlermeldungen in der Logdatei}{SQL-Fehlermeldungen in der Logdatei}{SQL-FehlermeldungeninderLogdatei}
        Beim Start des LDAP-Daemon werden unter Umst"anden folgende
        Meldungen in die Logdatei \texttt{/var/log/messages}
        geschrieben:

\begin{verbatim}
eis slapd[19429]: sql_select option missing
eis slapd[19429]: auxpropfunc error no mechanism available
eis slapd[19429]: _sasl_plugin_load failed on sasl_auxprop_plug_init
                  for plugin: sql
\end{verbatim}

        Diese Meldungen werden durch die im Verzeichnis \texttt{/usr/lib/sasl2}
        befindlichen SQL-Include-Dateien 'libsql.so*' verursacht, welche
        bei der Initialisierung der SASL2-Funktionen geladen werden.
        Diese Meldungen haben keinen Einfluss auf die Funktionen des
        LDAP-Servers und k"onnen ignoriert werden. Alternativ k"onnen
        auch die genannten Include-Dateien umbenannt bzw. gel"oscht
        werden, was unter Umst"anden jedoch die Funktion anderer Pakete
        beeinflussen kann.

    \config{LDAP-Client-Programme/-Editoren}{LDAP-Client-Programme/-Editoren}{LDAPClientProgrammeEditoren}
        Hier ein paar Client-Programme "uber welche ich bei der
        Paketerstellung gestolpert bin:

        \begin{itemize}
            \item LDAP-Admin (Windows) - \url{http://ldapadmin.sourceforge.net/}
            \item phpLDAPadmin (Web) - \url{http://phpldapadmin.sourceforge.net/}
            \item LDAPExplorerTool (Windows/Linux) - \url{http://ldaptool.sourceforge.net/}
        \end{itemize}

    \config{LDAP-L"anderformat}{LDAP-Laenderformat}{LDAPLaenderformat}
        Die standardm"a"sig ausgelieferten LDAP-Schemata legen fest, dass
        die Felder 'c', 'countryName' und 'mozillaHomeCountryName' einen
        zweistelligen L"anderkode nach ISO-3166 enthalten d"urfen.
        Da das urspr"ungliche openldap-Paket eine solche Einschr"ankung
        nicht vorgenommen hat, werden aus Gr"unden der Kompatibilit"at
        modifizierte Schemata mitgeliefert.
        Diese Dateien werden verwendet, wenn bei der Installation ein
        installiertes openldap-Paket gefunden wird. Bei einer
        Neuinstallation werden die Standarddateien verwendet.

        Beispiel:

        Belgien       -$>$ BE
        Deutschland   -$>$ DE
        Liechtenstein -$>$ LI
        Luxemburg     -$>$ LU
        Niederlande   -$>$ NL
        "Osterreich    -$>$ AT
        Schweiz       -$>$ CH

    \config{Weitere LDAP-Befehle}{Weitere LDAP-Befehle}{WeitereLDAPBefehle}
        Exportieren des LDAP-Verzeichnisbaums:

        \texttt{ldapsearch -x -D "cn=ldapadmin,dc=privatnet,dc=lan" -W > output.ldif}

        Importieren einer LDIF-Datei in das LDAP-Verzeichnis:

        \texttt{ldapadd -x -D ""cn=ldapadmin,dc=privatnet,dc=lan" -W -f input.ldif}
\end{description}


\section{Die unterst"utzten LDAP-Backends}
    Der LDAP-Server unterst"utzt verschiedene Wege, um mit seiner Umgebung
    zu kommunizieren. Diese Schnittstellen werden 'Backend' genannt.

    config - Diese Schnittstelle gew"ahrt den Zugriff auf die Konfiguration
             eines LDAP-Servers.

    bdb - Die Oracle Berkeley Datenbank wird standardm"a"sig f"ur das
          Speichern der LDAP-Daten verwendet.

    hdb - Die Hierarchical Oracle Berkeley Datenbank ist gr"o"stenteils
          identisch mit der 'bdb', unterst"utzt jedoch zus"atzlich einen
          hierarchisches Datenbankaufbau und und erlaubt das Umbenennen
          von Datenbankzweigen.

    ldap - Die LDAP-Schnittstelle leitet Anfragen an einen entfernten
           LDAP-Server weiter und agiert als eine Art Forwarding Proxy
           f"ur LDAP-Anfragen.

    ldif - Die LDIF-Schnittstelle speichert LDAP-Daten im LDIF-Dateiformat.

    meta - Diese Schnittstelle ist gr"o"stenteils identisch mit der
           'ldap', dient aber haupts"achlich dazu Anfragen an mehrere
           entfernte LDAP-Server weiter zu leiten und erlaubt zus"atzlich
           die Maskierung von Datenbankzweigen.

    monitor - Diese Schnittstelle gew"ahrt den Zugriff auf Statusdaten
              eines LDAP-Servers.

    relay - Diese Schnittstelle erlaubt es in der gleichen LDAP-Instanz
            Datenbankzweige umzubenennen und in virtuelle Zweige umzuleiten.
            Dabei k"onnen Attribut- und Objekteigenschaften manipuliert
            werden.

\section{Regelm"a"sige LDAP-Anfragen von Windows Klienten}
    Bei der Pr"ufung der LDAP Log-Eintr"age stellte ich fest, dass alle 15min
    eine LDAP-Suchanfrage von meinen Windows-Klienten erfolgte, die ich mir
    nicht erkl"aren konnte.\\
    Eine Analyse mittels des MS Network Monitors ergab, dass diese von dem
    Prozess LSASS.EXE veranlasst wurden. Die anschlie"sende Suche im Internet
    ergab, dass diese Anfragen Teil des Sicherheitsprozesses eines Windows-
    Rechners ist, der versucht einen Active Directory Server zu befragen.
    Mir ist kein Weg bekannt wie diese Anfragen eventuell unterbunden werden
    k"onnen, sodass man wohl damit leben muss.

    Die Details dieses Prozesses werden hier erkl"art:
    \url{http://blogs.technet.com/b/askds/archive/2009/09/21/understanding-ldap-security-processing.aspx}

\section{Das Glossar}
    \begin{itemize}
        \item BaseDN - Base Distinguished Name
        \item DN     - Distinguished Name
        \item LDAP   - Lightweight Directory Access Protocol
        \item RDN    - Relative Distinguished Name
    \end{itemize}

