Защитите собственный скрипт от несанкционированного доступа и запустите NOPASSWD без присмотра w/ sudoers.
С помощью /etc/sudoers
Я дал некорневого пользователя (anyuser
ниже) разрешение sudo-выполнить скрипт, принадлежащий пользователю root (test-script
ниже) с NOPASSWD:
набор тегов.
Восьмеричное значение разрешения скрипта 0550
, Его выполнение возможно только с одним предопределенным аргументом (cache_bak
ниже) и когда файл сценария не был подделан. Последнее возможно на основе условного выполнения SHA256 (соответствующая информация в sudoers
справочная страница).
Все работает хорошо, ... пока я не протестирую-не модифицирую скрипт, чтобы получить другой дайджест SHA и посмотреть, как sudoers
обрабатывает это.
То, что я сделал, было:
$ cat /home/anyuser/Scripts/test-script
#!/bin/bash
/bin/mkdir -p /var/"$1"
/bin/cp -R /var/cache/* /var/"$1" # copies content of /var/cache/
# to /var/$1, defined by script's lone arg
exit $?
# End of test-script
$ sudo chmod 0550 /home/anyuser/Scripts/test-script
$ sudo chown root:admin /home/anyuser/Scripts/test-script
$ ls -lsAF test-* # check
4 -r-xr-x--- 1 root admin 75 Apr 25 18:23 test-script*
$ cat /etc/group | grep sudo # check
sudo:x:27:anyuser
$ sudo cat /etc/sudoers # check
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults insults
root ALL = (ALL:ALL) ALL
%sudo ALL = (root:ALL) ALL
%admin ALL = (ALL:ALL) ALL
%wheel Somehost = (ALL:ALL) ALL
#includedir /etc/sudoers.d
Я тогда заселил /etc/sudoers.d
с 10_user
чье содержание:
$ cat /etc/sudoers.d/10_user
Cmnd_Alias CPVARCACHE = sha256:48805bae82834f323xxxxxxxxxxxxx10145c7bbf80bae183b7de3ea52ef90637 /home/anyuser/Scripts/test-script cache_bak
# GROUP SPECS
%admin Somehost = NOPASSWD: /usr/bin/rsync
# USER SPECS
anyuser Somehost = (root) NOPASSWD: CPVARCACHE
Все работает хорошо, т.е. не запрашивается passwd и копирование выполняется, пока я не симулирую вмешательство test-script
, Я сделал это, добавив строку, например, if [ "$1" ] ;then :; fi
и работает: sudo /home/anyuser/Scripts/test-script cache_bak
снова.
Оболочка sudo не прерывается, как я ожидал. Вместо этого он проверяет, что дайджест SHA стал другим, и запрашивает пароль для anyuser
выполнять работу. Тем не менее, в этом случае я хочу, чтобы строка cmd прервала работу без присмотра (тихо).
Попытка перенаправить stdout
а также stderr
в /dev/null:
# after modifying the script so its SHA digest is different from
#+ that in '/etc/sudoers.d/10_user'
$ sudo /home/anyuser/Scripts/test-script cache_bak > /dev/null 2>&1
[sudo] password for anyuser: _^C
Вышеуказанное перенаправляет только вывод процесса subshell, а не процесса sudo.
Если в сценарий вмешиваются, мне нужно прервать процесс sudo, предположительно, еще до того, как он запустит сценарий... Я видел интересные вещи (например, это), но ничего по-настоящему не актуально...
1 ответ
Мое решение, напрямую адаптированное к ответу MarcoS на StackOverflow:
$ sudo -n /home/anyuser/Scripts/test-script cache_bak -- 2> sudo-stderr_"$(date+\%Y\%m\&d-\%H\%M\%S)".log
ОБЪЯСНЕНИЕ:
-n
флаг подавляет запрос suw' s passwd. Так что ничего не отображается на stdout
,
Если пароль все же требуется, sudo
умирает изящно после отправки сообщения об ошибке stdderr
, Например:
$ sudo -n ls
sudo: a password is required
немедленно сопровождается sudo
процесс смерти.
Перенаправить sudo
"s stderr
, сначала добавь --
после sudo'd cmd, чтобы показать, что sudo
перестает интерпретировать то, что приходит потом, как аргументы строки cmd. Перенаправление stderr
как обычно обозначается 2>
сопровождаемый специальным именем файла журнала.