Graças a dois outros posts de SE ( um em SO , um em SF ), a resposta está em usar avançado control sintaxe . O
auth required pam_unix.so try_first_pass nullok
# and sometime later
auth optional pam_ssh.so use_first_pass
deve, portanto, tornar-se
auth [success=1 new_authtok_reqd=1 ignore=ignore default=ignore] pam_unix.so try_first_pass nullok
auth required pam_ssh.so use_first_pass
Agora é imperativo que a linha pam_ssh preceda exatamente o pam_unix one, pois success=N significa ignorar N após o (s) módulo (s).
Além disso, não se esqueça da linha session pam_ssh.so enquanto você está nessa!
Na minha primeira tentativa, usei
auth [success=1 default=ignore] pam_ssh.so try_first_pass
auth required pam_unix.so use_first_pass nullok
em vez disso, mas esse método bloqueia todos os usuários sem chaves SSH! Acontece que default=ignore não é suficiente, auth_err=ignore tem que ser adicionado, já que aparentemente não é considerado parte de default . Além disso, essa tentativa significa que haverá um prompt de "senha" ou "senha SSH", dependendo se o usuário tiver uma chave SSH!
Observe que no Arch Linux, a linha pam_unix usada por login está na include chain
login -> system-local-login -> system-login -> system-auth
e que system-login tem outros required antes incluindo system-auth , então você não pode simplesmente colocar auth [success=1 default=ignore] pam_ssh.so try_first_pass antes de login auth include system-local-login - você pulará o required errado e, graças ao pam_unix.so use_first_pass (em vez de try_first_pass ), você ainda pode fazer login com sua senha de login! Por outro lado, modificando system-auth , você também está permitindo que outros serviços como sshd usem sua chave SSH como opção de autenticação para a senha de login. Se você realmente quer apenas que seu login use isso, você tem que praticamente quebrar a corrente include e copiar manualmente todos os auth s para login .