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


27

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

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

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


На каком дистрибутиве Linux вы работаете? Или даже Unix?
slhck

@slhck Linux, Ubuntu 12
HappyDeveloper

3
setuidне будет работать со сценариями - в настоящее время он отключен из соображений безопасности в большинстве дистрибутивов * nix. Вы можете установить его, но он будет проигнорирован. Может быть, вы можете объяснить больше о вашей реальной проблеме, чтобы мы могли помочь вам решить ее вместо этого? Что это за сценарий? Зачем вам нужно, чтобы он выполнялся от имени пользователя root? Используете sudoальтернативу?
slhck

Ты пробовал sudo -s?
Нам Пхунг

Ответы:


29

Будьте очень осторожны: сценарии в сочетании с 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 выше.


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

1
Вы должны добавить вызов clearenv () перед системным вызовом в этой оболочке, полностью уничтожив окружение, чтобы не было злых настроек для манипулирования сценарием. kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
Стефани

@ Стефани Я, должно быть, делаю что-то не так, потому что все это выглядит слишком сумасшедшим для обычной задачи. Вот что я пытаюсь сделать: serverfault.com/questions/401405/…
HappyDeveloper

@HappyDeveloper Не слишком сумасшедший сценарий для setuid, так как плохо защищенный - это путь к root для любого, кому удастся его запустить.
Стефани

4
sudoможет использоваться для предоставления всем пользователям доступа к определенной программе (или сценарию). В этом смысле он действует как необычная оболочка setuid. Кажется, что это, как правило, будет лучшим выбором, чем написание вашей собственной оболочки setuid.
jjlin

4

Самый простой и безопасный способ - использовать биты SETUID в правах доступа к файлу. таким образом, права доступа к команде будут повышены до разрешений владельца файла.

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


0

Я не знаю, может ли это быть полезным, но, чтобы скрипт работал только как root, вы могли бы использовать этот shebang в первой строке скрипта:

#!/bin/su root
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.