% <#>-----------------------------------------------------------------------<#>
\section{SSH}%
\label{sec:ssh}

Genau so wie eine Anmeldung am Linux-Rechner über ein Terminal (\textit{tty}),
ist auch die Anmeldung eines Benutzers über das Netzwerk möglich. Das gleichnamige Programm und Protokoll \acrfull{acr:telnet} wurde durch das gleichnamige Programm und Protokoll \acrfull{acr:ssh} in laufe der Zeit ersetzt.

Bei der ersten Implementierung von \acrshort{acr:ssh} wird eine unverschlüsselte
Verbindung zwischen den beteiligten Rechnern aufgebaut und die Identifizierung
des Benutzers erfolgt nur durch dessen Namen und Passwort. Beim der zweiten
Implementierung von \acrshort{acr:ssh}, wird eine verschlüsselte Verbindung
aufgebaut, die sowohl das Abhören der Login-Daten, als auch der später
gesendeten Daten, nahezu unmöglich macht. Es wird sowohl ein rechnerspezifischer
Schlüssel als auch ein benutzerspezifischer Schlüssel zur Verschlüsselung und
Idenzifizierung verwendet.

Zu Testzwecken können die nachfolgenden Aufgaben über eine Verbindung zu
dem lokal laufenden \acrshort{acr:ssh}-Server gelöst werden.

% #>------------------------------------------------------------------------<#
\subsection{Relevante Befehle für die weiteren Übungen}%
\label{sec:ssh.relevante_befehle_fuer_die_weiteren_uebungen}

\begin{itemize}[label={},itemsep=0pt]
  \item \textit{ssh:} Stellt eine verschlüsselte Verbindung zwischen zwei
  Rechnern her, über die neben der Shell auch andere Programme angesprochen
  werden können.
  \item \textit{scp:} Ermöglicht das bidirektionale kopieren von Dateien und Verzeichnissen zwischen zwei Rechnern über eine \acrshort{acr:ssh}-Verbindung.
\end{itemize}

% #>------------------------------------------------------------------------<#
\subsection{Relevante Konfigurationsdateien}%
\label{sec:ssh.relevante_konfigurationsdateien}

\begin{itemize}[label={}]
  \item \textit{/etc/ssh/sshd\_config:} Konfigurationsdatei des
  \acrshort{acr:ssh}-Servers.
  \item \textit{/etc/ssh/ssh\_config:} Systemweite \acrshort{acr:ssh}-Client Konfiguration.
  \item \textit{\textasciitilde/.ssh:} Enthält Benutzerspezifische \acrshort{acr:ssh}-Client Konfigurationen und Metainformationen.
\end{itemize}

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 2a:} Erkundigen Sie sich nach ihren
  \acrshort{acr:ssh}-Zugangsdaten, um sich am \acrshort{acr:ssh}-Server der
  Hochschule Trier anmelden zu können.
  \item \textbf{Aufgabe 2b:} Melden Sie sich mit ihren
  \acrshort{acr:ssh}-Zugangsdaten per \acrshort{acr:ssh} an dem \acrshort{acr:ssh} -Server der
  Hochschule Trier an.
\end{itemize}

% #>------------------------------------------------------------------------<#
\subsection{Authentifizierungsverfahren}%
\label{sec:ssh.authentifizierungsverfahren}

Bei \acrshort{acr:ssh} werden asymetrische Verschlüsselungsverfahren (Public-Key
Verfahren) eingesetzt. Wie Sie bei der ersten Verbindung bereits festgestellt
haben, werden die SSH-Server durch ein Schlüsselpaar identifiziert (\textit{Sie
mussten den öffentlichen Schlüssel des Servers bei der ersten Verbindung
akzeptieren}). In einer Umgebung mit erhöhtem Sicherheitsbedarf würde man den
angezeigten Fingerabdruck des Schlüssels mit einem vorher über einen anderen
Kanal übermittelten Fingerabdruck vergleichen, um eine sichere Verbindung zu
einem gefälschten Server zu vermeiden.

Die akzeptierten öffentlichen Schlüssel des Servers werden zur Abwehr von
Man-in-the-Middle Attacken in der Datei \textit{known\_hosts} gespeichert. Diese
befindet sich im Unterverzeichnis \textit{.ssh} des Heimatverzeichnis des
verwendeten Benutzers.

