Você pode detectar se alguém executa passwd
usando inotifywait
, mas, até onde eu sei, você não pode controlar seu comportamento dessa maneira.
No seu próprio servidor, no entanto, você pode substituir o programa passwd
real pelo seu script, que então invoca o programa passwd
real. Isso pode implicar vários riscos de segurança, então eu não faria isso e nem tentaria listar todos os riscos. Ainda assim, se você quiser fazer isso, um script expect
como esse pode funcionar como um substituto:
#!/usr/bin/expect
set timeout -1
set new_passwd ""
log_user 0
spawn /usr/bin/passwd.real
log_user 1
stty -echo
expect {
-re "current.*password" {
expect_user -re "(.*)\n"
send "$expect_out(1,string)\n"
exp_continue
}
-re "new.*password:" {
expect_user -re "(.*)\n"
set new_passwd $expect_out(1,string)
send "$new_passwd\n"
exp_continue
}
-re "passwd:.*unchanged" {
set new_passwd ""
interact
}
-re "passwd:.*updated successfully" {
interact
}
}
stty echo
if { $new_passwd != "" } {
send_user "New password for user '$env(USER)'/'$env(LOGNAME)': $new_passwd\n"
#system my_password_manipulation_script.sh $env(USER) $env(LOGNAME) $new_passwd
}
Após renomear passwd
para passwd.real
, você colocaria esse script em /usr/bin/passwd
e concederia a permissão de execução normal (0755). Suid bit não é necessário (e seria outro problema de segurança), já que este script é apenas um frontend para o programa passwd
real.
O script funciona no Debian Jessie (8.4), em outros sistemas você pode ter que ajustar as palavras-chave correspondentes (atual. * senha, nova. * senha, etc). Além disso, você comente a última linha send_user e descomente a chamada do sistema, onde você realmente propaga a senha.
Mais uma vez: tente considerar todas as implicações de segurança antes de fazer isso! Além disso, seus usuários provavelmente devem saber que você pode conseguir que suas senhas não sejam criptografadas. Talvez seja melhor, se você salvou este script como por exemplo. mypasswd
(e geraria passwd
depois) e pediu aos usuários para alterarem a senha usando mypasswd
. Isso deixaria claro que eles não estão usando o original passwd
.