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
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:
Die Voreinstellungen passen schon so (siehe Bild).
Klickt auf Generate - danach heisst es schön mit der Maus über dem Programmfenster wackeln:
Nach dem er fertig ist sieht das ganze so aus:
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:
Beim Private Key kommt dann eine Warnmeldung:
Hier müsst Ihr auf Ja klicken - wenn Ihr es so machen wollt wie ich.
Den Inhalt des oberen Textfensters markieren wir nun einmal komplett und kopieren diesen in die Zwischenablage:
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:
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
~/.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
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):
Danach wechseln wir links zu Connection --> Data und geben bei (3) den Benutzernamen ein für dessen Anmeldung wir den Key nutzen wollen:
Weiter geht es unter Connection --> SSH --> Auth
Dort wählen wir bei (4) die .ppk
Datei aus.
Nun wieder zurück auf Session und die Sitzung speichern:
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:
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
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:
Perfekt! Er fragt nach Benutzernamen, Passwort - und dann dem Token!
Quellen
- https://www.howtoforge.de/anleitung/key-basierte-ssh-logins-mit-putty/
- http://www.forum-raspberrypi.de/Thread-tutorial-mit-ssh-key-sicher-auf-server-zugreifen
- https://www.digitalocean.com/community/tutorials/how-to-set-up-multi-factor-authentication-for-ssh-on-ubuntu-14-04
- https://www.linux.com/learn/how-set-2-factor-authentication-login-and-sudo