Самый питонический способ запуска одной команды с правами sudo

У меня есть скрипт Python, который выполняет некоторую конфигурацию nagios. Скрипт запускается от имени пользователя с полными правами sudo (пользователь может выполнять любую команду с помощью sudo без запроса пароля). Последний шаг в настройке таков:

open(NAGIOS_COMMAND_FILE, 'a').write(cmdline)

NAGIOS_COMMAND_FILE доступен для записи только пользователю root, поэтому эта команда должна выполняться пользователем root. Я могу придумать два способа достижения этого (оба неудовлетворительные):

  1. Запустите весь скрипт как root. Я не люблю этого делать, так как любая ошибка в моем скрипте будет выполняться с полными рут правами.
  2. Поместите команду open(NAGIOS_COMMAND_FILE, 'a').write(cmdline) в отдельный скрипт и используйте библиотеку subprocess для вызова этого скрипта с помощью sudo. Мне не нравится создавать дополнительный скрипт просто для запуска одной команды.

Я предполагаю, что в моем текущем скрипте нет способа изменить работающего пользователя просто для одной команды, или я ошибаюсь?


person blueFast    schedule 13.08.2012    source источник


Ответы (4)


Почему бы вам не дать разрешение на запись NAGIOS_COMMAND_FILE вашему пользователю, у которого есть все права sudo?

person Y__    schedule 13.08.2012
comment
Это еще один вариант, но я не люблю вносить случайные изменения прав собственности в файлы конфигурации системы, поскольку это трудно отслеживать/воспроизводить (моя цель — иметь возможность легко реплицировать мою инфраструктуру на другие серверы). Если невозможно изменить работающего пользователя только для одной команды, я бы предпочел запустить весь скрипт от имени пользователя root, а не менять владельца файла. - person blueFast; 13.08.2012
comment
В противном случае вы можете записать свою конфигурацию во временный файл, а затем использовать pexpect, чтобы переместить ее в нужное место от имени пользователя root. Но это может включать запись пароля в обычный файл... - person Y__; 13.08.2012

Никогда, никогда не запускайте веб-сервер от имени пользователя root или пользователя с полными привилегиями sudo. Это не питоническая вещь, это вещь «удержать мой сервер от взлома».

Посмотрите на os.seteuid, «принцип наименьших привилегий», и man sudoers и запустите свой сервер как обычный «httpd-сервер», где «httpd-сервер» имеет разрешение sudoer на запись в NAGIOS_COMMAND_FILE. И затем убедитесь, что то, что вы пишете в командный файл, настолько чисто, насколько это возможно.

person msw    schedule 13.08.2012

На самом деле можно изменить пользователя для одной команды. Fabric позволяет войти на сервер как любой пользователь. Я полагаю, что это зависит от ssh-соединений. Таким образом, вы можете подключиться к локальному хосту с другим пользователем в своем скрипте Python и выполнить нужную команду.

http://docs.fabfile.org/en/1.4.3/api/core/decorators.html

В любом случае, как уже уточняли другие, лучше всего разрешить пользователю, запускающему сценарий, выполнять эту одну команду и не полагаться на root для выполнения.

person Nicolas Barbey    schedule 13.08.2012

Я бы согласился с сообщением выше, либо дайте вашему пользователю права на запись в NAGIOS_COMMAND_FILE, либо добавьте это использование в группу с такими разрешениями, например nagcmd.

person Michael Guthrie    schedule 17.08.2012