Como configurar a autenticação SSH com todos os 3 componentes: chave pública, senha e OTP

Como configurar a autenticação SSH com todos os 3 componentes: chave pública, senha e OTP

Atualização 1: Consigo aplicar todas as chaves públicas + senha + OTP com esta configuração básica em /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

Tentarei aplicar pam_faillock.soisso como o plano original.


Pergunta original:

Estou usando o Debian 10 e 12 e gostaria de fazer com que meus usuários só usassem SSH com sucesso para o servidor se eles tivessem uma chave pública correspondente, inserissem sua senha e seguissem com OTP (google-authenticator). Resumindo, o SSH deve exigir chave pública + senha + OTP.

Já configurei com sucesso a combinação de publickey + passwordou publickey + OTP, mas ainda tenho dificuldade para combinar todos os três.

Por favor me ajude a configurá-lo.

Minha tentativa até agora:

/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

Ao tentar conectar: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).

insira a descrição da imagem aqui

Falha na etapa 3 (teclado interativo) e algumas coisas eram diferentes da verificação OTP normal:

  • Não pediu, Verification code:mas apenas pediu (user@server) Password:.
  • Ele não mostrou o código OTP bruto quando eu inseri, apesar da configuração echo_verification_codeno arquivo common-auth.

P/s: Também configurei pam_faillock.sopara bloquear usuários em caso de tentativas de login malsucedidas.

Responder1

Depois de algumas tentativas, e graças aesta postagem, posso adicionar pam_faillock.soà minha solução a verificação de tentativas de registro e o bloqueio do usuário, se necessário.

Tome cuidadoao editar os arquivos relacionados à autenticação abaixo. Semprefaça um backupdo arquivo primeiro. Elembre-se de manter uma sessão root ativae teste seu login na outra sessão.

Vamos ver meus arquivos de configuração:

Primeiro: edite /etc/pam.d/common-authpara aplicar a todos os tipos de métodos de login:

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

Algumas explicações linha por linha:

  1. Use pam_faillock.socom preauthe requisiteverificará o status do usuário. Se o usuário estiver bloqueado, evite a solicitação de senha. Seguido por alguma configuração faillockque você pode verificaraqui.
  2. Use pam_unix.sopara verificar a senha do usuário. [success=1]irá pular a próxima linha se a senha estiver correta. try_first_passpara usar a entrada da primeira etapa.
  3. pam_faillock.sowith authfailregistrará a tentativa fracassada e impedirá que o processo de autenticação prossiga com [default=die]. Se você quiser que o usuário não saiba onde está falhando (senha ou OTP), troque as linhas 3 e 4.
  4. Use pam_google_authenticator.sopara verificar o OTP. Você pode encontrar mais informaçõesaqui. [success=2]irá pular as próximas duas linhas se o OTP estiver correto.
  5. pam_faillock.socom authsuccmark esta tentativa é boa e limpará os registros de tentativas ruins, permitindo ao usuário ir mais longe.
  6. pam_deny.sowith requisitenegará a tentativa de login. Portanto, algumas linhas acima pulam esta linha se a informação estiver correta.
  7. pam_permit.sosimplesmente permita o acesso após todas as verificações acima.

Segundo: Edite /etc/pam.d/common-accounte adicione esta linha no início para usar faillock:

account required        pam_faillock.so

Terceiro: Edite /etc/pam.d/sshdpara conexão SSH. Não mudei nada na configuração padrão, apenas listei aqui para vocês compararem.

@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

Quarto: Edite /etc/ssh/sshd_configpara configurar a sessão 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

Alguns itens principais:

  1. KbdInteractiveAuthentication= yespara usar keyboard-interactiveo método. ChallengeResponseAuthenticationé um alias obsoleto para isso.
  2. UsePAMdeve ser definido como yespara usar todas as configurações do PAM acima
  3. Em AuthenticationMethods, eu declaro apenas keyboard-interactivea senha e o prompt OTP.

Após editar o sshd_configarquivo, recarregue o sshdserviço para atualizar a nova configuração.

systemctl reload sshd

E assim, posso verificar todos public key + password (of the user) + OTP.

informação relacionada