2009-12-28 21 views
9

¿Es posible utilizar una interfaz de sudo (como gksudo) para elevar los privilegios del proceso actual? Sé que puedo hacer lo siguiente:¿Cómo sudo el proceso actual?

sudo cat /etc/passwd- 

Pero estoy interesado en hacer esto:

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

estoy escribiendo en Python. Mi caso de uso es que tengo un programa que se ejecuta como usuario, pero puede encontrar archivos para leer/escribir que son propiedad de la raíz. Me gustaría pedir una contraseña, obtener privilegios de administrador, hacer lo que necesito y, opcionalmente, quitar los privilegios nuevamente.

Sé que podría separar la lógica de administración y la lógica que no es de administrador en procesos separados, y luego simplemente ejecutar el proceso de administración como root (con alguna comunicación - policykit/dbus sería una buena opción aquí). Pero esperaba una solución mucho más simple (aunque ciertamente más arriesgada).

Estoy pensando en algo así como ejecutar el ppriv de Solaris a través de sudo para luego modificar los privilegios del proceso actual. Lo cual parece una ida y vuelta traviesa pero factible. Pero hasta donde yo sé, Linux no ofrece ppriv.

(Me sorprende que esto no es ya evidente, sino que parece como una cosa no-raro querer y no parece ser un agujero de seguridad para permitir la escalada en proceso sobre la escalada de un nuevo proceso .)

+0

si sudo funciona para usted, ¿qué tal su? – Dani

+0

AFAIK, su me daría una subcategoría para trabajar. Lo cual está bien para el uso interactivo. Pero quiero elevar los privilegios del proceso actualmente en ejecución, no un subproceso de shell. –

+0

Esto no es realmente una respuesta, pero me gusta ver el código fuente de OpenSSH como un modelo para la manipulación y separación de privilegios. Sin embargo, a diferencia de su cae, creo que el daemon ssh comienza con privilegios elevados y luego, de forma selectiva, ahorca a los menores privilegiados. –

Respuesta

1

Lamentablemente, no conozco una manera de hacer lo que quiere hacer limpiamente. Creo que tu mejor opción es hacer que el programa sea setuid (o ejecutarlo bajo sudo) y luego hacer tu trabajo sucio y soltar permisos, o fork() y soltar permisos de un proceso y mantener el otro para hacer tu trabajo raíz .

Lo que está buscando son las llamadas setuid (2)/setreuid (2)/setregid (2)/setgroups (2), pero están todas cableadas para no permitirle obtener privilegios a mediados de la invocación. Solo puede usarlos para "regalar" privilegios, hasta donde yo sé.

+0

Yar, ese parece ser el caso. Ah bueno. Supongo que hay buenas razones por las que es de alguna manera peor obtener privilegios mediados de invocaciones en lugar de poder invocar algo con privilegios. Buscaré otra forma de hacer lo que quiero. ¡Gracias a todos! –

0

Su función mágica/comando podría ser

sudo su 
+0

o quizás 'sudo $ SHELL' –

+0

Eso estaría bien si lo estoy haciendo de forma interactiva, pero tengo que hacer esto programáticamente. –

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

La salida es:

tee 
hee 
2

Si desea tratar limpiamente los derechos administrativos dentro de un programa, es posible que desee utilizar PolicyKit en lugar de sudo, dependiendo del sistema operativo en el que planea ejecutar su programa.

Para PolicyKit para Python, consulte python-slip.

De lo contrario, hay dos maneras de llamar sudo para convertirse en root:

sudo -s 

le hará raíz y mantener su entorno actual (equivalente a sudo su)

sudo -i 

le hará raíz y también le da el entorno de root (equivalente a sudo su -)

Otra forma de resolver el problema es considerar que tiene los derechos que necesita, y deje que el usuario del programa elija cómo otorgarle los derechos a su programa (usando sudo/setuid/unix groups/lo que sea).

Véase también this question on ServerFault sobre el mismo tema.

+0

Correcto, pero eso requeriría la separación entre el código de administrador y el de no administrador, lo cual estoy tratando de evitar. –

+4

Michael, esa separación es muy importante en sí misma. – u0b34a0f6ae

+1

Estoy de acuerdo en que es bueno tenerlo. Pero estoy tratando de ser mínimamente invasivo por ahora y tenía curiosidad si es posible hacerlo sin la separación. –

2

Aptitude tiene la opción "become root". Es posible que desee ver lo que el autor hizo allí.

+7

Interesante. Aparentemente aptitude solo se reiniciará con sudo. El hecho de que no tengan una mejor solución sugiere que no hay una. –

0

No me gusta la idea de poder ejecutar comandos arbitrarios como root desde un proceso con privilegios inferior. Sin embargo, dado que lo desea, una de las ideas que le viene a la mente es mantener un setuidrestricted shell que solo puede ejecutar los comandos que le interesan. Luego puede usar las funciones subprocess.Popen para ejecutar su comando usando este shell restringido que lo ejecutará con privilegios elevados.

+0

Estoy tratando de evitar tener que ejecutar otro proceso como root. Quería ejecutar el proceso actual como root. –

0

me pregunto si esto funcionaría:

Agregar otro grupo para el sistema, instalar el script como un programa de raíz y tener el archivo sudoers contener una línea que permite que la secuencia de comandos a ejecutar por este grupo. Finalmente agregue el grupo a la lista de cuentas que necesitan ejecutar el script.

A continuación, la secuencia de comandos solo puede ejecutarse por root o por cualquier cuenta que tenga el grupo especial en el conjunto de grupos después de proporcionar la contraseña de la cuenta al inicio.

Ver Sudo Manual para otras opciones.

+1

Pero entonces la pregunta debería ser sobre superusuario ;-) –

0

Quiere autenticarse con PAM. Hay un example here.

+0

Solo puedes cambiar tu UID si ya eres root (o tienes CAP_SETUID, pero a menos que pases por contorsiones especiales, una aplicación normal no tendrá eso). – ephemient

+0

Oh, vi un ejemplo una vez que se auths con PAM para obtener algún tipo de privilegios.Supongo que root no es uno de ellos. Mantendré esta respuesta para otros. – LiraNuna