Solange der private Schlüssel nicht abhanden kommt und auf dritten Server
repliziert und konfiguriert wird, ist bei der aktuellen Protokollversion 2 keine
umbemerkte Man-in-the-Middle Attacke möglich. Passt der auf dem Client
gespeicherte öffentliche Schlüssel nicht zu dem öffentlichen Schlüssel, den der
Server beim Verbindungsaufbau übermittelt, wird der weitere Verbindungsaufbau
mit einer entsprechenden Warnung abgebrochen.

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 3a:} Nachdem Sie sich das erste mal per \textit{ssh} mit
  dem \acrshort{acr:ssh}-Server der Hochschule Trier erfolgreich verbunden
  haben. Überprüfen Sie die Dateiberechtigungen für den Ordner
  \textit{\textasciitilde/.ssh} auf ihrer lokalen VM. Was fällt Ihnen in Vergleich zu anderen Verzeichnissen auf?
\end{itemize}

Sie haben sich an ihrem lokal laufenden SSH-Server oder den der Hochschule Trier
mit Benutzername und Passwort angemeldet. Die Daten werden zwar verschlüsselt
übertragen und können daher auch nicht abgehört werden, aber ein Angreifer kann
beliebig viele Passwörter per Brute-Force-Attacke an ihrem oder dem Server der
Hochschule Trier ausprobieren. Bei schwachen Passwörtern wird es daher nicht
allzu lange dauern, bis ein ernsthafter Angreifer erfolg hat. Bei einer frisch
in Betrieb genommenen virtuellen Maschine in einem Rechenzentrum dauert es meist
nur wenige Stunden, bis der erste derartige Angriff erfolgt! Daher sollte man so
schnell wie möglich auf ein besseres Verfahren umstellen.

Ähnlich wie die Authentifizierung der Rechner kann auch die Authentifizierung
der Benutzer per Public-Key Verfahren konfiguriert werden. Der Benutzer, der
sich unter einem entfernten Benutzer anmelden möchte, muss auf seinem lokalen
Rechner ein Schlüsselpaar generieren und den öffentlichen Schlüssel im
Heimatverzeichnis des entfernt liegenden Benutzer hinzufügen. Bei einem späteren
Login wir dann mit Hilfe des privaten Schlüssels des Client authentifiziert und
der Login gewährt.

Die Schlüssel werden ebenfalls im Verzeichnis \textit{\textasciitilde/.ssh}
gespeichert. Ändert man bei der Erzeugung des Schlüsselpaares den dazugehörigen
Dateinamen, muss dieser bei jeder Verwendung angegeben werden! Alternativ kann
auch die Konfigurationsdatei \textit{\textasciitilde/.ssh/config} erstellt
werden, um dort den zugehörigen Schlüssel explizit anzugeben. Das Schlüsselpaar
kann optional mit einer Passphrase (Passwort) gesichert werden. Falls man jedoch
automatische Logins z.B. für Backups benötigt, sollte man auf diese zusätzliche
Sicherung verzichten, da dies sonst nicht mehr automatisch (non-interactive)
durch Jobs möglich ist.

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 3b:} Generieren Sie für ihren lokalen Benutzer eine
  Schlüsselpaar mit dem \textit{ed25519} Algorithmus. Der Befehl \textit{ssh-keygen}
  erzeugt Schlüsselpaare. Informieren Sie sich über \textit{ssh-keygen} per \textit{man ssh-keygen}.
  \item \textbf{Aufgabe 3c:} Ermitteln Sie mit Hilfe der man-page via
  \textit{man ssh-keygen} den Namen der Datei, in der der öffentliche Schlüssel
  auf dem entfernten Rechner hinterlegt werden muss.
  \item \textbf{Aufgabe 3d:} Mit dem Befehl \textit{scp} können Dateien über ein
  \acrshort{acr:ssh}-Tunnel von einem Rechner zu einem anderen kopiert werden.
  Die Syntax lautet: \textit{scp quelle ziel}. Beide Adressen enthalten einen
  Pfad an dem die Ressourcen zu finden bzw. zu kopieren sind. Nur die entfernte
  Adresse benötigt zusätzlich noch weitere Informationen wie Benutzername und
  Rechnername bzw. IP des entfernten Systems. Die Adresse würde folgendem Schema
  entsprechen \textit{user@rechner:pfad}. Kopieren Sie mit Hilfe von
  \textit{scp} ihren öffentlichen Schlüssel in das Heimatverzeichnis ihres
  entfernten Benutzers.
  \item \textbf{Aufgabe 3e:} Der kopierte Schlüssel auf dem entfernten System
  muss der Datei aus Aufgabe 3c hinzugefügt werden.
  \item \textbf{Aufgabe 3f:} Nachdem der öffentliche Schlüssel erfolgreich
  kopiert und konfiguriert wurde, öffnen Sie eine zweite
  \acrshort{acr:ssh}-Verbindung ohne Eingabe des Passworts.
\end{itemize}

% #>------------------------------------------------------------------------<#
\subsection{Absicherung des SSH-Servers}%
\label{sec:ssh.absicherung_des_ssh-servers}

