Soporte suEXEC de Apache

  1. CONTENIDO
  2. ¿Qué es suEXEC?
  3. Antes de comenzar
  4. El modelo de seguridad de suEXEC
  5. Configurando e instalando suEXEC
  6. Habilitando y deshabilitando suEXEC
  7. Usando suEXEC
  8. Depurando suEXEC
  9. Cuidado con el Jabberwock: Advertencias & Ejemplos

¿Qué es suEXEC?

La característica suEXEC -- introducida en Apache 1.2 -- provee a los usuarios de Apache la posibilidad de correr programas con interfaz común de acceso, CGI (Common Gateway Interface) y directivas interpretadas por el servidor, SSI (Server Side Includes) bajo ID's de usuario diferentes del ID de usuario del servidor Web. Normalmente, cuando un programa CGI o SSI es ejecutado, éste corre con el mismo ID de usuario con que el Servidor Web está corriendo.

Usada apropiadamente, esta característica puede reducir considerablemente los riesgos de seguridad que significa permitir a los usuarios desarrollar y ejecutar programas CGI o SSI privados. Sin embargo, si suEXEC no es configurado apropiadamente, puede causar gran número de problemas y posiblemente creará nuevos huecos en la seguridad del ordenador. Si no se está familiarizado con el manejo de programas setuid y los asuntos de seguridad que ellos presentan, se recomienda enfáticamente que no se use suEXEC.

VOLVER AL CONTENIDO

Antes de comenzar

Antes de entrar de cabeza en este documento, se debe ser consciente de las asunciones hechas por parte del Grupo Apache y este documento.

Primero, se asume que se está usando algún sistema operativo derivado de UNIX que es capaz de realizar operaciones setuid y setgid. Todos los ejemplos son dados en este sentido. Otras plataformas, si son capaces de soportar suEXEC, pueden diferir en su configuración.

Segundo, se asume que se está familiarizado con los conceptos básicos de seguridad y administración de un ordenador. Esto implica entender las operaciones setuid/setgid y los efectos que pueden tener en el sistema y en el nivel de seguridad.

Tercero, se asume que se está usando una versión no modificada del código de suEXEC. Todo el código de suEXEC ha sido cuidadosamente escrutado y testeado por los desarrolladores como, así también, por numerosos "beta testers". Cada precaución ha sido tomada para asegurar un base de código simple y sólida. Alterar este código puede causar problemas inesperados y nuevos riegos de seguridad. Es altamente recomendado no alterar el código de suEXEC a menos que se conozcan profundamente los aspectos de programación segura y se tenga la intención de compartir el trabajo con el Grupo Apache para futuras consideraciones.

Cuarto y último, el Grupo Apache ha decidido NO incorporar suEXEC como parte de la instalación por defecto de Apache. Para finalizar, la configuración de suEXEC requiere, por parte del administrador, una cuidadosa atención a los detalles. Luego que la debida consideración ha sido dada a la configuración de suEXEC, el administrador puede instalar suEXEC de manera normal a través de los métodos normales de instalación. Los valores para estas configuraciones necesitan ser cuidadosamente determinados y especificados por el administrador para mantener la apropiada seguridad del sistema durante el uso de suEXEC. Es a través de este detallado proceso que el Grupo Apache espera limitar la instalación de suEXEC únicamente a aquellos quienes sean lo suficientemente cuidadosos y determinados para usarlo.

¿Sigue con nosotros? ¿Sí? Bien. ¡Continuemos!

VOLVER AL CONTENIDO

El modelo de seguridad de suEXEC

Antes de comenzar a configurar e instalar suEXEC, se discutirá el modelo de seguridad que se está a punto de implementar. Al hacerlo, se comprenderá mejor qué está pasando exactamente por dentro de suEXEC y qué precauciones son tomadas para asegurar el sistema y su seguridad.

suEXEC está basado en un programa (wrapper) setuid que es llamado por el módulo principal de Apache. Este programa es llamado cuando un requerimiento HTTP es hecho para un programa CGI o SSI que el administrador ha diseñado para correr con un ID de usuario diferente al del Servidor Web. Cuando se realiza un requerimiento de este tipo, Apache provee al programa suEXEC del nombre del programa, ID de usuario e ID de grupo bajo los cuales el programa se va a ejecutar.

