Назад | Перейти на главную страницу

Безопасно выполнять пользовательские части скрипта как sudo

В /usr/local/bin У меня есть следующий сценарий под названием sdown

/usr/local/bin$ cat sdown 
#!/bin/bash

if [ $# -lt 1 ];
then
  echo "no time set"
else
  sudo shutdown -h $1
fi

Разрешений 788: -rwxr-xr-- user user sdown

Дело в том, что если я запускаю скрипт, он запрашивает пароль sudo:

/usr/local/bin$ sdown 13:37
[sudo] password for user: 

Чтобы сделать мою жизнь еще лучше, я бы не хотел вводить пароль для выключения компьютера. Я думаю, что есть возможности, которые я мог бы поискать:

Наверное, первый способ проще, и я могу это сделать на моей частной машине. Однако мне интересно, что, если я попаду в другую ситуацию. Хотя это теоретически, я бы хотел изучить передовой опыт.

Интересно, лучше ли предоставить разрешение для конкретного сценария, который я пишу и, следовательно, знать, что он делает, а что нет, вместо удаления защиты паролем sudo для полной команды (в данном случае shutdown. Это возможно?

Также в этом сценарии, я полагаю, я должен рассмотреть возможность внедрения кода путем некоторых манипуляций со сценарием. Я думаю, поэтому мне следует изменить владельца и группу на root и просто разрешить выполнение, но не предоставлять доступ для чтения и записи другим пользователям.
(Или только для группы в случае более конкретных решений.) Но как насчет возможности того, что кто-то обменяется полным файлом на некоторые из своих и, следовательно, получит права sudo?

Первое: вы почти наверняка тратите свои усилия.
Прочтите справочную страницу для shutdown в вашей системе: Аргумент времени является обязательным для каждой реализации, которую я когда-либо видел.

Если вы попытаетесь запустить shutdown -h без споров о времени он будет кричать на вас:

[mgraziano@monitor ~]$ sudo shutdown -h
Password: 
usage: shutdown [-] [-h | -p | -r | -k] [-o [-n]] time [warning-message ...]

Однако, чтобы ответить на ваш вопрос:

Опция 1: Разрешение выполнения команды выключения без запроса прав sudo
Либо явно разрешите завершение работы с NOPASSWD вариант (читать man sudoers для информации) или добавьте своего пользователя в группу, которой разрешено завершение работы (обычно operator).

Вариант 2: Найдите далеко, чтобы предоставить sudo разрешение для скрипта, чтобы я мог вставить sudo туда.
Вы не можете сделать это так, как думаете, потому что sudo не работает так - разрешения предоставляются пользователям.
Лучшее, что вы могли сделать, это разрешить запуск сценария с помощью sudo, но это ничего не даст вам по сравнению с вариантом 1 (и, как вы упомянули, откроет вам некоторые возможные дыры в безопасности в вашем скрипте, поскольку вы позволяете ему запускаться от имени пользователя root).