27

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

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

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

2 ответа2

29

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

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

Если вы все еще хотите выполнить свой сценарий с установленным setuid , вы можете написать короткую программу на 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, не может заменить скрипт, например, изменив права доступа родительской папки:

    root / абсолют / путь / к / ваш / 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 выше.

4

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .