2

Есть ли способ запустить пользовательскую команду при выполнении passwd ? Я создаю серверный графический интерфейс и хочу связать пользователей приложения с пользователями системы. И я не хочу использовать только простую аутентификацию PAM. Поэтому я хочу запустить скрипт, который получит имя пользователя и пароль, и отправит его на Mysql Server. На самом деле теперь, когда я пишу это, кажется, что-то из проблемы безопасности. Независимо от того, возможно ли это?

1 ответ1

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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .