[eside-ghost] Privilegios de ejecucion

Alvaro Uría fermat en rigel.deusto.es
Mie Nov 8 17:00:10 CET 2006


Aupa JammyZ,

On Tue, 7 Nov 2006 15:06:24 +0000
JammyZ <jammyz en gmail.com> escribió:

> Aupa,
>    tengo un script en python que quiero que me inicie y pare servicios
> (postgresql, apache, ...). Para ello ejecuto "sudo /etc/init.d/apache2
> stop"(estoy en ubuntu). El problema es que no voy a tener disponible sudo
> en cualquier maquina UNIX en la que ejecute mi script y el arranque y
> parada de servicios exige privilegios de superusuario. Asi pues, cual es
> la forma mas logica de implementar algo asi? la idea es que el script
> siga perteneciendo a un usuario normal del sistema, sin privilegios.

No sé cual es el problema real al que te enfrentas cuando dices que el
script tiene que pertenecer a un usuario normal del sistema, sin
privilegios... ¿buscas que ese script pueda modificarse sin ser root
únicamente, o tb te preocupa que se comprometa la máquina? En todo esto no
te puedo ayudar, pero lo que comento ahora me lo pensaría mucho por estos
temas de "seguridad"...

Ayer lo miré un poco (activando bit de SUID a un script en python) pero no
conseguí nada... y hoy me he dado cuenta de por qué: Da igual que el script
tenga activo dicho bit ya que estos scripts los ejecuta el intérprete
"/usr/bin/python" que no tiene dicho bit activado.

Así,
pruebas:/home/fermat/lab/suid# l /usr/bin/python*
lrwxr-xr-x 1 root root      9 2004-11-30 10:10 /usr/bin/python -> python2.3
-rwxr-xr-x 1 root root 983480 2004-11-13 19:14 /usr/bin/python2.3
pruebas:/home/fermat/lab/suid# su fermat
fermat en pruebas:~/lab/suid$ ./epa.py 
>>> uid: fermat, euid: fermat
uid=1002(fermat) gid=1002(fermat) grupos=1002(fermat)
fermat en pruebas:~/lab/suid$
pruebas:/home/fermat/lab/suid# chmod +s /usr/bin/python2.3
pruebas:/home/fermat/lab/suid# su fermat
fermat en pruebas:~/lab/suid$ ./epa.py 
>>> uid: fermat, euid: root
uid=1002(fermat) gid=1002(fermat) euid=0(root) egid=0(root)
grupos=1002(fermat)
fermat en pruebas:~/lab/suid$
pruebas:/home/fermat/lab/suid# chmod -s /usr/bin/python2.3 

Así que por ahí no se puede hacer nada.

Luego,

fermat en pruebas:~/lab/suid$ cat epa.py 
#!/usr/bin/env python
import os,pwd

epa = "uid: %s, euid: %s" % (pwd.getpwuid(os.getuid())[0],
pwd.getpwuid(os.geteuid())[0])
print ">>>", epa
os.system("id")
fermat en pruebas:~/lab/suid$

Viendo ayer la solución de Txipi, y con esa restricción de no tener siempre
"sudo", quizás podrías hacer un wrapper en C:

fermat en pruebas:~/lab/suid$ cat prueba.c 
#include <unistd.h>

int main (int argc, char**argv)
{
        printf ("uid = %i, euid = %i\n----\n", getuid(), geteuid());
        execv("epa.py", argv);
        return 0;
}
fermat en pruebas:~/lab/suid$ gcc -o prueba prueba.c 
fermat en pruebas:~/lab/suid$ ./prueba 
uid = 1002, euid = 1002
----
>>> uid: fermat, euid: fermat
uid=1002(fermat) gid=1002(fermat) grupos=1002(fermat)
fermat en pruebas:~/lab/suid$ su
Password: 
pruebas:/home/fermat/lab/suid# gcc -o prueba prueba.c 
pruebas:/home/fermat/lab/suid# chmod +s prueba
pruebas:/home/fermat/lab/suid# l prueba
-rwsr-sr-x 1 root root 7236 2006-11-08 16:50 prueba
pruebas:/home/fermat/lab/suid# su fermat
fermat en pruebas:~/lab/suid$ ./prueba 
uid = 1002, euid = 0
----
>>> uid: fermat, euid: root
uid=1002(fermat) gid=1002(fermat) euid=0(root) egid=0(root)
grupos=1002(fermat)
fermat en pruebas:~/lab/suid$ 

Suerte.

Saludos,
  Alvaro Uría


Más información sobre la lista de distribución eside-ghost