SSH mit Zwei Faktor Authentifizierung

Wir möchten unsere SSH Zugang mit einer Zwei Faktor Authentifizierung absichern.

Zur Erzeugung des zweiten Faktor verwenden wir ein Smartphone mit der App FreeOTP oder Google Authenticator. Diese Apps generieren ein Token, welcher nur für eine bestimmte Zeit gültig ist. Damit wir der SSH Zugang zusätzlich abgesichert.

Zuerst müssen wir das SSH Modul für Google Authenticator installieren.

sudo apt install libpam-google-authenticator

Jetzt müssen wir den Server mit der App verbinden. Dazu rufen wir die Anwendung als Benutzer auf.

google-authenticator

Den QS Code können wir mit dem Smartphone in der App Google Authenticator einlesen. Die Emergency Codes sollten wir uns an einem sicheren Ort speichern.

Die Frage können wir mit Yes, Yes, Yes, No, Yes beantworten.

Do you want authentication tokens to be time-based (y/n) y
Do you want me to update your "/home/user/.google_authenticator" file (y/n)? y
 
The app provides you with a secret key, verification code, and recovery codes. Keep these in a secure, safe location. The recovery codes are the only way to access your server if you lose your mobile phone.
 
Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y
By default, tokens are good for 30 seconds. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens). 
Do you want to do so? (y/n) n
 
If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y

Das PAM Modul muss noch konfiguriert werden.

sudo vim /etc/pam.d/sshd

Ende der Datei fügen wir eine Zeile hinzu.

auth required pam_google_authenticator.so

In den Einstellungen vom SSH-Server müssen ggf. noch Einstellunge geändert werden.

sudo vim /etc/ssh/sshd_config

Prüfen Sie ob diese Werde gesetzt sind.

ChallengeResponseAuthentication yes
PasswordAuthentication no

Nach dem Neustart vom SSH-Server sollte die Zwei Faktor Authentifizierung arbeiten.

sudo systemctl restart sshd.service

SSH durch HTTP Proxy und Firewall

Wer nur durch einen HTTP Proxy Server in das Internet kommt, hat ein Problem mit SSH Verbindungen.

Durch einen kleinen Trick kann man sich trozdem verbinden. Man ändern der Port vom SSH Server von Port 22 auf 443. Der Port 443 ist für SSL Verbindungen reserviert und wird vom Proxy Server ohne Prüfung durchgelassen.

Den Port kann man am SSH-Server ändern oder am Router die NAT Einstellung.

Jetzt wird Port 22 und 443 für SSH verwendet.

sudo vim /etc/ssh/sshd_config

Port 22
Port 443

Einen Neustart von Dienst nicht vergessen.

sudo service ssh restart

Wenn man sich jetzt mit dem SSH Client verbindet, so gibt man den Proxy Server und den SSH Server an. Will man seinen Traffik über die SSH Verbindung tunnel, so kann man SOCKS5 (Port 1080) verwenden.

sudo vim ~/.ssh/config

Host *
  ProxyCommand corkscrew proxy.hostname.de 8080 %h %p ~/.ssh/proxyauth

Wenn der Proxy Server ein Login und Passwort benötigt, dann hinterlegen Sie es im Benutzerverzeichnis.

echo „login:password“ > ~/.ssh/proxyauth

Jetzt können Sie die Verbindung mit SSH von Client durch den Proxy zum SSH Server via Port 443 auf bauen.

$ ssh -D 1080 user@domain.de -p 443

Mit einem Browser (Firefox,Chrome,etc.) können Sie den Tunnel via SOCKS5 Port 1080 verwenden und kommen so in das Internet. Ein Test mit der Seite http://www.netip.de/ zeigt Ihnen die Remote Adresse an. Die IP Adresse sollte jetzt dem SSH Server entsprechen.

Das Betriebsystem Microsoft Windows enthält keinen SSH Client. Ein kostenloser SSH Client ist PuTTY. Die Einstellungen für PuTTY lauten.

    Session

  • Host Name: domain.de
  • Port: 443
    Connection / Proxy

  • Proxy hostname: proxy.hostname.de
  • Port: 8080
  • Username: login
  • Password: password
    Connection / SSH / Tunnels

  • Source por: 1080
  • Destination: Dynamic / Auto

SSH Server mit Public-Key und ohne Passwort

Wer einen SSH Server betreibt sollte in der heuten Zeit die Sicherheitseinstellung im Auge behalten. Es erfolgen immer mehr Brute-force attacken gegen SSH Server, um den Zugang zu dem Server zu erlangen. Deshalb sollte man kein Passwort verwenden, sondern einen Public-Key für die Anmeldung.

Zu erst erstellen wir uns einen Private und Public-Key.

mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t rsa

Den Public-Key (id_rsa.pub) kopieren wir auf das Zielsystem in die Datei „~/.ssh/authorized_keys“.

mkdir ~/.ssh
chmod 700 ~/.ssh
cp id_rsa.pub ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Dann sind einige Änderung in der SSH Konfiguration durch zu führen, damit eine Anmeldung nur noch mit dem Public-Key möglich ist.

sudo vim /etc/ssh/sshd_config

# Benutzer "root" darf sich nicht einloggen
PermitRootLogin no
# Nur aufgeführten Benutzer dürfen sich einloggen
AllowUsers Tarzan Jane
# Anmeldung mit Benutzername und Passwort deaktivieren
PasswordAuthentication no

Der SSH Server muß neu gestartet werden, um die Einstellungen zu übernehmen.

sudo service ssh restart