Tanto o pam_unix quanto o pam_unix2 usam o libc para procurar o hash da senha, e o Glibc tem os locais /etc/nsswitch.conf
e /etc/shadow
codificados. Nem seria tão simples quanto recompilar pam_unix
ou pam_unix2
: ambos passam pelo mecanismo NSS normal para verificar as senhas, eles usam somente seus conhecimentos de /etc/passwd
, /etc/shadow
e NIS para alterações de senha.
No entanto, você pode usar o % módulopam_pwdfile
. Eu nunca usei, mas a descrição parece exatamente o que você está procurando.
This PAM module lets you use an arbitrarily-named text file similar in structure to
/etc/passwd
to authenticate users.
Alternativamente, você pode usar o pam_userdb
, que verifica um senha em um banco de dados no formato Berkeley DB com um nome de arquivo passado como um argumento.
Agora, para detectar a presença do pendrive, você precisa de outro módulo PAM. pam_listfile
parece certo para o trabalho. Organize uma regra do udev que monte sua chave USB e apenas essa chave USB, em um determinado local, diga /media/authentication-key
; crie um arquivo users.txt
contendo a lista de nomes de usuários que podem usar uma senha mais curta. Se você quiser um teste mais complexo na pilha do PAM, você pode usar 'pam_exec .
Aqui está uma pilha que assume que /etc/shadow
contém suas senhas strongs e /etc/passwd.weak
contém suas senhas fracas. Aviso: não foi testado e não sou fluente no PAM, portanto, revise-o com atenção.
auth [success=ignore default=1] pam_listfile.so file=/media/authentication-key/users.txt iter=user sense=allow onerr=fail
auth [success=1 default=bad] pam_unix.so
auth [success=ok default=bad] pam_pwdfile.so pwdfile=/etc/passwd.weak
auth requisite pam_deny.so