%
% administration_ssh.tex
% Last Update: $Id$
%
% wird in administartion.tex eingebunden
% \input{administration_ssh}
% ab etwa Zeile 500
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Kapitel SSH %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{Zugriff mit SSH}
\index{Zugriff mit SSH}

    Der Zugriff mittels SSH ist eine g"angige Methode, um sich von einem
    Linux-System aus an einem \eisfair{-Server} anzumelden. Dabei wird
    empfohlen, den Zugriff auf den \eisfair{-Server} "uber ein
    nichtprivilegiertes Benutzerkonto durchzuf"uhren und erst nach der
    Anmeldung auf dem Zielsystem mittels der Kommandos \emph{'sudo'} oder
    \emph{'su'} in die Superuser-Rolle 'root' zu wechseln.

    Damit die SSH-Anmeldung m"oglichst komfortabel abl"auft, sind auf dem
    Linux-System eine Reihe von Vorbereitungen erforderlich, die hier n"aher
    beschrieben werden. Diese Vorarbeiten werden, solange nicht ausdr"ucklich
    anders erw"ahnt, auf dem Linux-Arbeitsplatz vorgenommen, von dem aus der
    Zugriff erfolgen soll. Zudem wird davon ausgegangen, dass lokal mit einem
    nichtprivilegierten Benutzerkonto gearbeitet wird, auf das im weiteren
    Verlauf mit 'user' Bezug genommen wird. Dabei ist im Folgenden der Text
    'user' immer gegen den Namen des Benutzerkontos auf dem Linux-Arbeitsplatz
    zu ersetzen. Es wird zudem davon ausgegangen, dass dieser Benutzer auf
    dem \eisfair{-Server} ein gleichlautendes Benutzerkonto besitzt.

    Im ersten Schritt wird ein Zugangsschl"ussel (SSH-Schl"ussel) erzeugt,
    der eine Anmeldung auf dem \eisfair{-Server} ohne Passworteingabe
    erm"oglichen soll. Dazu ist zun"achst sicherzustellen, dass im
    Heimatverzeichnis des Anwenders 'user' das versteckte Verzeichnis
    '.ssh' vorhanden ist:


\begin{latexonly}
\begin{bildschirm}
\\\promptlinux \yellow{mkdir -m 0700 .ssh}
\promptlinux
\end{bildschirm}
\end{latexonly}


\begin{htmlonly}
\begin{rawhtml}
<CENTER>
    <TABLE WIDTH=561 BORDER=0 CELLPADDING=0 CELLSPACING=0>
        <COL WIDTH=561>
        <TR>
            <TD WIDTH=561 VALIGN=TOP>
            <P><BR>
            </P>
            <PRE STYLE="background: #333333">

<FONT COLOR="#ffffff"> user@linux :</FONT> <FONT COLOR="#ffff00">mkdir -m 0700 .ssh</FONT> <FONT COLOR="#ffffff">
<FONT COLOR="#ffffff"> user@linux :</FONT>
            </PRE>
            <P><BR>
            </P>
            </TD>
        </TR>
    </TABLE>
</CENTER>
\end{rawhtml}
\end{htmlonly}



