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