2012-05-05 12 views
8

Estaba pensando en hacer un pequeño panel de control de Linux basado en web (solo por diversión).Ejecutando comandos raíz desde PHP ... ¿Hay una manera segura?

El primer problema potencial que se me vino a la mente es que necesitaría otorgar permisos de nivel raíz a los usuarios de Apache para ejecutar esos comandos, lo que comprometería la seguridad de todo el sistema.

La instalación de un servidor web dedicado para el sistema no es realmente una opción.

Tal vez podría ejecutar una segunda instancia de Apache (manteniendo la primera para usuarios habituales) pero ni siquiera estoy seguro si es posible.

Entonces, ¿qué piensan? ¿Cuáles son mis mejores opciones aquí?

Gracias de antemano por cualquier entrada.

EDIT: Ok muchachos, gracias por todas las sugerencias, las tendré en cuenta.

+6

Las características de seguridad que deberá tener en cuenta, evitar o superar son numerosas. Ni siquiera piense en intentar esto a menos que tenga un amplio conocimiento de la seguridad de los sistemas Linux. –

+0

Cada vez que tenga la tentación de hacer algo como ** esto **, ¿por qué no preguntarle a la gente de Plesk lo divertido que es [crear un panel de administración del sistema basado en la web "seguro"] (http://arstechnica.com/ business/news/2012/02/plesk-control-panel-bug-left-ftc-sites-and-thousand-more-exposed-to-anon.ars). – rdlowrey

+0

Estaba pensando en hacer un pequeño panel de control de Linux basado en la web (solo por diversión). Estoy pensando que deberías salir más, pero de nuevo, ¡debería hacer algo con mi insomnio! –

Respuesta

5

Escriba scripts específicos que se pueden ejecutar como root y use el bit setuid para hacerlo, de modo que Apache pueda ejecutar solo esos scripts como root. IE

#! /usr/bin/php (or wherever your php binary is) 
<?php 
    // Some PHP code that takes in very limited user input, 
    // validates it carefully, and does a sequence of actions 
    // that you need to run as root. 

    // This could easily be a shell script (or whatever else you want) 
    // instead of PHP. That might be preferable in many situations. 
?> 

A continuación, asegúrese de que el guión es propiedad de root y group'd por el usuario que se ejecuta Apache como:

chown root:www-data myscript.php 

A continuación, hacer que se ejecute como propietario:

chmod u+s myscript.php 

Y asegúrese de que Apache puede ejecutarlo:

chmod g+x myscript.php 
+0

Ejecutando PHP con setuid, esto solo apesta a posibles problemas de seguridad, pero sí, eso es lo que quiere OP :) – Tibor

+0

Linux ignora bit de setuid en lenguajes interpretados, ya que se considera extremadamente inseguro. http://unix.stackexchange.com/questions/364/allow-setuid-on-shell-scripts/2910#2910 –

3

Ejecutar comandos raíz a través de un servidor web me parece una idea loca, pero de todos modos.

Puede usar sudo para asegurarse de que no ejecutará ningún comando no deseado.

pequeño ejemplo tomado de here, sudo config:

peter, %operator ALL= /sbin/, /usr/sbin, /usr/local/apps/check.pl 

Y en php:

exec('sudo /usr/local/apps/check.pl ...'); 

Asegúrese de escapar de todos los argumentos correctamente y así sucesivamente.

O usted podría construir en lugar de la tabla db así:

commands (
    action, 
    serialized_parameters. 
    result, 
    return_code 
) 

usar PHP para insertar comandos a esta mesa y el otro script que se ejecuta en cron por otro usuario. No tendrá resultados en tiempo real (pero puede tenerlos 30 segundos de antigüedad), pero el usuario de apache no podrá usar ningún comando directamente (por supuesto, puede limitar las acciones fácilmente al leer registros).

1

Recientemente publiqué un proyecto que permite a PHP obtener e interactuar con un shell Bash real (como root si se solicita), resuelve las limitaciones de exec() y shell_exec().Consíguelo aquí: https://github.com/merlinthemagic/MTS

Después de descargar sólo tendría que utilizar el siguiente código:

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); 
$return1 = $shell->exeCmd('yourFirstCommand'); 
//the return will be a string containing the return of the command 
echo $return1; 

En términos de seguridad es mucho mejor que con Apache como root. Pero dejar PHP en cualquier lugar cerca de la raíz siempre es complicado.

El proyecto construí logra un intérprete de comandos bash, en una de las 2 formas:

1) Se permiten apache el derecho de pitón sudo.

O

2) Se pasa las credenciales de root para el objeto cada vez que necesita un depósito de configuración de la raíz.

Elija su veneno. :) Lee la documentación.

Cuestiones relacionadas