Aktionen

Ubuntu 16.04.x 2-Faktor bei SSH mit Google Authenticator einrichten

Aus znilwiki

Neben dem GeoIP-Blocking des SSH-Zugangs über die Firewall verwende ich für meinen "Jumphost" zusätzlich die 2-Faktor Authentifizierung über den Google-Authenticator-Mechanismus.
Nachfolgend ist beschrieben wie.



Vorwort

Natürlich besteht die Gefahr sich hiermit auszusperren. Deshalb verwende ich die 2-Faktor Anmeldung auch nur für den SSH-Zugang. Alle meine Server sind Virtuelle Maschinen - notfalls kommen ich als immer an die lokale Konsole und es dort wieder richten.
Die Anmeldung per SSH-Key ist von der 2-Faktor Anmeldung nicht betroffen. Wer also ssh-copy-id genutzt hat oder aber PuTTY so eingerichtet hat, kann sich trotzdem darüber anmelden.



Rückversicherung mit SSH-Key

Von meinem stationären Rechner aus melde ich mich bestimmt duzende mal an einem Abend auf meinen Server per SSH an. Gerne auch mal 2 oder 3 Sitzungen auf einem Server. Da wäre natürlich total nervig wenn ich da jedesmal mein Handy zücken müsste um den zusätzlichen Key abzufragen und diesen einzutippen.
Deshalb nutze ich für von meinem Rechner aus den SSH-Key zur Anmeldung.
Dafür gibt es unter https://www.howtoforge.de/anleitung/key-basierte-ssh-logins-mit-putty/ eine vorbildliche Schritt-für-Schritt Anleitung mit vielen Bildern.
Da ich es dann doch wieder abgewandelt haben wollte folgt hier meine eigene Version für besonders Faule:

PuTTYgen - Schlüssel erzeugen

Ich installiere PuTTY inzwischen immer per Download des MSI-Paketes:

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

ClipCapIt-160906-150623.PNG
Da sind dann alle Werkzeuge rund um PuTTY gleich dabei - und auf Wunsch auch gleich alle mit in der %PATH% Variablen. Ansonsten könnt Ihr von der Webseite PuTTYgen auch direkt herunterladen.
Startet des Programm PuTTYgen:
ClipCapIt-160906-151311.PNG
Die Voreinstellungen passen schon so (siehe Bild).
Klickt auf Generate - danach heisst es schön mit der Maus über dem Programmfenster wackeln:
ClipCapIt-160906-151441.PNG
Nach dem er fertig ist sieht das ganze so aus:
ClipCapIt-160906-151627.PNG
In das Feld Key comment: tragt etwas sinnvolles ein - wie Falko Timme schon empfiehlt macht sich dort die Email-Adresse gut - oder Benutzername@host macht sich auch gut.
Der Inhalt dieses Feldes wird euch nämlich bei jeder Anmeldung mit diesem Schlüssel angezeigt.
Nun lasse ich die Felder für die passphrase leer ..... böse böse. Nun ja, ich setze das Kennwort ja weil ich eben NICHT jedesmal das Kennwort eingeben will.
Dafür gibt es zwar das Tool Pageant ... aber auch bei diesem muss man bei jedem Start das Kennwort eingeben.
Lasse ich das Passwort weg geht es ohne all dieses. Die Datei liegt bei mir auf verschlüsselten Festplatten, das reicht mir.

Nun müssen wir nacheinander den öffentlichen Schlüssel (Public Key) und privaten Schlüssel (Private Key) über die beiden Schaltflächen speichern:
ClipCapIt-160906-152740.PNG

ClipCapIt-160906-152937.PNG

Beim Private Key kommt dann eine Warnmeldung:
ClipCapIt-160906-153044.PNG
Hier müsst Ihr auf Ja klicken - wenn Ihr es so machen wollt wie ich.
ClipCapIt-160906-153145.PNG
Den Inhalt des oberen Textfensters markieren wir nun einmal komplett und kopieren diesen in die Zwischenablage:
ClipCapIt-160906-153430.PNG
Im gleichen Verzeichnis in dem ich auch schon die Schlüssel gespeichert habe erzeuge ich nun einen neue Textdatei mit den Namen

authorized_keys.txt

in welche ich den Inhalt aus der Zwischenablage speichere:
ClipCapIt-160906-153817.PNG
Wie Ihr seht ist das alles nur eine Zeile. Der Inhalt lässt sich zwar auch aus der .txt wieder generieren - aber in dieser Schreibweise brauchen wir den Schlüssel auch auf dem Linux-Rechner.



Public-Key auf dem Linux-Host hinterlegen

Wir melden uns wie bisher auf dem Linux-Host an - wir sollten jetzt im Home-Verzeichnis des Benutzers stehen.
Nun gibt es 2 Möglichkeiten - entweder gibt es bei euch schon eine Datei mit dem Namen

.ssh/authorized_keys2

oder nicht. Das testen wir einfach per

ls -l ~/.ssh/authorized_keys2

ist die Anzeige z.B.

-rw------- 1 root root 1193 Nov  8  2015 /root/.ssh/authorized_keys2

habt Ihr die Datei schon. Kommt eine Meldung wie

ls: Zugriff auf /root/.ssh/authorized_keys2 nicht möglich: Datei oder Verzeichnis nicht gefunden

macht Ihr folgendes:

mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys2
chmod 600 ~/.ssh/authorized_keys2


Important.png
Hinweis: Es gibt ggf. auch die Datei ~/.ssh/authorized_keys - auch dort könntet Ihr den Key hinterlegen. In der Regel nimmt man für dieses Verfahren aber die "2"



