2011-10-03 9 views
13

Tengo una tarea única en una secuencia de comandos python a la que me gustaría llamar desde Django (usuario de www), que va a necesitar privilegios de raíz.Ejecutar la secuencia de comandos de Python como raíz (seteuid vs c-wrapper)

Al principio pensé que podría usar el os.seteuid de Python() y establecer el bit de setuid en el script, pero luego me di cuenta de que tendría que establecer el bit de setuid en Python, que supongo que es grande sin no. Por lo que puedo decir, este también sería el caso si usara sudo, lo cual realmente me gustaría evitar.

En este punto, estoy considerando simplemente escribir un envoltorio de C utiliza seteuid y llama a mi secuencia de comandos python como raíz, pasándole los argumentos necesarios.

¿Es esto lo correcto o debería estar buscando algo más?

+2

¿Por qué no simplemente lo ejecuta como un proceso externo usando 'subprocess' y' sudo', aunque todo sobre esto huele a podrido. – Anders

+0

Porque eso requeriría otorgar permiso a www para ejecutar Python como root :( – kwl34

+1

El problema principal aquí es que las operaciones de sudo setuid y comunes no se aplican a scripts de python individuales como lo harían con un binario, sino con el intérprete de Python. – kwl34

Respuesta

14

sudo no requiere bit setuid en Python. Puede activar sudo para un comando solamente, no hay argumentos:

www   ALL=(ALL)  NOPASSWD: /root/bin/reload-stuff.py "" 

Esto sería seguro si su script no toma ningún argumento, no puede ser anulada por el usuario www, y sudo hace "env_reset" (el valor por defecto en la mayoría distros).

Puede aceptar argumentos, pero tenga mucho cuidado con ellos - no tome los nombres de los archivos de salida, asegúrese de verificar todas las entradas. En este caso, elimine "" del final de la línea sudo.

+0

¡Interesante! Voy a probar esto inmediatamente entonces. Sin embargo, mi script toma argumentos, aunque sean simples. ¿Crees que estaría bien, siempre y cuando mi script de Python haga un ajuste estricto en estos argumentos? – kwl34

+0

sí. Puede tomar agrumnts siempre que tenga cuidado con ellos. – theamk

+0

'ALL = (root)' probablemente sea el preferido para limitar la ejecución de la secuencia de comandos a solo la raíz y no a ningún otro usuario. Es mejor limitarse solo a lo que necesita. – CivFan

1

sudo le permite limitar los argumentos pasados ​​al programa. De man sudoers:

john   ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root* 

On the ALPHA machines, user john may su to anyone except root but 
he is not allowed to specify any options to the su(1) command. 

Así que use sudo. Por supuesto, debe tener especial cuidado con el acceso de root: asegúrese de que solo root pueda modificar el script en sí mismo y cualquier directorio padre, y que el script sea seguro y solo tenga el mínimo absoluto que necesita ejecutarse como root.

+0

I podría estar equivocado, pero esto aún requiere que el usuario www sudo tenga acceso al intérprete de Python, y básicamente está usando el analizador de argumentos de sudo para permitir que solo se ejecute su script. ¿Es correcto? Si es así, ¿sería fácil? también para tener en cuenta los argumentos que se pasan al script (clave/valores)? – kwl34

+0

Sí, es correcto. Y sí, debería ser fácil, pero recomendaría la comunicación a través de stdin/stdout. Desafortunadamente, esta es una pregunta de seguridad, hay Realmente no hay alternativa a la lectura de 'man sudoers'. –

3

Lo correcto se llama separación de privilegios: identifique claramente un conjunto mínimo de tareas que deben hacerse con privilegios elevados. Escribe un daemon por separado y una forma de comunicación lo más limitada posible para hacer la tarea. Ejecute este daemon como otro usuario con privilegios elevados. Un poco más de trabajo, pero también más seguro.

EDITAR: el uso de una envoltura setuid-able también satisfará el concepto de separación de privilegios, aunque recomiendo tener el servidor web chroot y montar el sistema de archivos chrooted nosuid (lo cual sería un fracaso).

+0

Esto es lo que propongo usando un binario C wrapper. Proporciona una interfaz limitada para el sp funciones ecológicas a las que el usuario necesita acceso con privilegios elevados a través de seteuid(). – kwl34

+0

Sí, tienes razón, eso será suficiente.No lo consideré, porque recomiendo eliminar los servidores web y montar los sistemas de archivos accesibles del servidor web nosuid. – knitti

+0

Me gustaría recomendar sudo sobre C wrapper. Es muy fácil olvidar borrar, digamos, PYTHONSTARTUP, o alguna otra variable env, pero sudo con env_reset lo hará por usted. – theamk

Cuestiones relacionadas