So konfigurieren Sie die SSH-Authentifizierung mit allen 3 Komponenten: öffentlicher Schlüssel, Passwort und OTP

So konfigurieren Sie die SSH-Authentifizierung mit allen 3 Komponenten: öffentlicher Schlüssel, Passwort und OTP

Aktualisierung 1: Ich kann mit dieser grundlegenden Konfiguration alle öffentlichen Schlüssel + Passwörter + OTP anwenden /etc/pam.d/common-auth.

auth [success=ok] pam_unix.so
auth [success=1] pam_google_authenticator.so nullok echo_verification_code  [authtok_prompt=Enter your OTP:]
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so

pam_faillock.soIch werde versuchen , dies so umzusetzen, wie es der ursprüngliche Plan vorsah.


Ursprüngliche Frage:

Ich verwende Debian 10 und 12 und möchte, dass meine Benutzer nur dann erfolgreich per SSH auf den Server zugreifen können, wenn sie den passenden öffentlichen Schlüssel haben, dann ihr Passwort eingeben und anschließend OTP (Google Authenticator) eingeben. Kurz gesagt: SSH sollte öffentlichen Schlüssel + Passwort + OTP erfordern.

Ich habe die Kombination aus publickey + passwordoder bereits erfolgreich konfiguriert publickey + OTP, habe aber immer noch Probleme, alle drei zu kombinieren.

Bitte helfen Sie mir bei der Konfiguration.

Mein bisheriger Versuch:

/etc/pam.d/common-auth

auth    required       pam_faillock.so preauth audit silent deny=5 unlock_time=1800
auth    sufficient     pam_unix.so try_first_pass
auth    [default=die]  pam_faillock.so authfail audit deny=5 fail_interval=120 unlock_time=1800
auth    sufficient     pam_faillock.so authsucc audit deny=5 fail_interval=120 unlock_time=1800
auth    required [success=1] pam_google_authenticator.so echo_verification_code
auth    requisite      pam_deny.so
auth    required       pam_permit.so

/etc/pam.d/sshd

@include common-auth
account    required     pam_nologin.so
@include common-account
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_keyinit.so force revoke
@include common-session
session    optional     pam_motd.so  motd=/run/motd.dynamic
session    optional     pam_motd.so noupdate
session    optional     pam_mail.so standard noenv # [1]
session    required     pam_limits.so
session    required     pam_env.so # [1]
session    required     pam_env.so user_readenv=1 envfile=/etc/default/locale
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open
@include common-password

/etc/ssh/sshd_config

