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

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

\end{sloppypar}

\subsubsection{Absicherung und Zugriff}

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

Damit auf den Verzeichnisdienst zugegriffen werden kann, haben wir eine Datei {\tt /etc/ldap.secret} mit dem Passwort für den Administrator-Account in LDAP angelegt, die nur durch {\tt root} zugreifbar ist ({\tt chmod 600}).

\subsubsection{Client-Konfiguration (Headnode und Computenode)}

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

\paragraph{nsswitch}

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

Dabei mussten wir darauf achten, dass in der {\tt nss\_ldap.conf} die Bind-Policy auf {\tt 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 {\tt /etc/pam.d} folgende Dateien geändert (siehe Dateien in {\tt aufgabe3.5/pam.d}):
\begin{itemize}

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

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

\item {\tt 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 {\tt sudo} und {\tt su} benutzen und ihr Passwort mit {\tt passwd} ändern können.

Durch die Zeile mit {\tt pam\_exec.so} wird bei jedem Login das Script {\tt first-login} (siehe {\tt aufgabe3.5/first-login}) ausgeführt; das ist faktisch das Script aus Aufgabe 2.3, nur angepasst für die Einbindung in PAM. Dieses wird generell 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 sein Home-Verzeichnis und trägt den eigenen Public-Key in die {\tt 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 {\tt ldap-users2ldif} (erstellt einen {\tt .ldif} Output anhand der Text-Datei), {\tt ldap-add-ldif} (fügt die im {\tt .ldif} Format vorliegenden Benutzerbeschreibungen zur LDAP-Datenbank hinzu) und {\tt ldap-delete-users} (löscht die in einer Text-Datei aufgelisteten Benutzer aus der LDAP-Datenbank) geschrieben (siehe Dateien in {\tt aufgabe3.5/ldap-tools}).

Für eine Datei, z.B. {\tt user.txt}, die die hinzuzufügenden Benutzernamen zeilenweise enthält:

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

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

\item {\tt sudo ldap-delete-users user.txt.passwords} \\
	löscht die in der erzeugten Datei {\tt 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}