El programa emplea el siguiente proceso para determinar éxito o error: si alguna de las condiciones falla, el programa registra la falla y termina con un error, de lo contrario continúa:

  1. ¿Fue el programa llamado con el número apropiado de argumentos?
    El programa solo podría ejecutarse si es dado el número apropiado de argumentos. El formato apropiado de los argumentos es conocido por el servidor Web Apache. Si el programa no recibe el número apropiado de argumentos, esta siendo hackeado o hay algo mal con la porción suEXEC de su ejecutable Apache.
  2. ¿Es el usuario que ejecuta el programa un usuario válido del sistema?
    Esto es para asegurar que el usuario que ejecuta el programa es realmente un usuario del sistema.
  3. ¿Tiene este usuario permiso para ejecutar el programa?
    ¿Tiene el usuario permiso para ejecutar el programa suEXEC? Solamente un usuario (el usuario de Apache) tiene permitido ejecutar el programa.
  4. ¿Tiene el programa destino alguna referencia insegura a la estructura de directorios?
    ¿Contiene el programa destino referencias hacia atrás como "/" o ".."? Estas no son permitidas; el programa destino debe residir dentro del espacio del servidor web Apache.
  5. ¿Es el usuario destino un usuario válido?
    ¿Existe el usuario destino?
  6. ¿Es el grupo destino un grupo válido?
    ¿Existe el grupo destino?
  7. ¿Es el usuario destino super-usuario?
    Actualmente, suEXEC no permite a 'root' ejecutar programas CGI/SSI.
  8. ¿Está el ID de usuario destino POR ENCIMA del mínimo ID de usuario permitido?
    El ID de usuario mínimo es especificado durante la configuración. Esto le permite establecer el ID de usuario más bajo al que le será permitido ejecutar programas CGI/SSI. Esto se usa para bloquear las cuentas del "sistema".
  9. ¿Es el grupo destino el grupo del super-usuario?
    Actualmente, suEXEC no permite al grupo de 'root' ejecutar programas CGI/SSI.
  10. ¿Está el ID de grupo destino POR ENCIMA del mínimo ID de grupo?
    El ID de grupo mínimo es especificado durante la configuración. Esto permite establecer el ID de grupo más bajo al que le será permitido ejecutar programas CGI/SSI. Esto se usa para bloquear los grupos del "sistema".
  11. ¿Puede el programa cambiar exitosamente al ID de usuario y grupo destino?
    Aquí es donde el programa se convierte en el ID de usuario y grupo destino vía llamadas a setuid y setgid. La lista de grupos de acceso es inicializada con todos los grupos de los cuales el usuario es miembro.
  12. ¿Existe el directorio donde el programa destino reside?
    Si éste no existe, seguramente tampoco contiene archivos.
  13. ¿Está el directorio dentro del espacio del servidor web Apache?
    Si el requerimiento es para una porción regular del espacio del servidor, ¿está el directorio requerido dentro del ámbito de document root? Si el requerimiento es para un directio de usuario (UserDir), ¿está el directorio requerido dentro del ámbito de document root?
  14. ¿Tiene el directorio permiso de ESCRITURA para alguien más que el dueño?
    No queremos abrir el directorio a otros; solo el usuario dueño debe poder alterar el contenido del mismo.
  15. ¿Existe el programa destino?
    Si este no existe, tampoco puede ser ejecutado.
  16. ¿Tiene el programa destino permiso de ESCRITURA para alguien más que el dueño?
    No queremos darle a nadie más que al dueño la posibilidad de cambiar el contenido del programa.
  17. ¿Es el programa destino setuid o setgid?
    No queremos ejecutar programas que puedan cambiar nuestro UID/GID nuevamente.
  18. ¿Es el usuario/grupo igual al usuario/grupo del programa destino?
    ¿Es el usuario el dueño del archivo?
  19. ¿Puede limpiarse el entorno del proceso para asegurar operaciones seguras?
    suEXEC limpia el entorno del proceso estableciendo una ruta de ejecución segura (PATH definido durante la configuración) como así también pasando aquellas variables cuyos nombres sean listados en la lista de entorno seguro (también creada durante la configuración)
  20. ¿Podemos exitosamente convertirnos en el programa destino y ejecutarlo?
    Aquí es donde suEXEC termina y el programa destino comienza.

