Как мне судить текущий процесс?
Можно ли использовать внешний интерфейс sudo (например, gksudo) для повышения привилегий текущего процесса? Я знаю, что могу сделать следующее:
sudo cat /etc/passwd-
Но я заинтересован в этом:
sudo-become-root # magic function/command
cat /etc/passwd-
Я пишу на Python. Мой пример использования - у меня есть программа, которая запускается от имени пользователя, но может встретиться с файлами для чтения / записи, которые принадлежат пользователю root. Я хотел бы запросить пароль, получить права суперпользователя, сделать то, что мне нужно, а затем при необходимости снова удалить привилегии.
Я знаю, что мог бы разделить логику администратора и логику не-администратора на отдельные процессы, а затем просто запустить процесс администрирования от имени пользователя root (при некоторой связи - policykit / dbus подойдет здесь). Но я надеялся на гораздо более простое (хотя и более рискованное) решение.
Я думаю, что-то вроде запуска ppriv Solaris через sudo, чтобы затем изменить права текущего процесса. Что похоже на хаки-но работоспособное путешествие туда и обратно. Но, насколько я знаю, Linux не предлагает ppriv.
(Я удивлен, что это уже не очевидно; кажется, что это не редкость, что нужно, и, похоже, это не дыра в безопасности, позволяющая эскалации в процессе эскалации нового процесса.)
8 ответов
К сожалению, я не знаю способ сделать то, что вы хотите сделать чисто. Я думаю, что вам лучше всего установить setuid программы (или запустить ее под sudo), а затем либо выполнить грязную работу и удалить разрешения, либо fork () и удалить разрешения одного процесса и оставить другой для выполнения своей корневой работы.,
То, что вы ищете, это вызовы setuid (2) / setreuid (2) / setregid (2) / setgroups (2), но все они жестко запрограммированы, чтобы не позволить вам получить привилегии в середине вызова. Насколько я знаю, вы можете использовать их только для "раздачи" привилегий.
У Aptitude есть опция "стать пользователем root". Вы можете посмотреть, что автор сделал там.
Если вы хотите иметь дело с правами администратора внутри программы, вы можете использовать PolicyKit, а не sudo, в зависимости от операционной системы, на которой вы планируете запускать программу.
Для PolicyKit для Python, см. Python-slip.
Иначе, есть два способа вызвать sudo, чтобы стать пользователем root:
sudo -s
сделает вас root и сохранить текущую среду (эквивалент sudo su
)
sudo -i
сделает вас root и даст вам среду root (эквивалентно sudo su -
)
Другой способ решения этой проблемы состоит в том, чтобы считать, что у вас есть необходимые права, и позволить пользователю программы выбрать, как передать права на вашу программу (используя sudo/setuid/unix groups/ что-либо еще).
Смотрите также этот вопрос о ServerFault на ту же тему.
Интересно, сработает ли это:
Добавьте еще одну группу в вашу систему, установите скрипт как корневую программу, и файл sudoers содержит строку, которая позволяет скрипту выполняться этой группой. Наконец добавьте группу в список учетных записей, которые должны запустить скрипт.
Тогда сценарий может быть запущен только пользователем root или любой учетной записью, для которой установлена специальная группа в группе после предоставления пароля учетной записи в начале.
См. Руководство по Sudo для других опций.
Мне не нравится идея иметь возможность запускать произвольные команды от имени пользователя root из процесса с более низким уровнем привилегий. Однако, так как вы этого хотите, одна из идей, которая приходит вам в голову, состоит в том, чтобы сохранить оболочку с ограниченным доступом setuid, которая может выполнять только те команды, которые вы хотите разрешить. Затем вы можете использовать subprocess.Popen
функции для запуска вашей команды с использованием этой ограниченной оболочки, которая будет запускать ее с повышенными привилегиями.