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/passwdto 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