Можно ли сделать так, чтобы скрипт всегда выполнялся от имени пользователя 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.