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.
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!
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:
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.
Esto es para asegurar que el usuario que ejecuta el programa es realmente un usuario del sistema.
¿Tiene el usuario permiso para ejecutar el programa suEXEC? Solamente un usuario (el usuario de Apache) tiene permitido ejecutar el programa.
¿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.
¿Existe el usuario destino?
¿Existe el grupo destino?
Actualmente, suEXEC no permite a 'root' ejecutar programas CGI/SSI.
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".
Actualmente, suEXEC no permite al grupo de 'root' ejecutar programas CGI/SSI.
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".
Aquí es donde el programa se convierte en el ID de usuario y grupo destino vía llamadas asetuid
ysetgid
. La lista de grupos de acceso es inicializada con todos los grupos de los cuales el usuario es miembro.
Si éste no existe, seguramente tampoco contiene archivos.
Si el requerimiento es para una porción regular del espacio del servidor, ¿está el directorio requerido dentro del ámbito dedocument root
? Si el requerimiento es para un directio de usuario (UserDir), ¿está el directorio requerido dentro del ámbito dedocument root
?
No queremos abrir el directorio a otros; solo el usuario dueño debe poder alterar el contenido del mismo.
Si este no existe, tampoco puede ser ejecutado.
No queremos darle a nadie más que al dueño la posibilidad de cambiar el contenido del programa.
setuid
o setgid
?
No queremos ejecutar programas que puedan cambiar nuestro UID/GID nuevamente.
¿Es el usuario el dueño del archivo?
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)
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.
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
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
--suexec-docroot=DIR
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
log
es llamado suexec_log
y localizado
en su directorio estándar de logs
(logfiledir
).--suexec-userdir=DIR
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
.
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
--suexec-gidmin=GID
--suexec-safepath=RUTA
/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
.
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
.
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.
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.
¡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.
Por razones de seguridad y eficiencia, todos los requerimientos a suEXEC deben estar contenidos en el directorio de nivel superior del servidor virtual o en el directorio de nivel superior de un usuario. Por ejemplo, si se tienen cuatroVirtualHosts
configurados, se necesitará estructurar todos losDocumentRoot
de los servidores virtuales fuera de la estructura de directorios del servidor principal para tomar ventaja del soporte suEXEC para servidores virtuales.
PATH
de suEXEC
Esto puede ser algo peligroso de cambiar. Se debe asegurar que cada ruta que se incluya es un directorio confiable. No queremos permitir a alguien del otro lado del mundo correr un TROYANO en ellos.
Nuevamente, esto puede causar grandes problemas si se intenta hacer sin conocer exactamente lo que se hace. Manténgase alejado de él todo lo que le sea posible.