Запустить скрипт при смене пароля
Есть ли способ запустить пользовательскую команду, когда passwd
выполняется? Я создаю графический интерфейс сервера и хочу связать пользователей приложения с пользователями системы. И я не хочу использовать только простую аутентификацию PAM. Поэтому я хочу запустить скрипт, который получит имя пользователя и пароль, и отправит его на Mysql Server. На самом деле теперь, когда я пишу это, кажется, что-то из проблемы безопасности. Независимо от того, возможно ли это?
1 ответ
Вы можете обнаружить, если кто-то бежит passwd
с помощью inotifywait
, но, насколько я знаю, вы не можете контролировать его поведение таким образом.
Однако на вашем собственном сервере вы можете заменить реальный passwd
программа с вашим скриптом, который вызывает реальный passwd
Программа тогда. Это может подразумевать несколько рисков для безопасности, поэтому я бы этого не сделал и даже не попытался бы перечислить все риски. Тем не менее, если вы хотите сделать такую вещь, expect
такой скрипт может работать как замена:
#!/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
}
После переименования passwd
в passwd.real
, вы бы поместили этот скрипт в /usr/bin/passwd
и дайте ему нормальное разрешение на работу (0755). Suid-бит не является необходимым (и это было бы еще одной проблемой безопасности), так как этот сценарий является лишь интерфейсом к реальному passwd
программа.
Сценарий работает на Debian Jessie (8.4), в других системах вам может потребоваться настроить соответствующие ключевые слова (текущий.* Пароль, новый.* Пароль и т. Д.). Также вы должны закомментировать последнюю строку send_user и раскомментировать системный вызов, где вы на самом деле распространяете пароль.
Еще раз: попробуйте рассмотреть все последствия для безопасности, прежде чем сделать это! Кроме того, ваши пользователи, вероятно, должны знать, что вы можете получить их пароли в незашифрованном виде. Возможно, было бы лучше, если бы вы сохранили этот скрипт как, например. mypasswd
(и это будет порождать passwd
затем) и попросил ваших пользователей сменить пароль, используя mypasswd
, Это дало бы понять, что они не используют оригинал passwd
,