Esta es la operación estándar del modelo de seguridad del programa suEXEC. Este modelo es algo restrictivo y puede imponer nuevas limitaciones y reglas para el diseño de CGI/SSI, pero fue desarrollado cuidadosamente paso a paso con la seguridad en mente.

Para obtener más información sobre cómo este modelo de seguridad puede limitar sus posibilidades con respecto a la configuración del servidor, y así también cómo prevenir riesgos en la seguridad con una configuración apropiada de suEXEC, vea la sección "Beware the Jabberwock" de este documento.

VOLVER AL CONTENIDO

Configurando e Instalando suEXEC

Aquí es donde comienza la diversión. Si se usa Apache 1.2 o se prefiere configurar Apache 1.3 con el script src/Configure se deberá editar el archivo de cabecera de suEXEC e instalar el ejecutable en el lugar apropiado manualmente. Este procedimiento está descrito en un documento extra. Las siguientes secciones describen la configuración e instalación para Apache 1.2 con la interfaz estilo AutoConf (APACI)

Opciones de configuración de suEXEC APACI

--enable-suexec
Esta opción habilita la característica suEXEC la cual nunca es instalada o activada por omisión. Al menos una opción suexec-xxxxx debe ser provista junto con la opción enable-suexec para permitirle a APACI aceptar su requerimiento para usar la característica suEXEC.
--suexec-caller=UID
El nombre de usuario bajo el cual Apache normalmente se ejecuta. Este es el único usuario que tiene permiso para ejecutar el programa.
--suexec-docroot=DIR
Define lo que el DocumentRoot para Apache. Esta puede ser la única rama (más alla de los UserDirs) que pueden ser usados por suEXEC. El directorio por omisión es el valor de datadir con el sufijo /htdocs, por ejemplo si configura con datadir=/home/apache el directorio /home/apache/htdocs es usado como documento raíz para el programa suEXEC.
--suexec-logfile=ARCHIVO
Esto define el nombre del archivo donde todas las transacciones y errores suEXEC son guardados (muy usuado con propósitos de auditoría y depuración). Por omisión el archivo log es llamado suexec_log y localizado en su directorio estándar de logs (logfiledir).
--suexec-userdir=DIR
Define el subdirectorio bajo los directorios HOME de los usuarios bajo el cual el acceso a suEXEC deberá ser permitido. Todos los ejecutables bajo este directorio podrían ser ejecutados por suEXEC como el usuario dado por lo tanto deberán ser programas "seguros". Si está usando una directiva UserDir simple (ej. una que no contenga un "*") esta debería ser establecida al mismo valor. suEXEC no trabajará apropiadamente en aquellos casos donde la directiva UserDir apunta a una dirección que no es la misma que la indicada en el archivo passwd para los directorios HOME de los usuarios. El valor por defecto es public_html.
Si se tienen host virtuales con una directiva UserDir diferente para cada uno, se deberán definir todos para que residan bajo el mismo directorio padre; el nombre del directorio padre va aquí. SI este no es definido apropiadamente, los requerimientos CGI para ~userdir no funcionarán.
--suexec-uidmin=UID
Define este como el UID (User ID) más bajo posible permitido para ser un usuario destino apropiado para suEXEC. Para la mayoría de los sistemas, es común 500 o 100. El valor por defecto es 100.
--suexec-gidmin=GID
Define este como el GID (Group ID) más bajo posible permitido para ser un grupo destino apropiado para suEXEC. Para la mayoría de los sistemas, es común 100 y es usado como valor por defecto.
--suexec-safepath=RUTA
Define una RUTA segura para pasar a los ejecutables CGI. El valor por defecto es /usr/local/bin:/usr/bin:/bin.

