2009-12-28 10 views
9

Возможно ли использовать интерфейс sudo (например, gksudo) для повышения привилегий текущего процесса? Я знаю, что я могу сделать следующее:Как мне выполнить текущий процесс?

sudo cat /etc/passwd- 

Но я заинтересован в этом:

sudo-become-root # magic function/command 
cat /etc/passwd- 

Я пишу в Python. Мое заявление состоит в том, что у меня есть программа, которая работает как пользователь, но может столкнуться с файлами для чтения/записи, которые принадлежат root. Я хотел бы запросить пароль, получить привилегии пользователя root, сделать то, что мне нужно, а затем снова отказаться от привилегий.

Я знаю, что я мог бы разделить логику администрирования и логику без админов на отдельные процессы, а затем просто запустить административный процесс с правами root (с некоторыми коммуникациями - policykit/dbus будет здесь хорошо подходит). Но я надеялся на гораздо более простое (хотя и более рискованное) решение.

Я думаю что-то вроде выполнения ppriv Solaris через sudo, чтобы затем изменить привилегии текущего процесса. Который кажется взломанным, но работоспособным. Но, насколько я знаю, Linux не предлагает ppriv.

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

+0

Если sudo работает для вас, а как насчет su? – Dani

+0

AFAIK, su предоставит мне подоболочку для работы. Это прекрасно подходит для интерактивного использования. Но я хочу повысить привилегии текущего процесса, а не подпроцесса оболочки. –

+0

На самом деле это не ответ, но мне нравится смотреть исходный код OpenSSH как модель для манипулирования и разделения привилегий. Однако, в отличие от ваших cae, я думаю, что демон ssh начинается с повышенных привилегий, а затем выборочно разворачивает детей с меньшим привилегией. –

ответ

1

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

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

+0

Яр, это похоже на случай. Ах хорошо. Полагаю, есть веские причины, по которым, как-то хуже, получать привилегии с помощью mid-invocations, а не в том, чтобы повторно использовать что-то с привилегиями. Будет искать другой способ делать то, что я хотел. Спасибо всем! –

0

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

sudo su 
+0

или, возможно, 'sudo $ SHELL' –

+0

Это было бы хорошо, если я делаю это в интерактивном режиме, но мне нужно сделать это программно. –

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

выход:

tee 
hee 
2

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

Для PolicyKit для Python см. python-slip.

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

sudo -s 

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

sudo -i 

сделает вас корень и также дают вам среду корня (эквивалент sudo su -)

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

См. Также this question on ServerFault на эту же тему.

+0

Правильно, но для этого потребуется разделение кода администратора и не-администратора, чего я пытаюсь избежать. –

+4

Майкл, это разделение очень важно само по себе. – u0b34a0f6ae

+1

Я согласен, что приятно иметь. Но сейчас я пытаюсь быть минимально инвазивным, и мне было любопытно, можно ли это сделать без разделения. –

2

Aptitude имеет опцию «стать корнем». Возможно, вы захотите посмотреть, что там сделал автор.

+7

Интересно. Очевидно, aptitude просто перезапустит себя с помощью sudo. Тот факт, что у них нет лучшего решения, говорит о том, что его нет. –

0

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

+0

Я стараюсь избегать «запускать другой процесс» как root. Я хотел запустить текущий процесс как root. –

0

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

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

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

См. Sudo Manual для других вариантов.

+1

Но тогда вопрос должен быть на суперпользователе ;-) –

0

Вы хотите пройти аутентификацию с помощью PAM. Есть example here.

+0

Вы можете изменить свой UID только в том случае, если вы уже являетесь пользователем root (или имеете CAP_SETUID, но если вы не воспользуетесь специальными искажениями, у обычного приложения этого не будет). – ephemient

+0

О, я видел несколько примеров, когда auths с PAM получают какие-то привилегии.Я думаю, что корень не один из них. Я сохраню этот ответ для других. – LiraNuna