
Обновление 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
Некоторые пояснения построчно:
- Используйте
pam_faillock.so
сpreauth
иrequisite
проверит статус пользователя. Если пользователь заблокирован, то запретите запрос пароля. Далее следует некоторая конфигурация,faillock
которую вы можете проверитьздесь. - Использовать
pam_unix.so
для проверки пароля пользователя.[success=1]
пропустит следующую строку, если пароль правильный.try_first_pass
использовать ввод первого шага. pam_faillock.so
сauthfail
запишет неудачную попытку и предотвратит дальнейший процесс аутентификации с[default=die]
. Если вы хотите, чтобы пользователь не знал, где произошел сбой (пароль или OTP), то поменяйте местами строки 3 и 4.- Используйте
pam_google_authenticator.so
для проверки OTP. Вы можете найти больше информацииздесь.[success=2]
пропустит следующие две строки, если одноразовый пароль правильный. pam_faillock.so
сauthsucc
отметкой, что эта попытка является удачной и записи о неудачных попытках будут очищены, что позволит пользователю продвинуться дальше.pam_deny.so
сrequisite
отклонит попытку входа. Поэтому некоторые строки выше пропускают эту строку, если информация верна.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
Некоторые ключевые моменты:
KbdInteractiveAuthentication
=yes
для использованияkeyboard-interactive
метода.ChallengeResponseAuthentication
— устаревший псевдоним для этого.UsePAM
необходимо установить дляyes
использования всех конфигураций PAM, указанных выше- В
AuthenticationMethods
я объявляю толькоkeyboard-interactive
для запроса пароля и одноразового пароля.
После редактирования sshd_config
файла перезагрузите sshd
службу, чтобы обновить новую конфигурацию.
systemctl reload sshd
И таким образом я могу проверить все public key + password (of the user) + OTP
.