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

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

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

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

3 ответа

Решение

Будьте очень осторожны: сценарии в сочетании с 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, не может заменить скрипт, например, изменив права доступа родительской папки:

    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 выше.

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

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

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

#!/bin/su root

Я наткнулся на этот вопрос, когда искал такой фрагмент:

[ "$(id -u)" != 0 ] && exec sudo "$0"

Если добавить это в начало скрипта, перед ним будет стоять sudo, и он всегда будет запускаться от имени пользователя root, что позволит нам запускать наш скрипт как ./hello.sh. Конечно, sudo все равно будет запрашивать пароль, но принятый ответ поможет этого избежать.

Другие вопросы по тегам