Запретить 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-фу не удалось меня и возвращает результаты , только на не спрашивая пароля , когда пользователь будет разрешено выполнять команду.

user184982
источник
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, я не знаю, я просто прочитал руководство.

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

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

Defaults:%mygroup passwd_tries = 0

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

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

Тебе нельзя.

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

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

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

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

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

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

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

Стиг Хеммер
источник
1

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

user1700494
источник
Вы правы, но я не думаю, что получу разрешение на загрузку пользовательской версии sudo на все наши производственные серверы. хах
user184982