exec() de php y servidor apache

Tema en 'GNU / Linux' iniciado por Jos Forger, 18 Feb 2006.

Estado del tema:
Cerrado para nuevas respuestas
  1. Jos Forger

    Jos Forger Guest

    Hola:

    Puse este mensaje en un foro de php, y parece que el problema que tengo
    es de apache....


    Tengo un servidor Linux (Fedora Core 3, Kernel 2.6.12) + Apache
    2.0.53 (Fedora) + PHP 4.3.11 + .... funcionando todo perfectamente
    excepto ...

    .... en /var/www/html/ tengo un script shell ejecutable para todo el
    mundo, y que funciona perfectamente (demo.sh) con el siguiente contenido :

    #!/bin/bash
    ls -lisa

    En el fichero /etc/sudoers doy permiso de ejecución a apache para demo.sh

    apache ALL=NOPASSWD:/var/www/html/demo.sh

    En el mismo directorio tengo un fichero php con el siguiente contenido :

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>Test Shell</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    </head>

    <body>

    <?php>
    exec("sudo ./demo.sh", $verbose, $retorno);
    echo("1<br>");
    if($retorno==0) {
    echo("2<br>");
    while (list ($clave, $val) = each($verbose)) {
    echo ("$val<br>");
    }
    }
    ?>

    </body>
    </html>

    Cuando ejecuto este script php des de shell ( php scriptShell.php) como
    usuario normal (tambien autorizado en sudoers) funciona perfectamente,
    en cambio con una llamada desde apache solo consigo que ejecute una
    parte del script, pero el $retorno es 1 con lo que deduzco que faltan
    mas permisos en sudoers

    Alguien me puede echar un cable, para configurar apache para que esto me
    funcione, necesito algo así para poder incluir una llamada a shell
    remota a traves de web.

    Gracias por anticipado por vuestra ayuda.


    --
    Saludos cordiales ;)
    ==========
    Jos Forger
    ==========
     
  2. AnimAlf

    AnimAlf Guest

    El dv 17 de 02 del 2006 a les 20:34 +0100, en/na Jos Forger va escriure:
    > Hola:


    > ... en /var/www/html/ tengo un script shell ejecutable para todo el
    > mundo, y que funciona perfectamente (demo.sh) con el siguiente contenido :
    >
    > #!/bin/bash
    > ls -lisa
    >
    > En el fichero /etc/sudoers doy permiso de ejecución a apache para demo.sh
    >
    > apache ALL=NOPASSWD:/var/www/html/demo.sh
    >


    no es a apache a quien tienes que darle permiso, a no se que sea el
    usuario que tienes por defecto en el archivo de configuración que por
    defecto suele ser www-data

    > En el mismo directorio tengo un fichero php con el siguiente contenido :


    > exec("sudo ./demo.sh", $verbose, $retorno);


    Confirma el nombre de usuario

    > Cuando ejecuto este script php des de shell ( php scriptShell.php) como
    > usuario normal (tambien autorizado en sudoers) funciona perfectamente,
    > en cambio con una llamada desde apache solo consigo que ejecute una
    > parte del script, pero el $retorno es 1 con lo que deduzco que faltan
    > mas permisos en sudoers
    >
    > Alguien me puede echar un cable, para configurar apache para que esto me
    > funcione, necesito algo así para poder incluir una llamada a shell
    > remota a traves de web.
    >


    si lo quieres en perl ningún problema :)) via cgi

    > Gracias por anticipado por vuestra ayuda.

    saludos
    --
    AnimAlf AnimAlf@engendro.sytes.net
    http://www.fut.es/~acl/AnimAlf
    Personal Experimental WebServer: http://www.engendro.sytes.net
    LiNUX ReGiSteRED UseR #91326
    PublicPGPkeyID 0xB3B41215
    Is the truth out there?

    Coalición europea contra el correo comercial no solicitado:
    http://www.euro.cauce.org/es
     
  3. Jos Forger

    Jos Forger Guest

    En/na AnimAlf ha escrit:

    >>... en /var/www/html/ tengo un script shell ejecutable para todo el
    >>mundo, y que funciona perfectamente (demo.sh) con el siguiente contenido :
    >>
    >>#!/bin/bash
    >>ls -lisa
    >>
    >>En el fichero /etc/sudoers doy permiso de ejecución a apache para demo.sh
    >>
    >>apache ALL=NOPASSWD:/var/www/html/demo.sh
    >>

    >
    > no es a apache a quien tienes que darle permiso, a no se que sea el
    > usuario que tienes por defecto en el archivo de configuración que por
    > defecto suele ser www-data


    si en /var/www/html/ pongo el siguiente script php con los diferentes
    sabores de exec():

    <?php
    echo("Test SHELL<br>");
    system('whoami');
    echo("<br>");
    echo exec('whoami');
    echo("<br>");
    echo shell_exec('whoami');
    echo("<br>");
    echo `whoami`;
    ?>

    ... y hago la llamda desde el navegador al script la salida es siempre la
    misma:

    apache
    apache
    apache
    apache

    ... con lo que deduzco que el usuario es apache.

    >> exec("sudo ./demo.sh", $verbose, $retorno);

    >
    > Confirma el nombre de usuario


    He probado con las sentencias :
    exec("sudo -u root ./demo.sh" $verbose, $retorno);
    exec("sudo -u apache ./demo.sh" $verbose, $retorno);

    pasa lo mismo que antes.

    >> ... el $retorno es 1 con lo que deduzco que faltan
    >>mas permisos en sudoers para apache.


    ... o bien apache esta de alguna forma vetado por sudo.

    De hecho tengo que ejecutar de forma remota, desde cualquier sitio
    remoto el comando restringido a root "/sbin/iptables -L -t filter" y
    algun otro, para controlar el estado del cortafuegos, de ahi lo de
    sudoers, antes con Fedora 1 lo tenia establecido de esta manera y
    funcionaba correctamente, ahora me toca implementar lo mismo con un
    servidor Fedora3 kernel 2.6.12 + Apache 2.0.53 + PHP 4.3.11 + ...

    > si lo quieres en perl ningún problema :)) via cgi


    Pues no te digo que no !!

    Desconozco perl, pero le echare un vistazo, a ver si consigo algo por
    aquí, pero si el problema es de privilegios para apache, creo que será
    complicado.

    Gracias por la ayuda.

    --
    Saludos cordiales ;)
    ==========
    Jos Forger
    ==========
     
  4. AnimAlf

    AnimAlf Guest

    El ds 18 de 02 del 2006 a les 10:04 +0100, en/na Jos Forger va escriure:
    > En/na AnimAlf ha escrit:


    > .. con lo que deduzco que el usuario es apache.
    >


    Sí

    > .. o bien apache esta de alguna forma vetado por sudo.


    no te lies, no es remoto es local, el usuario apache no está en el grupo
    sudoers entonces.

    ¿has probado a ponerle el bit suid o el guid al archivo, en lugar de
    utilizar sudo?

    prueba

    ~$ chown root:root /var/www/html/demo.sh
    ~$ chmod +s /var/www/html/demo.sh

    A ver si luego se ejectuta sin más.

    > > si lo quieres en perl ningún problema :)) via cgi

    >
    > Pues no te digo que no !!


    Estarias en las mismas.

    --
    AnimAlf AnimAlf@engendro.sytes.net
    http://www.fut.es/~acl/AnimAlf
    Personal Experimental WebServer: http://www.engendro.sytes.net
    LiNUX ReGiSteRED UseR #91326
    PublicPGPkeyID 0xB3B41215
    Is the truth out there?

    Coalición europea contra el correo comercial no solicitado:
    http://www.euro.cauce.org/es
     
  5. Guest

    Guest Guest

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1

    >>>>> "AnimAlf" == AnimAlf <AnimAlf@engendro.sytes.net> writes:


    AnimAlf> ¿has probado a ponerle el bit suid o el guid al archivo,
    AnimAlf> en lugar de utilizar sudo?

    Linux (y la mayoria de los Unix modernos) ignora completamente el bit
    SUID en los scripts de shell (por razones de seguridad).

    Saludos. Iñaki.

    - --
    Get PGP/GPG Keys at http://www.escomposlinux.org/iarenaza/pgpkey.php
    I use free software / Yo uso software libre
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.1 (GNU/Linux)
    Comment: Processed by Mailcrypt 3.5.8 <http://mailcrypt.sourceforge.net/>

    iD8DBQFD95cBZXLnGT1HLgcRAnP/AJwMXPyeprBllpKiojCpPbfU7i6VmgCfSiV+
    8YL9i/x8WnA8yB49BfuR9po=
    =pupi
    -----END PGP SIGNATURE-----
     
  6. Jos Forger

    Jos Forger Guest

    Veamos...., voy a replantear el tema:

    Dispongo de un ordenador con Fedora Core 3 kernel 2.6.12 + Apache
    2.0.53 + PHP 4.3.11 + MySQL + ... que entre otros servicios hace de
    router entre varias subredes(5).

    Tengo que controlar remotamente el estado funcionamiento de algunos
    servicios de este ordenador (DHCP, FTP, MySQL y SVN) con varios comandos
    de uso restringido a root, entre otros "/sbin/iptables", para controlar
    el acceso desde/hacia determinadas subredes.

    Hasta hace poco, tenia este mismo montaje con un Fedora Core 1 +
    apache 2.0 + php 3.26 + MySQL, simplemente autorizaba a apache el uso de
    determinados programas en /etc/sudoers, por ejemplo ..

    ....
    apache ALL=NOPASSWD:/sbin/iptables
    ....

    ... y desde un script en php servido por apache, desde php hacia una
    llamada exec() a esos programas traves de "sudo" por ejemplo ..

    ....
    exec("sudo -u root /sbin/iptables -L -t filter" $verbose, $retorno);
    ....

    ... y todo funcionaba correctamente.

    Al cambiar a FC3, me he quedado sorprendido por que esto no me
    funciona, pese a que el comando exec() de php sigue funcionando
    correctamente desde apache con otros comandos de Linux, los script que
    contienen /sbin/iptables ejecutados con llamada local desde consola de
    root tambien lo hacen correctamente, en cambio si los ejecuta apache no.

    Lo mas molesto en este caso es que me veo obligado a realizar el
    control desde la consola del ordenador, y habitualmente me queda poco
    accesible.

    Agradeceria que alguien me pudiera echar una mano.

    --
    Saludos cordiales ;)
    ==========
    Jos Forger
    ==========
     
  7. Jos Forger

    Jos Forger Guest

    (Iñaki Arenaza) ha escrito :

    >
    > Usa ssh. Es más rápido, más seguro y más directo.
    >


    Ya lo habia pensado, pero lo descarte porque todo este sistema
    tendra que ser utilizado tambien por otras personas a las que las
    interfaces tipo consola les parecen muy .. complejas .. , ademas, no
    tienen ni idea de iptables, de ahi el intentar hecerlo a traves del
    servidor web, con un formulario que especifique condiciones y el
    servidor ejecute los cuatro o cinco comandos bàsicos que se deben ejecutar.

    Le estoy dando vueltas a una solución a traves de cron, pero no la
    tengo muy clara todavia.

    Agradezco los intentos de ayuda, si se os ocurre algo mas sera
    bienvenido.

    --
    Saludos cordiales ;)
    ==========
    Jos Forger
    ==========
     
Estado del tema:
Cerrado para nuevas respuestas

Compartir esta página