Como obter autenticação condicional do PAM?

5

Atualmente estou usando

auth required pam_unix.so try_first_pass nullok
auth optional pam_ssh.so  use_first_pass

(mais algumas outras entradas, provavelmente irrelevantes, que o Arch Linux adicionou por padrão), o que significa que minha senha de login também é usada para tentar desbloquear qualquer chave ssh armazenada (ou vinculada a) em ~/.ssh/login-keys.d/ graças a pam_ssh (eu também poderia usar try_first_pass para obter um prompt de senha, caso nenhuma chave ssh fosse desbloqueada pela minha senha de login ).

Isso funciona bem, desde que a frase secreta da chave SSH seja idêntica à senha de login. No entanto, o que eu gostaria de alcançar é que eu posso basicamente fazer o login com uma das duas senhas diferentes - meu login um ou a chave SSH um.

Então, pensei que pam_ssh deveria tentar desbloquear minha chave SSH, e somente se falhar, pam_unix será necessário, caso contrário, ela deverá ser ignorada. Isso pode ser conseguido de alguma forma?

Primeiro, achei que a solução estava em colocar pam_ssh primeiro, mas, além disso, ele precisa ser transformado em sufficient em vez de optional :

auth sufficient pam_ssh.so  try_first_pass
auth required pam_unix.so try_first_pass nullok

No entanto, nos arquivos reais existem algumas outras required linhas seguintes required pam_unix.so , como required pam_env.so , que agora seriam ignoradas! Então, como posso realmente resolver isso?

    
por Tobias Kienzler 29.10.2015 / 13:46

1 resposta

6

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 .

    
por 29.10.2015 / 13:46

Tags