SSH – Secure SHell

Remote Login ist etwas feines. Dass man das nur via SSH macht ist klar. Oder?
Aber wie baue ich mir soetwas möglichst sicher? Hier ist (m)eine Antwort.


Die momentan aktuelle Version ist: „OpenSSH 3.9p1 released August 17, 2004“.
Hier beschrieben sind erstmal nur die Basics (Installation, Konfiguration von
SSH Server und Client und Erzeugung eines SSH-Keys).

Homepage: http://www.openssh.org

Installieren:
Bei BSD:
# cd /usr/ports/security/openssh-portable
/usr/ports/security/openssh-portable # make install && make clean

Als SuSe RPM (für Warmduscher):
# rpm -i openssh-3.9p1-18.i586.rpm

Händisch (die beste Methode):
/usr/local/src # wget ftp://[ftpmirror]/pub/mirror/ftp.openssh.com/portable/openssh-3.9p1.tar.gz
/usr/local/src # cd openssh-3.9p1
/usr/local/src/openssh-3.9p1 # ./configure
/usr/local/src/openssh-3.9p1 # make && make tests && make install && make clean

Wobei „make tests“ meist weggelassen werden kann.

 

Soviel zum Installieren, nun das (vernünftige) konfigurieren.
Bei mir wird alles in /usr/local installiert. Ggf. muss das also angepasst werden.
Ich schreibe hier nur die Abweichungen von den Defaults bzw. sind viele Sachen
bereits als Default schon so aber ich nagele sie trotzdem nochmal fest.
Als erstes kommt die SSH-Server Konfig dran.
# vi /usr/local/etc/sshd_config

# Festnageln auf den Standardport 22.
Port 22
# Nur SSH2 erlauben.
Protocol 2
# Nur auf eine IP hören (besonders wenn der Rechner mehrer IPs hat).
ListenAddress 123.123.123.123
# Nur folgende User sollen sich einloggen dürfen.
AllowUsers loginname1 loginname2
# Nach einer Minute disconnecten wenn kein erfolgreicher Login erfolgt ist.
LoginGraceTime 1m
# ROOT darf sich nicht einloggen dürfen.
PermitRootLogin no
# Striktes prüfen der Filemodes
StrictModes yes
# Zwei Maximale Versuche
MaxAuthTries 2
# Keine Hostbasierten authentifizierungen.
RhostsRSAAuthentication no
HostbasedAuthentication no
IgnoreRhosts yes
# Keine Passwörter (SSH-Keys mit Passphrase sind davon ausgenommen).
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
# X11 will man, zumindest auf Servern, nicht haben.
X11Forwarding no
# Nach einloggen Datum, Uhrzeit und Host des letzten logins anzeigen.
PrintLastLog yes
# Prüfen ob Client noch da ist und nach 15 min disconnecten wenn Client weg/idle.
TCPKeepAlive yes
ClientAliveInterval 600
ClientAliveCountMax 3
# Das Systemeigene „login“ Programm nicht benutzen.
UseLogin no
# Dem Userenviroment ist nie zu trauen.
PermitUserEnvironment no
# Privilege seperation will man benutzen.
UsePrivilegeSeparation yes
# Benutze DNS um zu sehen ob Host und IP die connecten wollen zueinander passen.
UseDNS yes

# chmod 400 /usr/local/etc/sshd_config

Man kann auch nur diese Zeilen in eine leere /usr/local/etc/sshd_config schreiben
statt die vorhandene zu editieren. Das funktioniert auch. (Ohne die „—„.)
Anschließend ändere ich die Filemods der /usr/local/etc/sshd_config auf readonly
für rootonly. Mit „chmod 400 /usr/local/etc/sshd_config“.
Damit ist der SSH-Server einsatzbereit und relativ gut/sicher konfiguriert.

Als weiteres wird die Defaultkonfig des SSH-Clients noch ein wenig modifiziert:
# vi /usr/local/etc/ssh_config

Host *
# authentication agent forwarding Sicherheitshalber aus.
ForwardAgent no
# X11 wollen wir ja, zumindest auf Servern, nicht.
ForwardX11 no
# Keine Hostbasierte authentification.
RhostsRSAAuthentication no
HostbasedAuthentication no
# Keine Passwörter (nur SSH-Key mit Passphrase).
PasswordAuthentication no
# Keine Sicherheitsabfragen überspringen.
BatchMode no
# check ob IP, Host und Key zusammen passen.
CheckHostIP yes
# SSH2 forcen
Protocol 2

All diese Defaults können per Parameter oder mit der ~/.ssh/config überschrieben
werden. Sicherheitshalber sollten die Defaults aber so restriktiv wie möglich
und geforced sein. Auch dies kann man so in eine leere /usr/local/stc/ssh_config
schreiben. (Ohne die „—„.)

In der ~/.ssh/ssh_config kann dann sowas wie:


Host *
ForwardAgent yes
ForwardX11 yes

stehen. (Immernoch ohne die „—„.)
Bei „Host“ kann man dann auch explizit bestimmte Hosts angeben für die die
jeweils folgende Konfig gelten soll.

 

Als nächstes braucht man, wenn man nicht schon hat, einen SSH(2) Key.
Der wird folgendermassen (als user) gebaut:
$ ssh-keygen -t dsa -b 2048
Erklärung:
-t dsa gibt den Key-Typ, hier DSA (SSH2), an.
-b 2048 gibt die Key-Grösse in bits, hier 2048, an. 2048 reicht für den Hausgebrauch
mit weniger sollte man sich aber nicht zufrieden geben. Mehr als 4096 macht
allerdings auch nicht viel mehr Sinn.

Als Passphrase sollte man mindestens 16 alphanumerische (A-Z, a-z, 0-9) Zeichen
eingeben. Besser sind 32. Mehr als 48 macht aber nicht viel mehr Sinn.
Eine leere Passphrase sollte man aber auf jeden Fall vermeiden!

Den soeben erstellten Publickey (defaultmässig ~/.ssh/id_dsa.pub) kopiert man
am besten gleich nach ~/.ssh/authorized_keys und verteilt diesen im selben Zuge
auf alle anderen Rechner auf die man per SSH möchte.
Den Privatekey hingegen belässt man wo er ist bzw. legt ihn nur auf dem Rechner
ab von dem aus man auf andere Rechner möchte.

In einem sicheren System hat als einzigstes ROOT ein Passwort. Und ROOT Zugriff
sollte es nur via sudo oder Konsole geben können. Auch sollte es keine Gruppenaccounts
(Accounts für mehr als eine Person) geben.

Weitergehendes wie „authentication agent forwarding“ (ssh-agent) und „scponly“
wird ein andermal behandelt.