Выполнить Python Script as Root (seteuid vs c-wrapper) - PullRequest
13 голосов
/ 03 октября 2011

У меня есть быстрое одноразовое задание в скрипте Python, которое я хотел бы вызвать из Django (пользователь www), которому понадобятся права root.

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

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

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

Ответы [ 3 ]

14 голосов
/ 03 октября 2011

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

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

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

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

3 голосов
/ 03 октября 2011

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

РЕДАКТИРОВАТЬ: использование оболочки с возможностью setuid также удовлетворит концепцию разделения привилегий, хотя я рекомендую иметь веб-сервер chroot и монтировать nosuid chrooted файловой системы (которыйпобедил бы это).

1 голос
/ 03 октября 2011

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

...