Пользователь root может выполнить скрипт без привилегий, но разрешить выполнение команд sudo без пароля

279
eskhool

Так как root (in /etc/rc.local) я хочу запустить скрипт без привилегий root, скажем, используя su

su - myuser -c myscript 

но в myscript я хочу запустить команду sudoбез пароля. Тем не менее, я не хочу, чтобы myuser запускал эту команду без пароля, иначе (например, не хочу добавлять к sudoers и т. Д.)

Это вообще возможно?

1
Не похоже на это. Вы хотите, чтобы пользователь мог делать что-то, что требует пароля без предоставления пароля. Кроме того, вы хотите, чтобы пользователь делал что-то без пароля, в то время как пользователь должен использовать пароль. Очевидно, есть лучший способ сделать то, что вы пытаетесь сделать. [Проблема XY?] (Https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) Appleoddity 5 лет назад 0

1 ответ на вопрос

1
AFH

Если требуемая команда находится за пределами блока (например, циклическая или условная), вы можете разделить сценарий на три части: предыдущие команды выполняются как myuser, защищенная команда запускается sudo(которая не запрашивается, когда уже есть root) и оставшиеся команды, также запустить как myuser: -

su - myuser -c myscript-preamble sudo myscript-protected-command su - myuser -c myscript-postamble 

В более общем смысле, есть прием, который вы можете использовать sudo, используя сохраненные учетные данные:

sudo -u myuser sudo -S true <<< password 2>/dev/null su - myuser -c myscript sudo -u myuser sudo -k 

Есть ряд соображений - это первое, что приходит на ум:

  • Сценарий (или, по крайней мере, первая строка) должен выполняться в защищенном от чтения файле ( -rwx------) или в защищенном от выполнения каталоге ( drwx------), оба из которых принадлежат root.
  • Для этого необходимо, чтобы sudoучетные данные запоминались в течение определенного времени (обычное значение по умолчанию) и выполнялись sudoв myscriptтечение этого времени.
  • Если myuserработает в myscriptто время как rootодновременно запустить его, сохраненные учетные данные будут использоваться, если sudoкоманда достигнута до rootпробегов sudo -k.

Как видите, это не идеальное решение с точки зрения безопасности, но оно может быть работоспособным в вашей среде.

В противном случае вам нужно будет использовать sudo -A, как описано в этом отрывке из sudoруководства:

 -A, --askpass Normally, if sudo requires a password, it will read it from the user's terminal. If the -A (askpass) option is specified, a (possibly graphical) helper program is executed to read the user's password and output the password to the standard output. If the SUDO_ASKPASS environment variable is set, it specifies the path to the helper program. Otherwise, if sudo.conf(5) contains a line specifying the askpass program, that value will be used. For example:  # Path to askpass helper program Path askpass /usr/X11R6/bin/ssh-askpass  If no askpass program is available, sudo will exit with an error. 

Чтобы реализовать это, вам нужно написать программу, которая проверяет, работает ли она следующим образом root: если да, она выводит пароль для myuser(из обфусцированных данных, конечно); в противном случае он запрашивает пароль как обычно и выводит ответ пользователя.

Так что да, это можно делать то, что вы хотите, но может включать в себя достаточное количество работ, в зависимости от уровня безопасности, вам требуется.