Как делают меня sudo текущий процесс?

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

(Я удивлен, что это уже не очевидно; это походит не - редкая вещь хотеть и, кажется, не дыра в системе безопасности для разрешения эскалации, незавершенной по эскалации нового процесса.)

9
задан Michael Terry 28 December 2009 в 06:43
поделиться

8 ответов

К сожалению, я не знаю, как сделать то, что вы хотите сделать чисто. Я думаю, что лучше всего сделать так, чтобы setuid программы (или запустить его в sudo), а затем либо сделать грязную работу и сбросить права доступа, либо fork() и сбросить права доступа из одного процесса и держать другой вокруг, чтобы сделать вашу корневую работу.

Вы ищете вызовы setuid(2) / setreuid(2) / setregid(2) / setgroups(2), но они все жестко связаны, чтобы не позволить вам получить привилегии в середине вызова. Вы можете использовать их только для "выдачи" привилегий, насколько я знаю

.
1
ответ дан 3 November 2019 в 07:13
поделиться

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

sudo su
0
ответ дан 3 November 2019 в 07:13
поделиться

У способности есть возможность "стать корнем". Вы можете захотеть посмотреть, что там сделал автор

.
3
ответ дан 3 November 2019 в 07:13
поделиться

Если вы хотите чисто обработать права администратора внутри программы, вы можете захотеть использовать PolicyKit, а не sudo, в зависимости от операционной системы, на которой вы планируете запускать свою программу.

Для PolicyKit для Python смотрите python-slip.

В противном случае, есть два способа вызвать sudo, чтобы стать root:

sudo -s

сделает вас root и сохранит ваше текущее окружение (эквивалентно sudo su)

sudo -i

сделает вас root и предоставит окружение root тоже (эквивалентно sudo su -)

Другой способ решения проблемы - рассмотреть, что у вас есть необходимые права, и позволить пользователю программы выбрать, как предоставить права вашей программе (используя sudo/setuid/unix groups/всё, что угодно).

См. также этот вопрос по ServerFault на ту же тему.

.
1
ответ дан 3 November 2019 в 07:13
поделиться
echo 'echo tee; echo hee'|sudo -s

Вывод:

tee
hee
0
ответ дан 3 November 2019 в 07:13
поделиться

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

.
0
ответ дан 3 November 2019 в 07:13
поделиться

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

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

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

Смотрите Sudo Manual для других опций.

.
0
ответ дан 3 November 2019 в 07:13
поделиться

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

.
0
ответ дан 3 November 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: