Eu segui https://ubuntu.com/tutorials/configure-ssh-2fa para configurar a proteção 2FA no SSH no meu sistema Ubuntu 22.04.5. Eu tenho apenas autenticação baseada em chave habilitada, então isso pode ser excessivo, mas parece mais seguro que mesmo se de alguma forma minha chave privada se soltasse, não seria o suficiente por si só.
Não quero ter que inserir um código TOTP ao conectar de um sistema na minha LAN, então o meu /etc/pam.d/sshd
tem isto:
auth [success=done default=ignore] pam_access.so accessfile=/etc/security/access-local.conf
auth required pam_google_authenticator.so
/etc/security/access-local.conf
tem:
+ : ALL : 192.168.1.0/24
+ : ALL : LOCAL
- : ALL : ALL
Tudo isso funciona bem. Sou solicitado a fornecer um código TOTP quando estou fora da minha LAN e não quando estou nela.
Meu problema agora é que o tab-completion scp
não funciona mais. Por exemplo, em outro sistema eu tento:
$ scp server:someth<TAB>
e something
deve completar automaticamente, assumindo que o arquivo existe. Isso funciona bem quando não tenho o módulo PAM habilitado, mas não funciona quando está. Mesmo no caso em que estou na minha LAN e não sou solicitado a fornecer o código TOTP, ele falha. Quando pressiono TAB, recebo mensagens como esta no servidor /var/log/auth.log
:
Oct 26 17:08:13 server sshd[1136620]: Connection closed by authenticating user user 192.168.1.182 port 53145 [preauth]
Oct 26 17:08:13 server sshd[1136732]: Connection closed by authenticating user user 192.168.1.182 port 53146 [preauth]
As mensagens sempre aparecem em pares como esta para cada pressionamento de TAB.
Alguém tem alguma ideia do que posso fazer para que isso funcione?
Para que a conclusão de tabulação funcione, o ssh precisa funcionar sem exigir autenticação interativa.
Há duas maneiras de fazer isso. A maneira comum é usar uma chave ssh criada com
ssh-keygen
e a parte pública copiada (comssh-copy-id
) para oauthorized_keys
arquivo na sua configuração ssh remota. Provavelmente isso não pode funcionar sem ignorar ou desabilitar 2fa e derrotaria seus objetivos.A outra maneira é usar uma conexão ssh compartilhada habilitada com a
ControlMaster
opção e ajustada com várias outras opções. Isso efetivamente faz com que você faça login uma vez com ssh, e todas as conexões ssh subsequentes usem a conexão original sem precisar de reautenticação. Todas as conexões serão interrompidas quando a primeira conexão ("mestre") for fechada. Como alternativa, você pode definir um tempo limite comControlPersist
para limitar quanto tempo a conexão em segundo plano permanece aberta após a primeira ter sido fechada e as conexões restantes ficarem ociosas. (Ou force manualmente o fechamento a qualquer momento...)Note, no entanto, que com a opção ControlMaster, todas as conexões ssh são multiplexadas por meio de um único soquete tcp e compartilham essa largura de banda. Então, se você estiver contando com vários soquetes tcp para obter maior largura de banda, precisará ignorar a conexão master para esses fluxos.
A resposta de @user10489 me levou à solução. Meu
sshd_config
hadAuthenticationMethods publickey,keyboard-interactive
e removendokeyboard-interactive
resolveram o problema, mas também fizeram com que o módulo PAM não fosse mais invocado para pedir o código TOTP.Eu modifiquei assim e tive que movê-lo para o final do meu
sshd_config
, e agora não sou solicitado a usar o TOTP na minha LAN, mas sim fora da LAN, e a função de completar com tabulação funciona pelo menos na minha LAN, o que é tudo o que eu queria: