\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. 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}).
