2Faktor Authentifizierung für SSH und Sudo
“Das Sprichwort stimmt, dass Sicherheitssysteme immer gewinnen müssen, der Angreifer hingegen muss nur einmal.” – Kevin Mitnick
Mehr und mehr ist in den Medien und Literatur von Zwei Faktor Authentifizierung (2FA) oder Multi Faktor Authentifizerung (MFA) die Rede. Dabei handelt es sich um einen zusätzlichen Faktor der Authentizierung, meistens über ein Gerät welches Einmalpasswörter periodisch generiert (z.B RSA Token oder die Steam Authenticator App)
Ein Faktor kann z.B sein:
- Etwas zu wissen (Benutzername / Passwort)
- Etwas zu besitzen (Zertifikate / Handy / Token)
- Ein Körperliches Merkmal (Fingerabdruck / Stimmenerkennung)
Wenn zwei oder mehrere dieser Faktoren zur Authentifizierung hinzugezogen werden, spricht man von 2FA / MFA.
❗ Kurze Warnung ❗
Auch wenn diese Anleitung mit größter Sorgfalt geschrieben wurde, besteht trotzdem die Gefahr sich aus dem System auszuschließen.
Und zwar so sehr, dass man sich nicht mehr lokal einloggen kann.
Funktionsweise
Wie oben beschrieben wird über den zweiten Faktor ein Einmalpasswort generiert (One Time Password / OTP) Das Konzept des OTP´s ist relativ simpel, entweder wird ein Passwort über
-
ein Event generiert (HOTP) Sprich bei jedem Login wird das OTP ungültig und ein neues wird generiert.
-
oder über Zeit generiert (TOTP) Sprich nach X Sekunden wird das alte Passwort ungültig und es wird ein neues generiert.
Installation der benötigten Komponenten
Es werden folgende Pakete benötigt:
CentOS / RedHat:
$ yum install pam_oath oathtool qrencode
Debian / Ubuntu:
$ apt-get install libpam-oath oathtool qrencode
Arch:
$ pacman -s oath-toolkit qrencode
Generieren der Benutzer Secrets
Sowohl das 2FA Gerät als auch der Server müssen über das gleiche gemeinsame Secret verfügen. Um dieses Secret zu generieren muss man vorher eine Datei anlegen:
$ sudo mkdir -p /etc/oath/
$ sudo touch /etc/oath/users.oath
$ sudo chmod 0600 /etc/oath/users.oath
Als Secret muss ein Hexadezimaler String von 30 Zeichen gewählt werden. Für jeden Benutzer sollte man einen eigenen String wählen.
Für den eigenen Benutzer kann man folgende Befehle ausführen:
# Generate a Secret
$ export HEX_SECRET=$(head -10 /dev/urandom | md5sum | cut -b 1-30)
# Write Secret to users.oath
$ sudo /bin/bash -c "echo HOTP/T30 $USER - $HEX_SECRET >> /etc/oath/users.oath"
# Forget the secret!
$ unset HEX_SECRET
In diesem Beispiel wurde die Eventgesteuerte generierung des OTP gewählt, wenn man aber z.B die Zeit gesteuerte wählen möchte muss man HOTP/T30
durch einen anderen Wert ersetzen.
Zur Auswahl stehen:
- HOTP - HOTP event-based token with six digit OTP
- HOTP/E - HOTP event-based token with six digit OTP
- HOTP/E/8 - HOTP event-based token with eight digit OTP
- HOTP/T30 - HOTP time-based token with 30 second interval and six digit OTP
- HOTP/T60 - HOTP time-based token with 60 second interval and six digit OTP
- HOTP/T60/5 - HOTP time-based token with 60 second interval and five digit OTP
❗ Dabei sollten Werte > T60 nicht gewählt werden z.b HOTP/T120 ist ungültig ❗
Generierung der QR-Codes
Nachdem die Secrets generiert wurden und in die users.oath
Datei eingetragen wurden, können die QR-Codes generiert werden.
Es werden dabei die Werte aus der oben erwähnten Datei genommen:
# Generate QR-Code
$ qrencode -t UTF8 'otpauth://<<OTP_METHOD>>/<<DISPLAY_NAME>>?secret=<<HEX_SECRET>>'
# e.g
$ qrencode -t UTF8 'otpauth://HOTP/T30/Lugor-ssh-access?secret=1ab4321412aebcw'
Dabei müssen natürlich jeweils die richtigen Parameter eingesetzt werden. Das Ergebnis kann dann z.B mit dem Google Authenticator oder dem Microsoft Authenticator eingelesen werden. hier nachzulesen
Aktivierung des PAM-Moduls
Das pluggable authentication module (PAM) ermöglicht es Programmen die Authentifizierung von einer zentralen Steuerungskomponente übernehmen zu lassen.
Um jetzt das 2FA auf SSH zu aktivieren muss das entsprechende PAM Modul aktivieren und das Challenge Response Verfahren in SSH aktivieren:
# Activate PAM-Modul for sshd
$ sudo /bin/bash -c "echo \"auth requisite pam_oath.so usersfile=/etc/oath/users.oath $(cat /etc/pam.d/sshd)\" > /etc/pam.d/sshd"
# Activate PAM-Modul for Sudo
$ sudo /bin/bash -c "echo \"auth requisite pam_oath.so usersfile=/etc/oath/users.oath $(cat /etc/pam.d/sudo)\" > /etc/pam.d/sudo
Dabei muss folgender Eintrag in der /etc/ssh/sshd_config
geändert werden:
`# ChallengeResponseAuthentication no`
auf
`ChallengeResponseAuthentication yes`
geändert werden und mit
$ systemctl restart sshd.service
Der SSH Server neugestartet werden. Nach dem Ausloggen und wieder einloggen wird man automatisch nach dem OTP gefragt.
Man kann zusätzlich auch noch die Authentifizierung über Zertifikate aktivieren um ein MFA zu erreichen.