Подтвердить что ты не робот

Выполнить Python Script как Root (seteuid vs c-wrapper)

У меня есть одна короткая задача в python script, которую я бы хотел вызвать из Django (www user), которая будет нуждаться в привилегиях root.

Сначала я думал, что могу использовать Python os.seteuid() и установить бит setuid в script, но потом понял, что мне нужно будет установить бит setuid на сам Python, который, как я полагаю, является большим нет нет. Из того, что я могу сказать, это было бы также и в случае использования sudo, чего я действительно хотел бы избежать.

На этом этапе я рассматриваю возможность написания оболочки C, которая использует seteuid и вызывает мой python script как root, передавая ему необходимые аргументы.

Это правильная вещь, или я должен смотреть на что-то еще?

4b9b3361

Ответ 1

sudo не требует бит setuid на Python. Вы можете включить sudo только для одной команды, без аргументов:

 www          ALL=(ALL)       NOPASSWD:  /root/bin/reload-stuff.py ""

Это было бы безопасно, если ваш script не принимает никаких аргументов, не может быть переопределен пользователем www и sudo делает "env_reset" (по умолчанию в большинстве дистрибутивов).

Вы можете принимать аргументы, но будьте очень осторожны с ними - не принимайте выходные имена файлов, убедитесь, что вы проверяете все входы. В этом случае удалите "" с конца строки sudo.

Ответ 2

Правильная вещь называется разделением привилегий: четко определите минимальный набор задач, которые должны выполняться при повышенных привилегиях. Напишите отдельный демон и максимально ограниченный способ передачи заданий. Запустите этот демон в качестве другого пользователя с повышенными привилегиями. Немного больше работы, но также более безопасно.

EDIT: использование совместимой с setuid обертки также будет удовлетворять концепции разделения привилегий, хотя я рекомендую, чтобы веб-сервер был chrooted и монтировал chrooted файловую систему nosuid (которая могла бы победить это).

Ответ 3

sudo позволяет ограничить аргументы, переданные программе. От man sudoers:

john           ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*

On the ALPHA machines, user john may su to anyone except root but
he is not allowed to specify any options to the su(1) command.

Так что используйте sudo. Разумеется, вам нужно быть более внимательным к корневому доступу - убедитесь, что только root может изменить сам script и любые родительские каталоги и что script является безопасным и выполняет только абсолютный минимум, который должен выполняться как root.