Include /etc/ssh/sshd_config.d/*.conf
MaxAuthTries 5
MaxSessions 1
PubkeyAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords no
KbdInteractiveAuthentication yes
UsePAM yes
X11Forwarding yes
PrintMotd no
ClientAliveInterval 60
ClientAliveCountMax 15
AcceptEnv LANG LC_*
Subsystem       sftp    /usr/lib/openssh/sftp-server
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,password,keyboard-interactive

Beim Verbindungsversuch:ssh -i <key_path> user@server -vvv

debug1: Authentications that can continue: publickey
debug3: start over, passed a different list publickey
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Trying private key: <key_path>
debug3: sign_and_send_pubkey: 
debug3: sign_and_send_pubkey: signing using rsa-sha2-512
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
Authenticated with partial success.
debug1: Authentications that can continue: password
debug3: start over, passed a different list password
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup password
debug3: remaining preferred: ,keyboard-interactive,password
debug3: authmethod_is_enabled password
debug1: Next authentication method: password
user@server's password:
debug3: send packet: type 50
debug2: we sent a password packet, wait for reply
debug3: receive packet: type 51
Authenticated with partial success.
debug1: Authentications that can continue: keyboard-interactive
debug3: start over, passed a different list keyboard-interactive
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup keyboard-interactive
debug3: remaining preferred: password
debug3: authmethod_is_enabled keyboard-interactive
debug1: Next authentication method: keyboard-interactive
debug2: userauth_kbdint
debug3: send packet: type 50
debug2: we sent a keyboard-interactive packet, wait for reply
debug3: receive packet: type 60
debug2: input_userauth_info_req: entering
debug2: input_userauth_info_req: num_prompts 1
(user@server) Password:
debug3: send packet: type 61
debug3: receive packet: type 51
debug1: Authentications that can continue: keyboard-interactive
debug2: userauth_kbdint
debug3: send packet: type 50
debug2: we sent a keyboard-interactive packet, wait for reply
debug3: receive packet: type 60
debug2: input_userauth_info_req: entering
debug2: input_userauth_info_req: num_prompts 1
(user@server) Password:
debug3: send packet: type 61
debug3: receive packet: type 51
debug1: Authentications that can continue: keyboard-interactive
debug2: userauth_kbdint
debug3: send packet: type 50
debug2: we sent a keyboard-interactive packet, wait for reply
debug3: receive packet: type 60
debug2: input_userauth_info_req: entering
debug2: input_userauth_info_req: num_prompts 1
(user@server) Password:
debug3: send packet: type 61
debug3: receive packet: type 51
debug1: Authentications that can continue: keyboard-interactive
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
user@server: Permission denied (keyboard-interactive).

Bildbeschreibung hier eingeben

Schritt 3 (Tastatur-Interaktion) schlug fehl und einige Dinge unterschieden sich von der normalen OTP-Verifizierung:

  • Es wurde nicht nach dem gefragt, Verification code:sondern nur nach (user@server) Password:.
  • echo_verification_codeTrotz Konfiguration wurde der Roh-OTP-Code bei der Eingabe nicht angezeigt common-auth.

P/s: Ich habe auch die Konfiguration pam_faillock.soso konfiguriert, dass Benutzer bei fehlgeschlagenen Anmeldeversuchen gesperrt werden.

Antwort1

Nach einigen Versuchen und dankdieser Beitragkann ich pam_faillock.someine Lösung um die Überprüfung von Protokollierungsversuchen und die Sperrung des Benutzers bei Bedarf erweitern.

Seien Sie vorsichtigbeim Bearbeiten der unten aufgeführten Authentifizierungsdateien. ImmerErstelle eine Sicherungder Datei zuerst. UndDenken Sie daran, eine Root-Sitzung aufrecht zu erhalten, und testen Sie Ihre Anmeldung in der anderen Sitzung.

Sehen wir uns meine Konfigurationsdateien an:

Erste: Bearbeiten /etc/pam.d/common-auth, um es auf alle Arten von Anmeldemethoden anzuwenden:

auth    requisite       pam_faillock.so preauth audit deny=5 fail_interval=120 unlock_time=1800
auth    [success=1]     pam_unix.so try_first_pass
auth    [default=die]   pam_faillock.so authfail audit deny=5 fail_interval=120 unlock_time=1800
auth    [success=2]     pam_google_authenticator.so nullok echo_verification_code  [authtok_prompt=Enter your OTP:]
auth    sufficient      pam_faillock.so authsucc audit deny=5 fail_interval=120 unlock_time=1800
auth    requisite       pam_deny.so
auth    required        pam_permit.so

Einige Erklärungen Zeile für Zeile:

  1. Verwenden Sie es pam_faillock.somit preauthund requisiteum den Status des Benutzers zu überprüfen. Wenn der Benutzer gesperrt ist, wird die Kennwortabfrage verhindert. Gefolgt von einigen Konfigurationen, faillockdie Sie überprüfen könnenHier.
  2. Wird verwendet pam_unix.so, um das Passwort des Benutzers zu überprüfen. [success=1]Wenn das Passwort korrekt ist, wird die nächste Zeile übersprungen. Wird verwendet try_first_pass, um die Eingabe des ersten Schritts zu verwenden.
  3. pam_faillock.somit authfailwird der fehlgeschlagene Versuch protokolliert und der Authentifizierungsprozess wird mit fortgesetzt [default=die]. Wenn Sie nicht möchten, dass der Benutzer weiß, wo der Fehler liegt (Passwort oder OTP), vertauschen Sie die Zeilen 3 und 4.
  4. Verwenden Sie diese Option pam_google_authenticator.so, um das OTP zu überprüfen. Weitere Informationen finden Sie hierHier. [success=2]überspringt die nächsten beiden Zeilen, wenn das OTP korrekt ist.
  5. pam_faillock.soMit authsuccder Markierung wird dieser Versuch als gut markiert und die Datensätze für schlechte Versuche werden gelöscht, sodass der Benutzer fortfahren kann.
  6. pam_deny.somit requisitewird der Anmeldeversuch abgelehnt. Daher überspringen einige der obigen Zeilen diese Zeile, wenn die Informationen korrekt sind.
  7. pam_permit.soErlauben Sie den Zugriff einfach nach der Durchführung aller oben genannten Überprüfungen.

Zweite: Bearbeiten Sie /etc/pam.d/common-accountdiese Zeile und fügen Sie sie am Anfang hinzu, um Folgendes zu verwenden faillock:

account required        pam_faillock.so

Dritte: /etc/pam.d/sshdFür SSH-Verbindung bearbeiten. Ich habe nichts an der Standardkonfiguration geändert, sondern sie hier nur aufgelistet, damit ihr sie vergleichen könnt.

@include common-auth
account    required     pam_nologin.so
@include common-account
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_keyinit.so force revoke
@include common-session
session    optional     pam_motd.so  motd=/run/motd.dynamic
session    optional     pam_motd.so noupdate
session    optional     pam_mail.so standard noenv # [1]
session    required     pam_limits.so
session    required     pam_env.so # [1]
session    required     pam_env.so user_readenv=1 envfile=/etc/default/locale
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open
@include common-password

Vierte: Bearbeiten /etc/ssh/sshd_config, um die SSH-Sitzung zu konfigurieren

Include /etc/ssh/sshd_config.d/*.conf
MaxAuthTries 5
MaxSessions 1
PubkeyAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords no
KbdInteractiveAuthentication yes
UsePAM yes
X11Forwarding yes
PrintMotd no
ClientAliveInterval 60
ClientAliveCountMax 15
AcceptEnv LANG LC_*
Subsystem       sftp    /usr/lib/openssh/sftp-server
AuthenticationMethods publickey,keyboard-interactive

Einige wichtige Punkte:

  1. KbdInteractiveAuthentication= yeszur Verwendung keyboard-interactiveder Methode. ChallengeResponseAuthenticationist hierfür ein veralteter Alias.
  2. UsePAMmuss eingestellt sein, yesum alle oben genannten PAM-Konfigurationen zu verwenden
  3. In AuthenticationMethodserkläre ich nur keyboard-interactivedie Eingabeaufforderung für Passwort und OTP.

Laden Sie den Dienst nach dem Bearbeiten der sshd_configDatei neu, sshdum die neue Konfiguration zu aktualisieren.

systemctl reload sshd

Und so kann ich alles überprüfen public key + password (of the user) + OTP.

verwandte Informationen