Можно ли сделать так, чтобы скрипт всегда выполнялся от имени пользователя root?

58308
HappyDeveloper

Как заставить скрипт выполняться от имени пользователя root, независимо от того, кто его выполняет?

Я читал о setuid, но я не уверен, как это сделать.

Я использую Linux, Ubuntu 12.04 LTS.

27
На каком дистрибутиве Linux вы работаете? Или даже Unix? slhck 11 лет назад 0
@slhck Linux, Ubuntu 12 HappyDeveloper 11 лет назад 0
`setuid` не будет работать со скриптами - он отключен по соображениям безопасности в большинстве дистрибутивов * nix в наши дни. Вы можете установить его, но он будет проигнорирован. Может быть, вы можете объяснить больше о вашей реальной проблеме, чтобы мы могли помочь вам решить ее вместо этого? Что это за сценарий? Зачем вам нужно, чтобы он выполнялся от имени пользователя root? Является ли использование `sudo` альтернативой? slhck 11 лет назад 3
Вы пробовали `sudo -s`? Nam Phung 11 лет назад 0

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

29
speakr

Будьте очень осторожны: сценарии в сочетании с setuid опасны!

Во-первых, пожалуйста, посмотрите на этот вопрос / ответы, особенно на этот ответ и предупреждение безопасности .

Если вы все еще хотите выполнить свой сценарий с помощью setuidset, вы можете написать короткую программу на C в качестве оболочки и установить setuidбит в скомпилированном двоичном файле.

Пример Wrapper:

int main(void) {  setuid(0); clearenv(); system("/absolute/path/to/your/script.sh"); } 

Другое решение с использованием sudo(упоминается здесь ):

  1. От имени пользователя root запретите запись (и, возможно, другое) в ваш скрипт:

    chown root /absolute/path/to/your/script.sh chmod 700 /absolute/path/to/your/script.sh 
  2. Убедитесь, что никто, кроме root, не может заменить скрипт, например, изменив права доступа родительской папки:

    chown root / absolute / path / to / your / chmod 755 / абсолютный / путь / к / вашему / 
  3. Измените права доступа sudo /etc/sudoersс помощью visudo:

    ALL ALL = (root) NOPASSWD: /absolute/path/to/your/script.sh 

    Более подробную информацию о настройках (например, ограничение доступа для определенных пользователей или групп) можно найти на странице руководства sudoers.

После этого все пользователи могут запускать скрипт от имени пользователя root без пароля:

sudo /absolute/path/to/your/script.sh 

Это похоже на использование решения обертки / setuid выше.

Конкретные опасности не очень очевидны, но они сильно вращаются вокруг окружающей среды. В отличие от большинства программ, поведение сценария оболочки может быть существенно изменено десятками переменных среды, и этого достаточно, чтобы без широких мер защиты такой сценарий можно было легко обмануть для выполнения произвольного кода. Stephanie 11 лет назад 3
Вы должны добавить вызов clearenv () перед системным вызовом в этой оболочке, полностью уничтожив окружение, чтобы не было злых настроек для манипулирования сценарием. http://www.kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html Stephanie 11 лет назад 1
@ Stefie Спасибо, я добавил это. speakr 11 лет назад 0
@ Стефани Я, должно быть, делаю что-то не так, потому что все это выглядит слишком сумасшедшим для обычной задачи. Вот что я пытаюсь сделать: http://serverfault.com/questions/401405/how-to-activate-iptables-after-connecting-to-vpn HappyDeveloper 11 лет назад 0
@HappyDeveloper Не слишком сумасшедший сценарий для setuid, поскольку плохо защищенный сценарий - это путь к root для любого, кому удастся его запустить. Stephanie 11 лет назад 0
`sudo` может использоваться для предоставления всем пользователям доступа к определенной программе (или сценарию). В этом смысле он действует как необычная оболочка setuid. Кажется, что это, как правило, будет лучшим выбором, чем написание вашей собственной оболочки setuid. jjlin 11 лет назад 4
Я использовал первое решение (setuid), потому что мне нужно, чтобы оно выполнялось автоматически после входа в систему, без запроса пароля. И я не люблю удалять пароль из sudo. Кроме того, мне может понадобиться, чтобы скрипт выполнялся не пользователем sudoers. HappyDeveloper 11 лет назад 0
@HappyDeveloper Вы просто удаляете пароль sudo при использовании с этим конкретным сценарием. Другие команды не затрагиваются. Кроме того, вы можете указать _ALL_ в качестве псевдонима пользователя, чтобы разрешить всем пользователям доступ для запуска сценария. Я изменил свой ответ соответственно. speakr 11 лет назад 0
@speakr О, я вижу, спасибо HappyDeveloper 11 лет назад 0
4
Tadas

Easiest and safest way is to use SETUID bits in file permissions. that way command permissions will be elevated to file owner permissions.

to prevent script from edition do not set write for everyone bits.