Ubuntu: позволить пользователю запустить скрипт с правами root

9

У меня Ubuntu 8.04, и я хочу написать скрипт bash, rootкоторый может запускать каждый пользователь.

Я сам могу сделать sudo.

Как я могу это сделать?

ПОЯСНЕНИЕ : я не хочу делать это с помощью sudo, потому что тогда пользователям придется вводить свой пароль. Я просто хочу, чтобы они запускали скрипт от имени root, возможно, что-то setuid, не знаю.

ЭЛЕКТРОДИСТАНЦИОННАЯ СИСТЕМА УПРАВЛЕНИЯ
источник

Ответы:

23

Если бы это был обычный двоичный файл, вы могли бы установить setuid, запустив

# chmod u+s /path/to/binary

К сожалению, сценарии не могут быть установлены. (Ну, вы можете, но это игнорируется). Причина этого заключается в том, что первая строка скрипта сообщает ОС, под каким интерпретатором будет запускаться скрипт. Например, если у вас был скрипт с:

#!/bin/bash

Вы на самом деле в конечном итоге работает

/bin/bash /path/to/script

Очевидно, что вам понадобится установить интерпретатор, что будет означать, что все сценарии будут настроены. Это было бы плохо.

Вы можете сделать это с помощью sudo, поместив в файл / etc / sudoers следующую команду, запустив visudo.

ALL ALL=NOPASSWD: /path/to/script

И теперь любой пользователь может запустить

$ sudo /path/to/script

Это позволяет им запускать скрипт без ввода пароля.

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

Дэвид Пашли
источник
Я думаю, что это ответ, который я искал. Разве я не могу установить bash-скрипт, только бинарный? (Конечно, я бы принял меры, чтобы сделать его недоступным для редактирования)
flybywire
Нет, вы не можете сделать скрипт setuid.
wfaulk
wfaulk: Раньше вы могли это делать, но большинство последних дистрибутивов Linux больше этого не позволяют. Вы можете использовать такой инструмент, как shc, чтобы «скомпилировать» скрипт, а затем сделать его setuid.
Кайл Брандт
wfaulk: Конечно, было бы сложно сделать что-то намеренно отключенное, так что это, вероятно, плохая идея :-)
Кайл Брандт,
Замените термин ALLна имя пользователя, чтобы разрешить запуск только одного sudoer без ввода пароля.
2011 г.
3

Мне нужно вставить эту строку КОНЦЕ из / и т.д. / sudoers: По- ALL ALL = NOPASSWD: <filename> видимому, позднее %admin ALL=(ALL) ALLпереопределение требуется пароль для администратора пользователей.

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

Но есть гоча ...

Всегда используйте полные пути в именах команд и файлов. Если вы напишите что-то вроде echo Hello world!in myrootscript, кто-то может написать a ~/bin/echo scriptи myrootscriptвыполнить от имени root все, что находится в нем.

/bin/echo "Hoping this will keep you safe" :-)

Андре
источник
если для пользователя, не являющегося пользователем root, возможно редактировать этот сценарий, то этот пользователь может взять на себя управление машиной. Если у того же пользователя слабый пароль, ничто не мешает вашей машине быть полностью скомпрометированной.
2011 г.
2

По умолчанию членам wheelгруппы разрешается sudoлюбая команда as root. Это, вероятно, как вы используете sudoна сегодняшний день.

Чтобы разрешить другому пользователю вам нужно будет создать sudoersправило. Например:

mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh

Позволит пользователю mickey.mouseвыполнить команду , /usr/local/bin/test.shкак , rootне требуя дополнительного приглашения пароля.

Вы должны прочитать этот документ для получения дополнительной информации.

Дэн Карли
источник
Debian / Ubuntu используют группу администраторов, а не руль. Возможно, это немного более точное имя.
Дэвид Пашли
Назовите меня старомодным, но ..;)
Дэн Карли
1
старомодный: P
Дэвид Пашли
0

Используйте, chmod +s <filename>чтобы увидеть бит suid. Это означает, что когда файл исполняется, он запускается с разрешениями владельца файла (поэтому включите его в root, чтобы он работал так).

Однако это может быть ОЧЕНЬ опасно с чем-то вроде скриптов bash, потому что пользователь находит способ изменить его, он может легко получить корневую оболочку. Убедитесь, что он не может быть записан никем, кроме root.

Linux не позволяет вам настраивать скрипты, для этого вам нужно скомпилировать его как программу. Вместо этого вы можете использовать файл sudoers (/ etc / sudoers) и добавить такую ​​строку.

<username> ALL = NOPASSWD: /path/to/script

Dentrasi
источник
0

Другой вариант: вы можете сделать небольшую оболочку setuid C вокруг этого скрипта, которая

  • проверяет любые ограничения, которые вы, возможно, захотите применить (список пользователей, время, загрузка системы, ...)
  • Журналы / Аудит выполнения при желании
  • исполняет скрипт

Вроде как ваше собственное подмножество множества возможностей sudo.

mpez0
источник