Nachdem die Authentifizierung mit dem Public-Key-Verfahren erfolgreich getestet
wurde, kann im nächsten Schritt die unsichere Passwort-Authentifizierung auf dem
Server abgeschaltet werden. Dabei ist zu beachten, dass bei einem Neustart des
\acrshort{acr:ssh}-Servers bestehende Verbindungen gehalten werden. Vor dem
Logout sollte daher nach einer Konfigurationsänderung immer getestet werden, ob
der Login noch möglich ist. Falls man sich bei dieser Gelegenheit selbst vom
Server aussperrt, sind "Helping Hands" vom Provider meist nicht billig zu haben.

\begin{info-popup}
  Dies ist für den Server \textit{ssh.hochschule-trier.de} nicht möglich, mangels
  Berechtigungen. Führen Sie daher die Abschaltung an ihrem lokalen \acrshort{acr:ssh}-Server
  durch.
\end{info-popup}

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 4a:} Wie heißt der Eintrag in der Konfigurationsdatei
  des Server, mit dem der Zugang für den Benutzer \textit{root} eingestellt
  werden kann? Genaueres Betrachten der Konfigurationsdatei sollte schon zum
  Ergebnis führen.
  \item \textbf{Aufgabe 4b:} Stellen Sie diesen Eintrag so ein, dass für
  \textit{root} nur noch der Zugang per Public-Key-Authentifizierung möglich
  ist. Lesen Sie die Dokumentation für weitere Informationen.
  \item \textbf{Aufgabe 4c:} Mit welchem Konfigurationswert kann das Verhalten
  aus Aufgabe 4b auch für normale Benutzer erreicht werden? Informieren Sie sich
  auch hier über die Dokumentation.
  \item \textbf{Aufgabe 4d:} Stellen Sie das Verhalten so ein, dass für normale
  Benutzer nur noch Zugang per Public-Key-Authentifizierung möglich ist.
  \item \textbf{Aufgabe 4e:} Nach dem Speichern dieser Änderungen muss der
  \acrshort{acr:ssh}-Dienst mit \textit{systemctl restart ssh} neu gestartet werden
  \item \textbf{Aufgabe 4f:} Testen Sie die korrekte Funktionsfähigkeit dieser
  Änderung mit einer zweiten \acrshort{acr:ssh}-Verbindung.
\end{itemize}

% #>------------------------------------------------------------------------<#
\subsection{Client-Konfiguration}%
\label{sec:ssh.client-konfiguration}

Da Sie nun den Server erfolgreich auf Public-Key-Authentifizierung umgestellt
haben, kann im nächsten Schritt die \acrshort{acr:ssh}-Client Konfiguration
angepasst werden. Dazu ist die Datei \textit{\textasciitilde/.ssh/config}
notwendig. Der \acrshort{acr:ssh}-Client liest die Datei ein und setzt die
Konfiguration, welcher für den Verbindungsaufbau notwendig ist, rekursiv und
abhängig von dem DNS-Namen, zusammen.

Möchte man Beispielsweise eine Verbindung zu \textit{verwaltung.example.local}
aufbauen. Werden zuerst alle Konfigurationsoptionen, welche für
\textit{verwaltung.example.local} definiert wurden, angewendet. Als nächstes
sucht der \acrshort{acr:ssh}-Client nach Konfigurationsoptionen, welche für
\textit{*.example.local} definiert wurden, anschließend für \textit{*.local} und
zum Schluss für \textit{*}. Konfigurationsoptionen, welche einmal definiert
wurden, können nicht mehr durch andere Optionen, welche in einem höhren
Scope definiert wurden, übersteuert werden.

\begin{itemize}[label={}]
  \item \textbf{Aufgabe 5a:} Erstellen Sie die Datei
  \textit{\textasciitilde/.ssh/config} und setzen Sie die entsprechenden
  Berechtigungen.
  \item \textbf{Aufgabe 5b:} Erstellen Sie einen Eintrag in der Konfiguration
  für alle Verbindungen. Definieren Sie dort, welcher Schlüssel zur
  Authentifizierung verwendet werden soll.
  \item \textbf{Aufgabe 5c:} Erstellen Sie einen Eintrag in der Konfiguration
  für alle Verbindungen, welche gegen die Domain \textit{*.hochschule-trier.de}
  aufgebaut werden. Für die Domain \textit{*.hochschule-trier.de} soll der Port
  22 verwendet werden. Die Authentifizierung per Passwort und der Verbindungsaufbau
  über IPv6 soll nicht verwendet werden.
  \item \textbf{Aufgabe 5d:} Erstellen Sie einen Eintrag in der Konfiguration
  für die Verbindung \textit{ssh.hochschule-trier.de}. Geben Sie dort den
  Benutzernamen an unter welchen Sie sich anmelden möchten.
\end{itemize}