Запретить sudo запрашивать пароль при выполнении недопустимой команды


15

Я предоставил группе разрешение на запуск определенных команд без пароля через sudo. Когда один из пользователей делает опечатку или запускает неправильную команду, система запрашивает у них пароль, а затем они получают ошибку. Это сбивает с толку пользователя, поэтому я хотел бы просто отобразить ошибку, а не запрашивать пароль. Это возможно?

Вот пример моего файла sudoers:

%mygroup ALL=(ALL) NOPASSWD:/usr/local/bin/myscript.sh *

Пример, когда они запускают неправильный скрипт:

# sudo /usr/local/bin/otherscript.sh
[sudo] password for user:
Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>.

Желаемый вывод:

Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>. Please check the command and try again.

Обратите внимание на отсутствие запроса пароля.

Мой Google-фу не удалось меня и возвращает результаты , только на не спрашивая пароля , когда пользователь будет разрешено выполнять команду.


8
Если бы это было возможно, это могло бы открыть (маленькую) дыру в безопасности. Если вы оставили себя в системе, а я «одолжил» вашу клавиатуру, я не вижу, какие команды sudoпозволят вам выполнить без ввода пароля. С помощью функции, которую вы хотите, я мог бы получить эту информацию для конкретных команд.
Кит Томпсон,

4
Это довольно большая проблема безопасности. Вы не должны использовать sudo со скриптами в качестве команды. Люди могут просто отредактировать сценарий и запустить то, что он хочет, полностью скрывая его от аудита. Вместо этого добавьте вызов sudo внутри скрипта.
Котейр

1
@coteyr работает с бинарными файлами с sudoтакой же большой проблемой, если пользователи имеют доступ на запись к этим файлам.
Дмитрий Григорьев

1
@CarlWitthoft, поэтому вы используете абсолютные пути для указания разрешенных программ в sudoers.
Дмитрий Григорьев

1
@DmitryGrigoryev, да, но если вы собираетесь использовать sed или что-то подобное только для одного файла, то sudo не принесет никакой пользы. Разрешение пользователю изменять файл - вот почему файлы имеют разрешения. Вам не нужно изобретать велосипед. Если вы хотите, чтобы пользователь мог изменять файл, тогда позвольте ему. Нет необходимости или пользы в переходах через sudo, чтобы позволить пользователю изменять файл без пароля. Вы всегда можете просто позволить им. Правильный инструмент для правильной работы.
Котейр

Ответы:


25

Из краткого прочтения sudo(8)

   -n          The -n (non-interactive) option prevents sudo from
               prompting the user for a password.  If a password is
               required for the command to run, sudo will display an error
               message and exit.

И для сомневающихся:

# grep jdoe /etc/sudoers
jdoe    ALL=(ALL) NOPASSWD: /bin/echo
#

Проверено таким образом:

% sudo echo allowed
allowed
% sudo -n ed             
sudo: a password is required
% sudo ed               

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

Password:

Таким образом, aliasfor sudoдля этих людей, вероятно, добьется цели, чтобы предотвратить запрос пароля. Теперь, почему это требует специальной компиляции sudo, я не знаю, я просто прочитал руководство.


В самом деле. Я бы поместил что-то вроде alias sudo="$(which sudo) -n"в / etc / bashrc, а затем использовал бы sudo(скорректированное поведение) или command sudo(поведение по умолчанию) по желанию.
CVN

7

Одна вещь, которая сработала для меня (Sudo версия 1.8.17p1), но удовлетворяет только часть вашей проблемы, это установить количество попыток ввода пароля равным 0.

Defaults:%mygroup passwd_tries = 0

Это заставляет sudo завершить работу с кодом 1, когда пробуется любая команда, требующая пароль. Тем не менее, он не выдает никаких сообщений об ошибках.


Это также правильный ответ, но отсутствие сообщения об ошибке может сбить с толку. Однако правильная, но неожиданная ошибка в ответе выше также сбивает с толку. Я думаю, это бросок. Спасибо за альтернативный ответ, варианты всегда приветствуются!
user184982

2

Тебе нельзя.

Невозможно сказать, кто вы, пока вы не прошли аутентификацию, и по умолчанию вы не можете аутентифицироваться без пароля.

Вы можете изменить аутентификацию, чтобы использовать USB-ключи, сканеры отпечатков пальцев, голосовую аутентификацию, распознавание лиц или кучу других вещей, но суть та же.

Вы не можете проходить аутентификацию без аутентификации И до того, как вы аутентифицируетесь, sudo не имеет права рассказывать вам, что вы можете или не можете запустить.


2
Ввод пароля при запуске sudo не является идентификацией («расскажите, кто вы»). Судо знает, кто ты. Ввод вашего пароля является подтверждением присутствия.
Жиль "ТАК - перестань быть злым"

Подтверждение присутствия я считаю "аутентификацией". Как в Аутентификации, так и в Авторизации.
Котейр

2
Ответ говорит «аутентификация», а не «идентификация». Хотя sudo знает, кем вы себя называете , основываясь на пользователе, который вошел в систему на этом терминале, он не будет знать, кто вы , пока вы не аутентифицируете эту личность.
Дейв Шерохман

2

@StrongBad сделал комментарий, который заслуживает ответа:

Я думаю, что лучшим решением было бы написать скрипт-обертку, который всегда вызывает sudoс правильными параметрами. (В том числе -n)

Скрипт-обертка может выполнять разбор аргументов и т. Д., Так что вызываемый скрипт sudo становится настолько малым, насколько это возможно, и, следовательно, с меньшей вероятностью может иметь ошибки.


1

Это невозможно. Единственный способ - это изменить исходный код и скомпилировать свой собственный форкsudo


Вы правы, но я не думаю, что получу разрешение на загрузку пользовательской версии sudo на все наши производственные серверы. хах
user184982
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.