Shell-Zugänge für Unix/Linux-Systeme sind kritisch sofern sie nur aus Benutzername und Passwort bestehen. Auch die schlüsselbasierte Authentification ist keine Sicherheit wenn ein mobiles Gerät abhanden kommt. Jeder Unix-SysAdmin weiss um diesen Umstand und ist darob wenig erfreut. Sind die Credentials bekannt, das Passwort geknackt oder der Schlüssel in falschen Händen, stehen dem Eindringling keine Hürden mehr im Weg, sudo sei Dank, das System zu übernehmen,
Im Firmennetzwerk mag das kein grösseres Problem darstellen da die Systeme in physischer Sicherheit stehen. Erfolgt aber der Zugriff von aussen, reicht das nicht mehr. Eine einfach umzusetzende Massnahme stellt die 2-Faktor-Authentifizierung (2FA) dar. Wir beziehen ein weiteres Gerät, z.B. das Smartphone, mit ein. Die Chance, das alle Geräte abhanden kommen und entsperrt werden können ist kleiner als nur ein single Passwort zu ergattern.
Google-Authenticator und PAM
Um für login und sudo 2-Faktor-Authentifizierung zu ermöglichen ist PAM auf unixoiden Systemen zuständig. PAM – Plugable Authentication Module ist zuständig für die Authentifizierung der Benutzer. Google bietet für PAM eine Bibliothek an, welche eine 2FA durchführt.
Google-Authenticator installieren
Als erstes installierst du den Google-Authenticator aus dem App-Store für dein Smartphone (iOS oder Android). Du kannst ihn allerdings noch nicht starten.
PAM-Libraries auf deinem Linux installieren
- Öffne ein Terminal zu dem Unix/Linux-System welches du absichern willst
- Installiere die PAM-Libraries (z.B. mittes: “sudo apt install libpam-google-authenticator”
- Gib dein sudo-Passwort ein
- Bestätige die Installation
- Las die Installation beenden
PAM-Konfiguration
Achtung: Nach diesem Schritt kannst du nur noch mit einem Code einloggen!
Plan B!!!
Damit wir uns nicht versehentlich ausschliessen, kommt unser Plan B ins Spiel:
- Starte eine Screen-Session: “screen<ENTER>”
- Kopiere die Datei “/etc/pam.d/common-auth” nach “/tmp”
“cp /etc/pam.d/common-auth /tmp” - Wir kreieren nun einen Loop der alle 10 Minuten das gesicherte “/tmp/common-auth” wieder nach “/etc/pam.d/” kopiert. Geht etwas schief, können wir nach 10 Minuten wieder “normal” einloggen
1 2 3 |
screen cp /etc/pam.d/common-auth /tmp while true ; do cp /tmp/common-auth /etc/pam.d ; sleep 600 ; done & |
Geht etwas schief, wird nach 10 Minuten das original “common-auth” nach “/etc/pam.d” zurückkopiert. Starte dies in einer “screen”-Session!
Finde folgende Zeile in der Datei “/etc/pam.d/common-auth”:
1 |
auth [success=1 default=ignore] pam_unix.so nullok_secure |
Füge die folgende Zeile oberhalb ein:
1 |
auth required pam_google_authenticator.so |
Achtung: Sobald du diese Datei speicherst, kannst du dich nicht mehr ohne Code einloggen. Es ist dringend geraten, die aktuelle Session zu behalten! Oder 10 Minuten zu warten, dann kommt ja unser Plan B.
Barcode und secret Key generieren
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
rat@bora <~> $ google-authenticator Do you want authentication tokens to be time-based (y/n) y Warning: pasting the following URL into your browser exposes the OTP secret to Google: https://www.google.com/chart?chs=xx <BARCODE> Your new secret key is: 236PYE3KISLUZ62USHCNWGE462 # Your verification code is 487956 Your emergency scratch codes are: 80892822 95740500 41425327 15750665 88508262 Do you want me to update your "/home/rat/.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, a new token is generated every 30 seconds by the mobile app. 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. This allows for a time skew of up to 30 seconds between authentication server and client. If you experience problems with poor time synchronization, you can increase the window from its default size of 3 permitted codes (one previous code, the current code, the next code) to 17 permitted codes (the 8 previous codes, the current code, and the 8 next codes). This will permit for a time skew of up to 4 minutes between client and server. 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) nIf 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) n rat@bora <~> $ |
Google-Authenticator einrichten
Starte auf deinem Smartphone die Google-Authenticator-App:
Scanne den Barcode oder trage den Schlüssel (“Your new secrete key is:”) manuel ein. Du kannst nun in einem zweiten Terminal probieren auf dein Zielsystem einzuloggen:
SSH-Konfiguration
Um die 2FA für SSH zu benutzen, passe die Datei: “/etc/pam.d/sshd” an. Füge die folgende Zeile am Dateiende dazu:
1 |
auth required pam_google_authenticator.so nullok |
und passe die Datei “/etc/ssh/sshd_config” an:
Anstatt:
1 |
ChallengeResponseAuthentication no |
setze:
1 |
ChallengeResponseAuthentication yes |
und starte den SSH-Service neu:
1 |
sudo systemctl restart sshd.service |
Log-In
Erfahre den Code auf deinem Smartphone:
Verbinde dich in einem Terminal mit deinem Linux-System:
1 2 3 4 5 6 |
ssh 192.168.1.127 Verification code:881892 Password:<password> Last login: Fri Mar 27 16:04:51 2020 from 192.168.1.101 Have a lot of fun... rat@bora:~> |
Vergiss nicht Plan B zu beenden!
Dieser Vorgang ist für jeden berechtigten Benutzer zu wiederholen.
Fazit:
Ein kleiner Eingriff, durch den die Sicherheit für Fernzugriffe/-logins massiv gesteigert werden kann. Die Codes auf der App sind jeweils 30s gültig. Nachteil ist, dass Google Authenticator oder Authy auf dem Smartphone installiert werden müssen.