Как мне судить текущий процесс?

Можно ли использовать внешний интерфейс 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 на ту же тему.

Вы хотите аутентифицироваться с PAM. Здесь есть пример.

Интересно, сработает ли это:

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

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

См. Руководство по Sudo для других опций.

Мне не нравится идея иметь возможность запускать произвольные команды от имени пользователя root из процесса с более низким уровнем привилегий. Однако, так как вы этого хотите, одна из идей, которая приходит вам в голову, состоит в том, чтобы сохранить оболочку с ограниченным доступом setuid, которая может выполнять только те команды, которые вы хотите разрешить. Затем вы можете использовать subprocess.Popen функции для запуска вашей команды с использованием этой ограниченной оболочки, которая будет запускать ее с повышенными привилегиями.

Ваша магическая функция / команда может быть

sudo su
echo 'echo tee; echo hee'|sudo -s

Выход:

tee
hee
Другие вопросы по тегам