Как настроить аутентификацию SSH со всеми 3 компонентами: открытым ключом, паролем и OTP

Как настроить аутентификацию SSH со всеми 3 компонентами: открытым ключом, паролем и OTP

Обновление 1: Я могу применить все открытые ключи + пароли + OTP с помощью этой базовой конфигурации в /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.soэто как первоначальный план.


Исходный вопрос:

Я использую Debian 10 и 12 и хотел бы, чтобы мои пользователи успешно подключались к серверу по SSH только в том случае, если они сопоставили открытый ключ, затем ввели свой пароль, а затем выполнили OTP (google-authenticator). Короче говоря, SSH должен требовать открытый ключ + пароль + OTP.

Я уже успешно настроил комбинацию publickey + passwordили publickey + OTP, но все еще испытываю трудности с объединением всех трех.

Помогите мне, пожалуйста, настроить его.

Мои попытки на данный момент:

/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

При попытке подключения: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).

введите описание изображения здесь

На шаге 3 (интерактивное взаимодействие с клавиатурой) произошел сбой, и некоторые моменты отличались от обычной проверки одноразового пароля:

  • Он не просил, Verification code:а просто спросил (user@server) Password:.
  • Он не показал исходный код OTP, когда я его ввел, несмотря на конфигурацию echo_verification_codeв common-auth.

P/s: Я также настроил pam_faillock.soблокировку пользователей при неудачных попытках входа.

решение1

После нескольких попыток и благодаряэта почта, я могу добавить pam_faillock.soв свое решение проверку попыток регистрации и блокировку пользователя при необходимости.

Будь остороженпри редактировании файлов, связанных с аутентификацией, ниже. Всегдасделать резервную копиюфайла первым. Ине забудьте сохранить одну корневую сессию активнойи проверьте свой вход в систему в другом сеансе.

Давайте посмотрим мои файлы конфигурации:

Первый: Отредактируйте /etc/pam.d/common-auth, чтобы применить ко всем видам методов входа в систему:

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

Некоторые пояснения построчно:

  1. Используйте pam_faillock.soс preauthи requisiteпроверит статус пользователя. Если пользователь заблокирован, то запретите запрос пароля. Далее следует некоторая конфигурация, faillockкоторую вы можете проверитьздесь.
  2. Использовать pam_unix.soдля проверки пароля пользователя. [success=1]пропустит следующую строку, если пароль правильный. try_first_passиспользовать ввод первого шага.
  3. pam_faillock.soс authfailзапишет неудачную попытку и предотвратит дальнейший процесс аутентификации с [default=die]. Если вы хотите, чтобы пользователь не знал, где произошел сбой (пароль или OTP), то поменяйте местами строки 3 и 4.
  4. Используйте pam_google_authenticator.soдля проверки OTP. Вы можете найти больше информацииздесь. [success=2]пропустит следующие две строки, если одноразовый пароль правильный.
  5. pam_faillock.soс authsuccотметкой, что эта попытка является удачной и записи о неудачных попытках будут очищены, что позволит пользователю продвинуться дальше.
  6. pam_deny.soс requisiteотклонит попытку входа. Поэтому некоторые строки выше пропускают эту строку, если информация верна.
  7. pam_permit.soпросто разрешите доступ после всех проверок, указанных выше.

Второй: Отредактируйте /etc/pam.d/common-accountи добавьте эту строку в начало для использования faillock:

account required        pam_faillock.so

Третий: Редактировать /etc/pam.d/sshdдля SSH-подключения. Я ничего не менял в конфигурации по умолчанию, просто перечислил ее здесь, чтобы вы могли сравнить.

@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, чтобы настроить сеанс SSH

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

Некоторые ключевые моменты:

  1. KbdInteractiveAuthentication= yesдля использования keyboard-interactiveметода. ChallengeResponseAuthentication— устаревший псевдоним для этого.
  2. UsePAMнеобходимо установить для yesиспользования всех конфигураций PAM, указанных выше
  3. В AuthenticationMethodsя объявляю только keyboard-interactiveдля запроса пароля и одноразового пароля.

После редактирования sshd_configфайла перезагрузите sshdслужбу, чтобы обновить новую конфигурацию.

systemctl reload sshd

И таким образом я могу проверить все public key + password (of the user) + OTP.

Связанный контент