Chequeando su configuración suEXEC
Antes de compilar e instalar el programa suEXEC puede chequear la configuración con la opción layout.
Salida de ejemplo:

    suEXEC setup:
            suexec binary: /usr/local/apache/sbin/suexec
            document root: /usr/local/apache/share/htdocs
           userdir suffix: public_html
                  logfile: /usr/local/apache/var/log/suexec_log
                safe path: /usr/local/bin:/usr/bin:/bin
                caller ID: www
          minimum user ID: 100
         minimum group ID: 100

Compilando e instalando el soporte suEXEC
Si se ha activado la característica con la opcion enable-suexec, el ejecutable suEXEC (junto con el de Apache) es autmáticamente creado cuando ejecuta el comando make.
Luego que todos los componentes han sido creados, se puede ejecutar el comando make install para instalarlos. La imagen binaria de suexec es instalada en el directorio definido por la opción sbindir. La ubicación por defecto es /usr/local/apache/sbin/suexec.
Por favor, se necesitarán privilegios de administrador para realizar el proceso de instalación. Para que el programa suEXEC pueda establecer el ID de usuario, el dueño de este deberá; ser root y deberá tener establecido el bit de ejecución setuserid.

VOLVER AL CONTENIDO

Habilitando & Deshabilitando suEXEC

Después de arrancar Apache, este busca por el archivo suexec en el directorio sbin (por defecto es /usr/local/apache/sbin/suexec). Si Apache encuentra el programa suEXEC configurado apropiadamente, mostrará el siguiente mensaje en al archivo error_log:

    [notice] suEXEC mechanism enabled (wrapper: /path/to/suexec)
		[aviso] mecanismo suEXEC habilitado (wrapper: /ruta/a/suexec)

Si este mensaje no aparece al arrancar el servidor, no está pudiendo encontrar el programa suEXEC donde lo esperaba o el ejecutable no está instalado setuid root.
Si se quiere habilitar el mecanismo suEXE por primera vez y el servidor ya esta ejecuntándose, se deberá matar y reiniciar el proceso de Apache. Simplemente reiniciarlo con una señal HUP o USR1 no es suficiente.
Si se quiere deshabilitar suEXEC se deberá matar y reiniciar el proceso de Apache después de haber removido el archivo suexec.

VOLVER AL CONTENIDO

Usando suEXEC

Servidores Virtuales:
Una forma de usar el mecanismo suEXEC es a través de las directivas User y Group en las definiciones VirtualHost. Estableciendo estas directivas a valores diferentes del ID de usuario del servidor principal, todos los requerimientos para CGI podrán ser ejecutados como el User y Group definidos para ese <VirtualHost>. Si una o ninguna de estas directivas son especificadas para cada <VirtualHost> entonces es asumido el ID de usuario del servidor principal.

Directorios de los usuarios:
El programa suEXEC puede también ser utilizado para ejecutar CGI's bajo el ID de usuario que está haciendo el requerimiento. Esto se logra usando el carácter ~ como prefijo del ID de usuario para quien la ejecución es deseada. El único requerimiento para que esta característica funcione es que la ejecución del CGI esté habilitada para el directorio del usuario y que el programa a ejecutar cumpla con el escrutinio de los chequeos de seguridad antes mencionados.

VOLVER AL CONTENIDO

Depurando suEXEC

El programa suEXEC puede escribir la información en el archivo definido con la opción suexec-logfile como fuera indicado. Si se ha instalado y configurado el programa de forma apropiada, se puede mirar este archivo y el error_log para encontrar cualquier irregularidad que se pudiese haber pasado por alto.

VOLVER AL CONTENIDO

Cuidado con el Jabberwock: Advertencias & Ejemplos

¡NOTA!
Esta sección puede no estar completa. Para obtener la última revisión de esta sección de la documentación, vea la Documentación en Línea del Grupo Apache.

Hay unos pocos puntos de interés respecto al programa que pueden causar limitaciones en la configuración del servidor. Se recomienda revisarlas antes de realizar notificaciones acerca de errores de suEXEC.

VOLVER AL CONTENIDO