\subsection{LDAP}
\label{sub:ldap}

\begin{sloppypar}
Wir haben uns für den OpenLDAP-Server entschieden. Dazu haben wir als
Basis-\emph{DN} (Distinguished Name):
\begin{center}
\emph{dc=zotac,dc=lctp}
\end{center} festgelegt.
Die Benutzer legten wir unter
\begin{center}
\emph{dn: ou=users,dc=zotac,dc=lctp},
\end{center}
die Gruppen unter
\begin{center}
\emph{dn: ou=groups,dc=zotac,dc=lctp}
\end{center}
ab. Für den Import dieser \emph{DN}s haben wir eine Datei
\emph{/etc/openldap/base.ldif} (siehe \emph{aufgabe3.5/base.ldif}) erstellt. An
verfügbaren Schemata haben wir \emph{core, cosine, inetorgperson, nis}
eingestellt (siehe \emph{aufgabe3.5/slapd.conf}).

\end{sloppypar}

\subsubsection{Absicherung und Zugriff}

Wir haben die Zugriffsrechte so konfiguriert, dass jeder Benutzer sein eigenes
Passwort ändern kann, aber niemand das Passwort auslesen darf. Dieses wird nur
für zur Authentifizierung abgerufen werden. Alle anderen Attribute dürfen von
allen Users gelesen werden. (siehe \emph{aufgabe3.5/slapd.conf})

Um auf den Verzeichnisdienst zugreifen zu können, haben wir eine Datei
\emph{/etc/ldap.secret} mit dem Passwort für den Administrator-Account in LDAP
angelegt, die nur durch \emph{root}-Benutzer zugreifbar ist
(Verzeichnisberechtigung $600_8$).

\subsubsection{Client-Konfiguration (Head-Node und Compute-Node)}

\begin{sloppypar}
Hierfür haben wir die Variablen \emph{BASE, URI, TIMEOUT, NETWORK\_TIMEOUT} in
\emph{/etc/openldap/ldap.conf} entsprechend konfiguriert (siehe \emph{aufgabe3.5/ldap.conf}).
\end{sloppypar}

\paragraph{nsswitch}

Damit die Standard-Unix-Dienste auf die Benutzer aus LDAP zurückgreifen können,
haben wir \emph{/etc/nss\_ldap.conf} entsprechend konfiguriert (siehe
\emph{aufgabe3.5/nss\_ldap.conf}), sowie in \emph{/etc/nsswitch.conf} unter
\emph{files, shadow, group} jeweils noch \emph{ldap} hinzugefügt (siehe \emph{aufgabe3.5/nsswitch.conf}).

Dabei mussten wir darauf achten, dass in der \emph{nss\_ldap.conf} die
Bind-Policy auf \emph{soft} gesetzt wird, da es andernfalls beim Boot zu einer Race-Condition kommen kann, wenn der LDAP-Server noch nicht gestartet ist und das System dennoch versucht, über LDAP User-Daten abzufragen.

\paragraph{PAM}

Um die PAM-Authentifizierung nutzen zu können, haben wir unter \emph{/etc/pam.d}
folgende Dateien geändert (siehe Dateien in \emph{aufgabe3.5/pam.d}):
\begin{itemize}

\item \emph{system-auth}:
\begin{lstlisting}
	auth      sufficient  pam_ldap.so
	session   required    pam_exec.so     /usr/local/bin/first-login
\end{lstlisting}

\item \emph{sudo} und \emph{su}:
\begin{lstlisting}
	auth      sufficient  pam_ldap.so
\end{lstlisting}

\item \emph{passwd}:
\begin{lstlisting}
	password  sufficient  pam_ldap.so
\end{lstlisting}

\end{itemize}

\begin{sloppypar}
Damit ist sichergestellt, dass sich die LDAP-Benutzter authentifizieren können,
sowie \emph{sudo} und \emph{su} benutzen und ihr Passwort mit \emph{passwd} ändern können.

Durch die Zeile mit \emph{pam\_exec.so} wird bei jedem Login das Script
\emph{first-login} (siehe \emph{aufgabe3.5/first-login}) ausgeführt; das Script
wurde aus Aufgabe 2.3 übernommen und für die Einbindung in PAM angepasst. Es
wird nur ausgeführt, wenn das Home-Verzeichnis des Nutzers noch nicht existiert.

Das Script erstellt das Home-Verzeichnis des Nutzers, ändert den Besitzer und
die Gruppe des Verzeichnisses entsprechend, erzeugt ein Public-Private-Key-Paar
für SSH, kopiert eine Beispiel-SSH-Konfiguration in dessen Home-Verzeichnis und
trägt den eigenen Public-Key in die \emph{authorized\_keys} ein, so dass der
Benutzer sich fortan auf allen Nodes einloggen kann.
\end{sloppypar}

\paragraph{Anlegen und Löschen von Benutzern}

Zum Anlegen und Löschen von Benutzern aus einer Text-Datei (wie in der Aufgabe
gefordert) haben wir die Scripte \emph{ldap-users2ldif} (gibt auf der
Standardausgabe die Daten im LDIF-Format aus anhand der Text-Datei),
\emph{ldap-add-ldif} (fügt die im LDIF-Format vorliegenden
Benutzerbeschreibungen zur LDAP-Datenbank hinzu) und \emph{ldap-delete-users}
(löscht die in einer Text-Datei aufgelisteten Benutzer aus der LDAP-Datenbank)
geschrieben (siehe Dateien in \emph{aufgabe3.5/ldap-tools}).

Vorgehen um Systembenutzer zu erstellen, welche sich zeilenweise in einer Datei
befinden (in diesem Beispiel heißt die Datei \emph{user.txt}):

\begin{itemize}
\item \emph{sudo ldap-users2ldif user.txt > user.txt.ldif} \\
  \begin{itemize}
    \item erstellt eine \emph{.ldif}-Datei
    \item erstellt außerdem \emph{user.txt.passwords}, die die Benutzernamen und Passwörter zeilenweise enthält
    \item die Benutzernamen werden escaped (nur Kleinbuchstaben, Zahlen und »\_«, invalide Zeichen durch »\_« ersetzt, »\_« am Anfang und am Ende gestript)
    \item Passwörter werden zufällig erzeugt (mindestens jeweils ein Großbuchstabe, Kleinbuchstabe, Sonderzeichen und mindestens eine Zahl, zwischen 10 und 16 Zeichen lang)
    \item bereits existierende Benutzer oder doppelt vorkommende Nutzer werden mit einer Warnmeldung quittiert und ignoriert
  \end{itemize}

\item \emph{sudo ldap-add-ldif user.txt.ldif} \\
  \begin{itemize}
    \item fügt die \emph{.ldif}-Datei zu LDAP hinzu
  \end{itemize}

\item \emph{sudo ldap-delete-users user.txt.passwords} \\
  \begin{itemize}
      \item löscht die in der erzeugten Datei \emph{user.txt.passwords} zeilenweise aufgelisteten Benutzer und entfernt ihr Home-Verzeichnis (diese Datei ist notwendig, weil die Benutzernamen unter Umständen escaped wurden)
  \end{itemize}
\end{itemize}
