4

Я управляю небольшой группой компьютеров MacOS для студентов (скажем, 20), и все они должны быть настроены с такими вещами, как homebrew и другие пакеты и приложения. Я пишу bash-скрипт для автоматической установки всего необходимого на каждый компьютер. Некоторые из команд, которые я буду использовать, требуют запуска от имени пользователя root, но не большинство из них.

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

4 ответа4

6

Следуя принципу наименьших привилегий, запускайте как можно меньше прав root. Поэтому sudo изнутри скрипта.

Обратите внимание, что при первом появлении команды, которой требуется sudo, вам может быть предложено. (Это не будет правдой, если вы примените NOPASSWD в /etc /sudoers, это метод, который многие люди будут избегать, поскольку он также небезопасен.) Тем не менее, когда вы запустите sudo и введете пароль, sudo запомнит успех на некоторое время. По умолчанию этот период составляет пять минут. Поэтому, если вы запустили "sudo echo hi", набрали свой пароль и вскоре после этого запустили сценарий, вам не нужно будет запрашивать пароль при запуске сценария. Более реалистично, если вы просто запустите сценарий, вас, скорее всего, попросят выполнить sudo один раз ... при условии, что вашему сценарию потребуется менее минуты, чтобы выполнить оставшиеся задачи.

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

В качестве примера минимизации разрешений, позвольте мне показать вам другой пример сценария. Вместо:
sudo -c "sample-command >> /var/log/output.txt"

Мне нравится использовать:
sample-command | sudo tee -a /var/log/output.txt >> /dev/null

При этом вся команда выполняется без sudo, и единственная часть, которая в конечном итоге имеет расширенные разрешения, - это часть, для которой необходимы расширенные разрешения, то есть та часть, которая записывает в файл.

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

0

Я использовал это в своих скриптах, когда хотел, чтобы только некоторые команды выполнялись от имени пользователя root, а другие - нет

echo $admpass | sudo -S *COMMAND*
0

Обычно (я предполагаю) вы хотите, чтобы скрипт обрабатывался так же, как любая другая команда / приложение / утилита. В этом случае вам, как правило, не будет предложено ввести пароль для повышения ваших привилегий; вам просто будет отказано, и вы получите ошибку. Что-то вроде:
Permission denied или Operation not permitted.

Но вы специально упомянули, что вы:
"..не хочу запускать каждую строку в скрипте от имени root .."
Поэтому я не вижу альтернативы явному и исключительно вызову sudo в / из конкретных строк кода, где это уместно.

Вы также упомянули, что вы:
«..по другому не будет запрашиваться пароль на протяжении всего сценария ..»
И скорее всего, вы не будете. Вам не будет предлагаться каждый раз, когда вызывается sudo, если между операциями не проходит значительное количество времени.

0

Зависит от того, что команды. Для команды, загружаемой из интернета, лучше не запускать их с правами root. Но другая команда должна быть в порядке для запуска от имени пользователя root. Я хотел бы разделить команду на два сценария: один для команд без полномочий root и один для команд root

Может быть, я мог бы помочь больше, если я могу получить список команд.

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