Проверка пользователя

Предположим, что я написал исполняемый файл setuid root, и я хочу, чтобы он удостоверился, что пользователь не является скриптом, попросив пользователя предоставить свой пароль (предоставленный, пользователи могут сохранять свой пароль и использовать его в скрипте, но это doesn Меня это беспокоит.

Что было бы хорошим способом сделать это? Чем портативнее, тем лучше.

2 Solutions collect form web for “Проверка пользователя”

Большинство современных Unix-систем используют PAM для аутентификации. Модуль pam_unix – это тот, который выполняет аутентификацию пароля с /etc/password и /etc/shadow .

Однако вы не должны изобретать велосипед. Задавать пароль пользователя и выполнять его как root – это базовая конфигурация sudo , стандартного способа повышения привилегий. Обратите внимание, что правильное повышение привилегий является сложным: не помните, чтобы очистить все переменные среды, которые могут повлиять на вашу программу? Судо прилагает все усилия, чтобы сделать это безопасно.

Чтобы пользователь мог запустить /usr/local/bin/myprogram как root с любыми аргументами по ее выбору после ввода пароля, используйте следующую строку в файле sudoers (файл конфигурации sudo):

 alice ALL = (root) /usr/local/bin/myprogram 

Чтобы отредактировать файл sudoers , запустите команду visudo .

Алисе нужно будет запустить sudo myprogram . Если вы хотите, чтобы она могла набирать только имя программы, скройте ее в сценарии оболочки. Но обратите внимание, что Алиса может предпочесть запустить что-то вроде gksudo myprogram чтобы получить приглашение GUI.

Возможны многие варианты, в том числе запрет вызова вызывающим из аргументов:

 alice ALL = (root) /usr/local/bin/myprogram "" 

или применения записи к группе:

 %mygroup ALL = (root) /usr/local/bin/myprogram 

Если ваша программа должна знать, кто ее вызвал, sudo делает это доступным в переменных среды SUDO_UID и SUDO_USER .

Я искал что-то вроде этого

(Удар):

 hash=$(sudo cat /etc/shadow |grep "^$USER:" |cut -d: -f2) cmphash=$(mkpasswd -m sha-512 -S "$(echo "$hash" | cut -d '$' -f3)") cmp <(echo "$hash") <(echo "$cmphash") && echo "Correct password!" 

Это работает, но кодирует хеш-метод, который каким-то образом идентифицируется по числу в echo "$hash" | cut -d '$' -f2 echo "$hash" | cut -d '$' -f2 который в этом случае равен 6. Мне еще предстоит выяснить, как сопоставить число с хэш-методом.

Interesting Posts
Linux и Unix - лучшая ОС в мире.