Стоит ли использовать sudo в скрипте или sudo для всего скрипта?

Стоит ли использовать sudo в скрипте или sudo для всего скрипта?

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

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

решение1

Следуя принципу наименьших привилегий, запускайте как можно меньше от имени 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, и единственная часть, которая в итоге имеет расширенные права, — это та часть, которая требует расширенные права, а именно та часть, которая записывает в файл.

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

решение2

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

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

решение3

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

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

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

решение4

Вот одно из решений: запустите скрипт как пользователь, rootиспользуя sudo, и выполните все команды, не требующие повышенных привилегий, как исходный пользователь, используя sudo -u $SUDO_USER <command>.

Вот пример скрипта example.sh:

#!/bin/bash

if [ "$(whoami)" != "root" ] ; then
    echo "Run this script with sudo" >&2
    exit 1
fi

sudo -u "${SUDO_USER:-$USER}" this_command_run_as_user
this_command_run_as_root
this_command2_run_as_root

Вы бы запустили это так:

sudo ./example.sh

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

Связанный контент