\subsubsection{SSH Key generieren}

    Weitere Informationen zum Thema SSH-Schl"ussel k"onnen auch im Block von
    Gert van Dijk nachgelesen werden:
    \link{https://blog.g3rt.nl/upgrade-your-ssh-keys.html}{SSH Key generieren}

    Wie im Screenshot unten dargestellt, wird nun der Schl"ussel erzeugt.
    Der Befehl fragt daraufhin nach, unter welchem Namen die Schl"usseldateien
    abgelegt werden sollen. Der Vorschlag kann prinzipiell durch einen Druck
    auf 'Enter' "ubernommen werden. Es kann jedoch auch sinnvoll sein, im Namen
    weitere Informationen wie beispielsweise das Datum der Erzeugung zu
    hinterlegen.  Auf diese Weise k"onnen sp"ater die Schl"ussel einfacher
    unterschieden und verwaltet werden, wenn sie beispielsweise in einem
    verschl"usselten Container auf einem USB-Stick zwecks Datensicherung oder
    Mitnahme abgelegt werden sollen.

    Im Anschluss besteht die M"oglichkeit, den Sch"ussel mit einem Kennwort zu
    sichern. Ob man das m"ochte, bleibt jedem selbst "uberlassen. Ist kein
    Kennwort gew"unscht, kann man die Abfrage durch einen Druck auf 'Enter'
    "uberspringen.

    Nat"urlich kann man auch auf dem \eisfair{-Server} SSH-Schl"ussel
    erzeugen. Das passt dann aber nicht zum hier beschriebenen Ablauf.


\begin{latexonly}
\begin{bildschirm}
\\\promptlinux \yellow{ssh-keygen -o -a 100 -t ed25519}
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/'user'/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/'user'/.ssh/id_ed25519
Your public key has been saved in /home/'user'/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:b9lWjxA/xvLBaMGXF6Imm0oEK7E8t+IuU6FK4QzGfgA 'user'@eis
The key's randomart image is:
+--[ED25519 256]--+
|   . .       . . |
|E . o o    .. ...|
|o  = o . . o+ o .|
|.= .+ o   =  O . |
|* +... .So  = O  |
| *.o. . .. + * = |
|o o.   .  + o o .|
|.o.      . .     |
|  o.             |
+----[SHA256]-----+
\promptlinux
\end{bildschirm}
\end{latexonly}



\begin{htmlonly}
\begin{rawhtml}
<CENTER>
    <TABLE WIDTH=561 BORDER=0 CELLPADDING=0 CELLSPACING=0>
        <COL WIDTH=561>
        <TR>
            <TD WIDTH=561 VALIGN=TOP>
            <P><BR>
            </P>
            <PRE STYLE="background: #333333">

<FONT COLOR="#ffffff"> user@linux :</FONT> <FONT COLOR="#ffff00">ssh-keygen -o -a 100 -t ed25519</FONT> <FONT COLOR="#ffffff">
 Generating public/private ed25519 key pair.
 Enter file in which to save the key (/home/'user'/.ssh/id_ed25519):
 Enter passphrase (empty for no passphrase):
 Enter same passphrase again:
 Your identification has been saved in /home/'user'/.ssh/id_ed25519
 Your public key has been saved in /home/'user'/.ssh/id_ed25519.pub
 The key fingerprint is:
 SHA256:b9lWjxA/xvLBaMGXF6Imm0oEK7E8t+IuU6FK4QzGfgA 'user'@eis
 The key's randomart image is:
 +--[ED25519 256]--+
 |   . .       . . |
 |E . o o    .. ...|
 |o  = o . . o+ o .|
 |.= .+ o   =  O . |
 |* +... .So  = O  |
 | *.o. . .. + * = |
 |o o.   .  + o o .|
 |.o.      . .     |
 |  o.             |
 +----[SHA256]-----+
<FONT COLOR="#ffffff"> user@linux :</FONT>
            </PRE>
            <P><BR>
            </P>
            </TD>
        </TR>
    </TABLE>
</CENTER>
\end{rawhtml}
\end{htmlonly}



    Nach Abschluss des Kommandos befinden sich die Schl"usseldateien
    'id\_ed25519' und 'id\_ed25519.pub' im versteckten Verzeichnis
    '.ssh' des Anwenders.


    Nun pr"ufen wir auf dem \eisfair{-Server} ob das Verzeichnis
    '.ssh' unterhalb des Benutzerkontos, unter dem die Anmeldung
    erfolgen soll, im dortigen Heimatverzeichnis ebenfalls vorhanden
    ist:


\begin{latexonly}
\begin{bildschirm}
\\\promptuser \yellow{mkdir -m 0700 .ssh}
\promptuser
\end{bildschirm}
\end{latexonly}


\begin{htmlonly}
\begin{rawhtml}
<CENTER>
    <TABLE WIDTH=561 BORDER=0 CELLPADDING=0 CELLSPACING=0>
        <COL WIDTH=561>
        <TR>
            <TD WIDTH=561 VALIGN=TOP>
            <P><BR>
            </P>
            <PRE STYLE="background: #333333">

<FONT COLOR="#ffffff"> user@eis :</FONT> <FONT COLOR="#ffff00">mkdir -m 0700 .ssh</FONT> <FONT COLOR="#ffffff">
<FONT COLOR="#ffffff"> userQeis :</FONT>
            </PRE>
            <P><BR>
            </P>
            </TD>
        </TR>
    </TABLE>
</CENTER>
\end{rawhtml}
\end{htmlonly}


    Es ist unbedingt zu beachten, dass man zur Eingabe des obigen Kommandos
    als der jeweilige Benutzer auf dem \eisfair{-Server} angemeldet sein muss,
    in dessen Heimatverzeichnis der Ordner angelegt werden soll.

\subsubsection{SSH Key verteilen}


    Jetzt kann der vorher erzeugte Key auf dem \eisfair{-Server}
    installiert werden. Das kann mit dem Kommando

\begin{latexonly}
\begin{bildschirm}
\\\promptlinux \yellow{ssh-copy-id -i id_ed25519.pub [user@]hostname}
\promptlinux
\end{bildschirm}
\end{latexonly}


\begin{htmlonly}
\begin{rawhtml}
<CENTER>
    <TABLE WIDTH=561 BORDER=0 CELLPADDING=0 CELLSPACING=0>
        <COL WIDTH=561>
        <TR>
            <TD WIDTH=561 VALIGN=TOP>
            <P><BR>
            </P>
            <PRE STYLE="background: #333333">

<FONT COLOR="#ffffff"> user@linux :</FONT> <FONT COLOR="#ffff00">ssh-copy-id -i id_ed25519.pub [user@]hostname</FONT> <FONT COLOR="#ffffff">
<FONT COLOR="#ffffff"> user@linux :</FONT>
            </PRE>
            <P><BR>
            </P>
            </TD>
        </TR>
    </TABLE>
</CENTER>
\end{rawhtml}
\end{htmlonly}


    ausgef"uhrt werden, ssh-copy-id -h, gibt weitere Auskunft
    oder man "offnet die Datei id\_ed25519.pub und kopiert den Key
    auf dem \eisfair{-Server} in die '.ssh/authorized\_keys'
    Datei.

    Immer dabei beachten, dass die Rechte und der 'user' erhalten bleiben.

    0600 'user' users  authorized\_keys


\subsubsection{SSH config}

    Um das Ganze noch einfacher zu machen, wird in dem .ssh Verzeichnis
    eine Datei 'config' angelegt. Darin k"onnen dann die Hosts eingetragen werden,
    die erreicht werden sollen.

\begin{verbatim}
    Host eis
        HostName eis.mein.lan
        User 'user'

    Host eis64
        HostName eis64.mein.lan
        User 'user'
\end{verbatim}


    Jetzt kann dann in der Konsole mit 'ssh eis' direkt auf den
    \eisfair{-Server} gewechselt werden, ohne dass eine Passwort-Abfrage
    erfolgt.

    Ein wechsel zum Superuser 'root' ist jetzt mit \emph{'su -'} oder
    \emph{'sudo -i'} jederzeit m"oglich.


\subsubsection{SSH mit sudo}

    Sollte der Wunsch bestehen, es noch komfortabler zu machen, l"asst
    sich daf"ur sudo einrichten und als Superuser 'root' unter

    /etc/sudoers.d

    eine Datei mit beliebigem Namen und folgendem Inhalt anlegen:

\begin{verbatim}
    'user' ALL=(ALL) NOPASSWD: ALL
\end{verbatim}

    chmod 0440

    Danach erfolgt der Wechsel mit sudo zum Superuser 'root' ohne
    Passwort-Abfrage.

    sudo -{}-help gibt weitere Auskunft

    Diese Vorgehensweise sollte aber mit Bedacht gew"ahlt werden.


\subsubsection{SSH Agent-Forwarding}


    Mit Agent-Forwarding ist es m"oglich auch zu 'jumpen' d.h.
    es kann mit der selben Anmeldung auch ein weiterer Server
    erreicht werden.

    Auch diese M"oglichkeit sollte mit Bedacht gew"ahlt und
    nur in einem bekannten Umfeld benutzt werden.

    Um mit Agent-Forwarding zu arbeiten, muss der 'ssh-agent' gestartet
    werden und die Schl"ussel m"ussen "ubergeben werden.


    Auf Linux-Systemen kann man dieses an Systemd abtreten. Daf"ur
    wird als 'user' eine Unit erstellt und gestartet.


\begin{latexonly}
\begin{bildschirm}
\\\promptlinux \yellow{mkdir -p ./config/systemd/user}
\promptlinux
\end{bildschirm}
\end{latexonly}


\begin{htmlonly}
\begin{rawhtml}
<CENTER>
    <TABLE WIDTH=561 BORDER=0 CELLPADDING=0 CELLSPACING=0>
        <COL WIDTH=561>
        <TR>
            <TD WIDTH=561 VALIGN=TOP>
            <P><BR>
            </P>
            <PRE STYLE="background: #333333">

<FONT COLOR="#ffffff"> user@linux :</FONT> <FONT COLOR="#ffff00">mkdir -p ./config/systemd/user</FONT> <FONT COLOR="#ffffff">
<FONT COLOR="ffffff"> user@linux :</FONT>
            </PRE>
            <P><BR>
            </P>
            </TD>
        </TR>
    </TABLE>
</CENTER>
\end{rawhtml}
\end{htmlonly}


    Und eine Datei angelegt


\begin{latexonly}
\begin{bildschirm}
\\\promptlinux \yellow{> ./config/systemd/user/ssh-agent.service}
\promptlinux
\end{bildschirm}
\end{latexonly}


\begin{htmlonly}
\begin{rawhtml}
<CENTER>
    <TABLE WIDTH=561 BORDER=0 CELLPADDING=0 CELLSPACING=0>
        <COL WIDTH=561>
        <TR>
            <TD WIDTH=561 VALIGN=TOP>
            <P><BR>
            </P>
            <PRE STYLE="background: #333333">

<FONT COLOR="#ffffff"> user@linux :</FONT> <FONT COLOR="#ffff00">&gt; ./config/systemd/user/ssh-agent.service</FONT> <FONT COLOR="#ffffff">
<FONT COLOR="#ffffff"> user@linux :</FONT>
            </PRE>
            <P><BR>
            </P>
            </TD>
        </TR>
    </TABLE>
</CENTER>
\end{rawhtml}
\end{htmlonly}

    mit dem Inhalt

\begin{verbatim}
    [Unit]
    Description=SSH key agent

    [Service]
    Type=simple
    Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
    ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK

    [Install]
    WantedBy=default.target
\end{verbatim}


    Anschlie"send wird mit

\begin{latexonly}
\begin{bildschirm}
\\\promptlinux \yellow{systemctl --user enable ssh-agent.service}
\promptlinux
\\\promptlinux \yellow{systemctl --user start ssh-agent.service}
\promptlinux
\end{bildschirm}
\end{latexonly}


\begin{htmlonly}
\begin{rawhtml}
<CENTER>
    <TABLE WIDTH=561 BORDER=0 CELLPADDING=0 CELLSPACING=0>
        <COL WIDTH=561>
        <TR>
            <TD WIDTH=561 VALIGN=TOP>
            <P><BR>
            </P>
            <PRE STYLE="background: #333333">

<FONT COLOR="ffffff"> user@linux :</FONT> <FONT COLOR="#ffff00">systemctl --user enable ssh-agent.service</FONT> <FONT COLOR="#ffffff">
<FONT COLOR="ffffff"> user@linux :</FONT>
<FONT COLOR="ffffff"> user@linux :</FONT> <FONT COLOR="#ffff00">systemctl --user start ssh-agent.service</FONT> <FONT COLOR="#ffffff">
<FONT COLOR="ffffff"> user@linux :</FONT>
            </PRE>
            <P><BR>
            </P>
            </TD>
        </TR>
    </TABLE>
</CENTER>
\end{rawhtml}
\end{htmlonly}


    Systemd angewiesen, diesen Dienst zu verwalten.


    Im Anschluss wird noch die Datei


\begin{verbatim}
    .ssh/config
\end{verbatim}


    um die Eintr"age im oberen Teil erweitert


\begin{verbatim}
    Host *
        ForwardAgent yes
        AddKeysToAgent yes
\end{verbatim}

    Somit ist es nun m"oglich, auch einen weiteren Server zu erreichen,
    ohne sich um die Anmeldung zu k"ummern.


    Wenn grunds"atzlich der Server nur als
    \link{https://cusy.io/de/blog/das-problem-mit-ssh-agent-forwarding}{Jump Server}
    benutzt wird, sollten andere Techniken angewandt werden.