Nun Bearbeiten wir die Datei und fügen den Inhalt dort ein:

nano ~/.ssh/authorized_keys2

ClipCapIt-160906-160123.PNG
Dann speichern (STRG + x und danach Enter - und das war es auch schon.



PuTTY Sitzung anlegen

Wir tragen oben den Hostnamen oder die IP-Adresse ein (1) - und vergeben unten schon mal einen passenden Namen (2):
ClipCapIt-160906-160657.PNG
Danach wechseln wir links zu Connection --> Data und geben bei (3) den Benutzernamen ein für dessen Anmeldung wir den Key nutzen wollen:
ClipCapIt-160906-160934.PNG
Weiter geht es unter Connection --> SSH --> Auth
ClipCapIt-160906-161206.PNG
Dort wählen wir bei (4) die .ppk Datei aus.
Nun wieder zurück auf Session und die Sitzung speichern:
ClipCapIt-160906-161605.PNG



Test der Anmeldung mit Private Key

Einfach auf Open Klicken (Die zuvor gespeicherte Sitzung muss ausgewählt sein) und schon sollte das ganze so durchrauschen:
ClipCapIt-160906-161837.PNG
Na, das war doch schon mal einfach, oder?



Einrichtung 2-Faktor Anmeldung

Für alle anderen Anmeldungen ohne Private-Key wollen wir nun die 2-Faktor Anmeldung.



Zeit synchronisieren

Die Einmal-Tokens mit denen wir uns Anmelden sind Zeitabhängig. Zu jeder Uhrzeit ist also ein anderer, errechneter Token notwenig (Als Token bezeichne ich die Zahl die man zusätzlich zur Anmeldung eingeben muss).
Deshalb ist es wichtig das bei allen beteiligten Komponenten die Uhrzeit so genau wie möglich übereinstimmt.
Dazu benötigten wir das Paket ntp:

apt install ntp


Wer die voreingestellten Zeitserver nutzen will muss nichts mehr tun.
Wer eigene Zeitserver für die Abfrage nutzen will muss die Konfigurationsdatei bearbeiten:

nano /etc/ntp.conf

und danach den Service neu starten:

systemctl restart ntp.service


Die Synchronisation lässt sich per Befehl kontrollieren:

ntpq -p

Ausgabe:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 beastie.deuza.n 195.83.222.27    2 u   24   64    1    0.501    9.552   0.000
 ns1.kashra.com  .PPS.            1 u   23   64    1   29.484    9.128   0.000
 fr1.tomhek.net  163.172.41.83    3 u   22   64    1    0.685   12.810   0.000
 ip139.ip-5-196- 10.21.137.1      2 u   21   64    1    0.581    8.332   0.000
 golem.canonical 193.79.237.14    2 u   20   64    1    8.674   13.075   0.000




Google-Authenticator installieren

Vorweg - der heißt so weil er von Google kommt. Der sendet aber nichts an Google während der Anmeldung und funktioniert auch ohne Internetverbindung. Wichtig ist nur die korrekte Uhrzeit.
Installiert wird der per

sudo apt install libpam-google-authenticator




TOTP Key für Benutzer erzeugen

Nun brauchen wir den Schlüssel für den Benutzer auf dessen Basis bei der Anmeldung das Token berechnet wird.
Dazu müssen wir als der Benutzer angemeldet sein der den Key nutzen soll.
Dann starten wir das Erstellen mit dem Befehl:

google-authenticator

Die Fragen die dann kommen beantwortet Ihr wie folgt:

Do you want authentication tokens to be time-based (y/n) y
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/root@web01.znil.local%3Fsecret%3DUUPREFHXXSDKE6Z6
ClipCapIt-160906-165956.PNG
Your new secret key is: UUPREFHXXSDKE6Z6 Your verification code is 179208 Your emergency scratch codes are: 17197385 10487412 27088045 94363836 64914423 Do you want me to update your "/root/.google_authenticator" file (y/n) y 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 and 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 1:30min to about 4min. Do you want to do so (y/n) y 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

Also alle mit y!
Den QR-Code könnt Ihr z.B. mit der App "Google Authenticator" scannen. Der secret key kann für die Eingabe z.B. bei WinAuth genutzt werden.

Ich persönlich hinterlege den Schlüssel sowohl in einer App (Authenticator Plus als auch in WinAuth
Falls Ihr später noch einmal auf ein Programm hinzufügen müsst, der Steht auch in der Datei

cat ~/.google_authenticator

gleich in der ersten Zeile.



Token-Nutzung in OpenSSH hinzufügen

Jetzt müssen wir diese Authentifizierungsmethode dem OpenSSH Dienst beibringen. Dazu bearbeiten wir die folgende Datei:

nano /etc/pam.d/sshd

Wir gehen ganz an das Ende der Datei und fügen folgende Zeile an:

auth required pam_google_authenticator.so nullok

Das nullok am Ende ist wichtig - nur dadurch ist das Login nur per SSH-Key weiter erlaubt!
Ansonsten müssten Ihr auch beim Anmelden per SSH-key jedesmal ein Token eingeben.
Die nächste Datei:

nano /etc/ssh/sshd_config

Hier suchen wir den Begriff ChallengeResponseAuthentication (STRG + W ist suchen) und setzen diesen auf yes:

...
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes

...

Jetzt müssen wir den SSH-Dienst noch neu starten:

systemctl restart sshd.service


Ihr solltet die PuTTY-Sitzung offen lassen und eine 2. Sitzung starten:
ClipCapIt-160906-225412.PNG
Perfekt! Er fragt nach Benutzernamen, Passwort - und dann dem Token!


Quellen




Kommentare

Loading comments...