Чи можу я зробити так, щоб сценарій завжди виконувався як 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 небезпечні!

По-перше, ознайомтеся з цим питанням / відповідями , особливо на цю відповідь та попередження безпеки .

Якщо ви все ще хочете виконати свій скрипт із setuidнабором, тоді ви можете написати коротку програму C в якості обгортки та встановити setuidбіт на складений бінарний файл.

Приклад обгортки:

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

Ще одне рішення з використанням sudo(згаданого тут ):

  1. Як корінь, забороняйте писати (а може й інший) доступ до вашого сценарію:

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

    корінь чауна / абсолютний / шлях / до / ваш /
    chmod 755 / абсолютний / шлях / до / ваш /
    
  3. Змініть права доступу до sudo за /etc/sudoersдопомогою visudo:

    ВСЕ ВСЕ = (корінь) NOPASSWD: /absolute/path/to/your/script.sh
    

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

Після цього всі користувачі можуть запускати скрипт як root без пароля:

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

Це аналогічно використанню рішення для обгортки / налаштування вище.


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

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

@Stephanie Я повинен щось робити не так, тому що все це виглядає занадто божевільним для спільного завдання. Це те, що я намагаюся зробити: serverfault.com/questions/401405/…
HappyDeveloper

@HappyDeveloper Не надто божевільний для встановленого сценарію, оскільки погано захищений - це шлях до кореня для тих, хто вдається запустити його.
Стефанія

4
sudoможна використовувати, щоб надати всім користувачам доступ до певної програми (або сценарію). У цьому сенсі він виступає як вигадливий комплект обертів. Здається, що це, як правило, кращий вибір, ніж написання власної встановленої обгортки.
jjlin

4

Найпростіший і найбезпечніший спосіб - використовувати біти SETUID у дозволах файлів. таким чином дозволи команд будуть підвищені до дозволів власника файлів.

щоб запобігти випуску сценарію, не встановлюйте запис для всіх бітів.


0

Я не знаю, чи це може бути корисно, але, щоб сценарій запускався лише як root, ви можете використовувати цей шебанг у першому рядку сценарію:

#!/bin/su root
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.