2010-05-12 17 views
7

Antecedentes: Estoy escribiendo un script para una empresa que permitirá a los usuarios crear cuentas FTP a través de una interfaz web. En el fondo, la secuencia de comandos debe ejecutar un montón de comandos:Ejecutando comandos a través de scripts PHP/Perl como usuario privilegiado en Linux

  • agregar el usuario al sistema (useradd)
  • abrir y editar varios archivos
  • electrónico del usuario a través de sendmail

y algunas otras cosas ...

Básicamente estoy buscando la forma más segura de hacer esto. He oído hablar del método setuid, el método sudo y, por supuesto, ejecutar httpd como usuario privilegiado. Habrá controles de cordura en los datos ingresados ​​por supuesto antes de que se ejecuten los comandos (es decir, solo caracteres alfanuméricos en los nombres de usuario)

¿Cuál es el método utilizado por los scripts populares (webmin, por ejemplo), como debe ser bastante seguro?

Respuesta

5

Configuraría una cola para que la secuencia de comandos enlazada a la web pueda escribir.

Luego tendría una lectura de proceso privilegiado de esa cola y tomar las medidas adecuadas. Puede conducir un script de línea de comando a través de un trabajo cron, o escribir un daemon pequeño en PHP que verifique la cola y haga el trabajo con más frecuencia de lo que permite cron.

De esta forma, el único código que se puede ejecutar con privilegios es el script de su pequeño trabajador, y no necesita proporcionar ninguna ruta para que el script en línea obtenga los privilegios necesarios pero peligrosos.

+0

El único problema con esto es: 1) Necesito las cuentas creadas inmediatamente, no puedo esperar a cron ... que conduce a 2) no quiero ejecutar cron cada minuto, ¿no hará eso mucha tensión en el servidor? – jtd

+0

Por eso la otra opción es escribir un daemon (proceso en segundo plano) que observa la cola y realiza acciones de inmediato. Siempre que no esté utilizando el alojamiento compartido (y parece que no lo es si está agregando usuarios), esto probablemente sea factible. –

+0

Correcto, hay varias maneras de hacerlo. Un cron de cada minuto estaría bien, si es aceptable esperar hasta un minuto. No pondrá una carga apreciable en el servidor; la mayoría de las veces, simplemente verá que la cola está vacía y saldrá. Probablemente solo escriba un pequeño daemon que verifique la cola cada segundo más o menos. Para sus propósitos, un daemon no enrutado de proceso único debería ser suficiente. El único inconveniente es que ahora debes asegurarte de que tu daemon siempre esté funcionando, pero eso se puede resolver fácilmente. – timdev

2

Cree una secuencia de comandos que acepte una opción de línea de comando, la valida y ejecuta exerad. Agregue el usuario de su httpd al archivo sudoers con una directiva NOLOGIN, SOLO para ese proceso.

De esta forma, no tiene que preocuparse por escribir un daemon que siempre se ejecutará con privilegios de administrador y su script también se devolverá inmediatamente. Si acaba de utilizar un script raíz setuid, otros usuarios en el mismo sistema podrían ejecutar su script (a menos que haya marcado su identificación de usuario real).

0

Comenzaré diciendo que ejecutar httpd como root es una muy mala idea.

El forma más segura de hacer esto es tener la plena separación de privilegios entre la interfaz de usuario del servidor web y el efector - Una manera obvia de hacerlo es ejecutar el servidor como root aceptar conexiones locales sólo el que la interfaz de usuario envía sus peticiones a (una forma simple de hacerlo es a través de inetd/xinetd, lo que significa que no tiene que preocuparse por todas las complicaciones de establecer un proceso de daemon).

También necesitaría algún tipo de mecanismo de confianza entre la interfaz de usuario y el efector (un secreto compartido sería suficiente) para que otros programas en el sistema no puedan llamar al efector. El uso de un sistema de confianza que se basa en autenticación basada en desafío o cifrado asimétrico significa que ya no tendrá que preocuparse por la restricción de conexión local.

Finalmente, necesita un protocolo bien definido por el cual la interfaz de usuario y el efector se comuniquen.

Esto es mucho más complejo que usar sudo, pero es más seguro (p.sudo solo permite a los usuarios ejecutar archivos específicos como un uid diferente; usted espera que el archivo contenga el programa correcto).

Setuid tiene muchos de los mismos inconvenientes que sudo con la complicación adicional de que (en la mayoría de los casos) si inicia otro programa, entonces lo hará como el uid original.

HTH

C.

Cuestiones relacionadas