seguridad Protección de servidor
Protección del servidor Apache Jose Ignacio Ruiz de Alegría
linux@software.com.pl
Cuando hablamos de Internet debemos hablar del servidor Apache, ya que es gracias a este servidor web por el que podemos publicar en Internet, así como podemos recibir la opinión de los internautas que han visitado nuestro sitio web, podemos colgar gráficos, fotos, banners con efectos flash, música, video, etc.
40
E
l servidor Apache, tanto la versión 1.3.x como la versión 2, se ha convertido en un servidor web de referencia para todo diseñador de páginas web, webmaster, etc. Aunque es uno de los más estables que hay actualmente en el mercado, debemos de recordar también que dicho servidor se encuentra constantemente sometido a ataques a través de Internet o de la web, los dos más comunes son el ataque a través de la instrucción POST. Dicha instrucción es ampliamente utilizada en Internet porque va unida al envio de información a través de Internet, por el cual un cracker intenta enviar información maliciosa a través de la red con la intención de perjudicar al servidor o provocar una negación de servicios. Como veremos más adelante hay una forma de evitar o de filtrar la información que se envía vía POST entre el servidor web y el cliente. Otro de los ataques más comunes que se producen a través del servidor Apache son los llamados Ddos Attack o Negación de servicios y como el mismo nombre lo indica, la finalidad de estos ataques es hacer que el servidor Apache se bloquee, lo que traerá como consecuencia la pérdida de servicio. Quién no ha escu-
Linux+ 1/2007
chado decir que el servidor está caído y que por ese motivo sus paginas web no son accesibles a través de Internet. Para evitar o mitigar en lo más posible esta clase de ataques, existen en el mercado dos módulos, ambos gratuitos, que permiten solucionar este tipo de problemas. Sus nombres son: mod_security y mod_evasive. Debido a que el 70 por ciento de los ataques son llevados a través de las aplicaciones web, debemos considerar aplicar un cortafuegos, firewall o filtro, que bloquee las solicitudes que proceden de los clientes hacia el servidor. Esa es la función principal del mod_security. Lo primero que tenemos que hacer es descargarnos el mod_security: descargamos el mod_security desde http://www.modsecurity. org/. Descomprimimos el fichero: tar –xzf modsecurity-Apache-1.9.2.tar.gz
Accedemos al directorio: cd modsecurity*
seguridad Protección de servidor Aquí necesitamos saber para qué versión de Apache lo vamos a instalar, pudiendo ser la versión 2.* o la 1.3.*. Si utilizamos la versión de Apache 1.3.* debemos de hacer: cd Apache1
Antes de instalar el módulo es conveniente hacer una copia de seguridad del archivo de configuración del servidor, por lo tanto haremos lo siguiente: cp /usr/local/Apache/conf/httpd.conf /usr/local/Apache/conf/httpd.conf.back
Instalamos el mod_security: /usr/local/Apache/bin/apxs –cia mod_security.c
Aquí debemos editar el fichero de configuración del Apache (httpd.conf), en dicho fichero debemos poder ver las siguientes instrucciones, indicadas abajo: LoadModule security_module libexec/mod_security.so AddModule mod_security.c
Señal inequívoca que el módulo se ha instalado correctamente, es ahora cuando podemos empezar a añadir las directivas de nuestro filtro o firewall. Para empezar a escribir las directivas dentro del fichero de configuración del Apache debemos hacer lo siguiente: editamos el httpd. conf, podemos elegir el editor que más nos guste en nuestro caso nano –f httpd.conf la definición de la directiva del modsecurity será, la siguiente <IfModules mod_se-
Figura 1. mod_security Activamos el filtro:
Rango de Bytes:
SecFilterEngine On
SecFilterForceByteRange 0 255
Activamos el chequeo del url, Post:
No permitir guardar un fichero en el directorio /tmp:
SecFilterCheckURLEncoding On SecUploadDir /tmp
Para evitar que interfiera con las aplicaciones SecUploadLeepFiles Off web: Sólo audita los intentos de violación del sercurity.c>. SecFilterCheckUnicodeEncoding Off vidor, con dicha opción activada, nos dejará en el fichero audit._log, del directorio /usr/ Listado 1. Comienzo de las reglas de filtrado local/Apache/logs. Dicho fichero es muy útil para buscar desde qué dominio nos han intentado atacar: SecFilterSelective THE-REQUEST “wget” SecFilterSelective THE-REQUEST “lynx” SecFilterSelective THE-REQUEST “telnet”
SecAuditEngine RelevantOnly
SecFilterSelective THE-REQUEST “ssh”
SecAuditLog
SecFilterSelective THE_REQUEST "scp "
logs/audit._log
Definición de los ficheros LOGS, el nivel cero (Level 0) es entorno de producción:
SecFilterSelective THE_REQUEST "rcp " SecFilterSelective THE_REQUEST "curl " SecFilterSelective THE-REQUEST “cd /tmp”
SecFilterDebugLog logs/modesec_
SecFilterSelective THE-REQUEST “cd /var/tmp”
debug_log
SecFilterSelective THE-REQUEST “cd /dev/shm”
SecFilterDebugLevel 0
SecFilterSelective THE_REQUEST "/../../ " SecFilterSelective POST_PAYLOAD “Subject\:” chain SecFilterSelective ARG_Bcc ”.\@”
Escaneo de las solicitudes POST:
</ifModule> SecFilterSacnPost On
www.lpmagazine.org
41
seguridad Protección de servidor
Listado 2. Juego completo de instrucciones REMOTE_ADDR, REMOTE_HOST, REMOTE_USER, REMOTE_IDENT, REQUEST_METHOD, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING, AUTH_TYPE, DOCUMENT_ROOT, SERVER_ADMIN, SERVER_NAME, SERVER_ADDR, SERVER_PORT, SERVER_PROTOCOL, SERVER_SOFTWARE, TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIME, API_VERSION, THE_REQUEST, REQUEST_URI, REQUEST_ FILENAME, REQUEST_BASENAME, IS_SUBREQ
Acción por defecto en caso de filtrado, niega, Le permitirá elegir exactamente dónde escribe en el log, muestra status:403: se utilizará o aplicará el filtro, aquí nosotros podremos elegir entre todas las variables de SecFilterDefaultAction “deny, log, los CGI, como se puede ver en nuestro caso status:403” cualquier petición que contenga las palabras wget, lynx, telnet, etc será automáticamente Comienzo de las reglas de filtrado (ver Lis- filtrada. Ver abajo el juego completo de instado 1). trucciones. Cabe especial mención a la instrucción de SecFilterEngine POST_PAYLOAD. Esta directiva nos da la posibilidad de activar El significado es la de aplicar el filtro en y desactivar el filtro on/off. la localización del cuerpo de los peticiones
por un tiempo prudencial de unos 10 segundos, dicha cantidad es configurable, y comparar si dichas IPs se encuentran en la lista negra o blacklist con las IPs de acceso. Si una vez comparadas las IPs resulta que ya se encuentra en su Blacklist le deberá de negar el acceso al servidor Apache o si alguien intenta abrir innumerables procesos haciendo muchas solicitudes a la vez en un tiempo, pongamos de 1 segundo, el sistema lo debería de incluir en su blacklist y negarle el acceso también. Debemos mencionar otra forma de ser incluido en la blacklist, que es hacer más de 50 peticiones en el mismo proceso por segundo. Pues bien esta herramienta ya existe, el módulo que lo hace posible es mod_evasive. Esta herramienta es muy útil y frena los intentos de ataque al servidor mediante el Ddos attack. Los pasos son los siguientes: Descargamos el mod_evasive desde http:// www.zdziarski.com/projects/mod_evasive/ y des-
POST. con respecto a la instrucción Chain. comprimimos el fichero: El significado es el de encadenar dos insCon esta directiva podemos chequear las soli- trucciones, véase el ejemplo de arriba. tar –xzf mod_evasive citudes POST, viene desactivado por defecto, por consiguiente la activamos. Reiniciamos el Apache Antes de instalar el módulo es conveniente Una vez que hemos reiniciado el Apache ya hacer una copia de seguridad del archivo de SecFilterDefaultAction tenemos en funcionamiento nuestro filtro, configuración del servidor, por consiguiente Esta directiva sirve para definir qué acción dicho filtro nos protegerá de ciertos ataques haremos lo siguiente: queremos que se ejecute una vez que el filtro y nos permitirá saber a través de cual usuaque hemos definido detecta que ha llegado rio se está cometiendo el ataque. Pero como cp /usr/local/Apache/conf/httpd.conf una solicitud que lo cumple. hemos dicho al principio, otro de los ataque .../usr/local/Apache/conf/ Deny : Interrumpe todos los procesos, de más comunes que afectan al servidor Apa- httpd.conf.back las solicitudes que cumple con nuestro filtro. che es el Ddos attack o negación de serviLog : Suma una entrada en el error_log. cios, quien no ha oído hablar de que el servi- Accedemos al directorio: Status:403 : Muestra la pagina 403. dor Apache está caído y que esa es la causa de que no se vean las páginas web. El Ddos cd mod_evasive* SecFilterForceByteRange attack se produce de la siguiente manera: Esta directriz consiste en limitar el rango de cuando alguien introduce el nombre de su Instalamos el mod_evasive: Bytes de las solicitudes que se hacen a través sitio web en Mozilla Firefox o en Internet del servidor Apache. La intención de esta limi- Explorer y comienza a ver su página web, /usr/local/Apache/bin/apxs –cia tación consiste en limitar los ataques overflow el servidor Apache debe abrir un proceso mod_evasive.c attacks, por defecto todo los rangos de bytes para atender a esa demanda, dicho proceso son permitidos. lleva por consiguiente un uso de la CPU y Aquí debemos de editar el fichero de confide memoria del sistema. El ataque consiste guración del Apache (httpd.conf), en dicho SecAuditEngine RelevantOnly en hacer muchas peticiones sobre la misma fichero debemos de poder ver las siguientes La directiva SecAuditEngine junto con relevant- página durante un tiempo muy corto, lo que instrucciones, ver abajo: Only significa que incluye sólo las solicitudes obligará al servidor Apache a abrir innumeque cumplen con las condiciones de nuestro rables procesos con la intención de atender filtro. a la demanda de peticiones que ha recibido dicho proceso lo que conllevará un mayor SecAuditLog consumo de CPU y de memoria del sistema, Suma una entrada en el fichero logs/ audit._ llegando a colapsar el servidor, una vez llelog cuando se cumpla una de las condiciones gado a este punto, la finalidad de este ataque del filtro, dicha acción es muy útil para poder se ha completado, ya que se ha producido analizar a través de quien nos ha venido el una carencia del servicio. ataque. La manera de defenderse de esa clase Con la directiva SecFilterSelective Location de ataques sería la de crear una lista negra Keywords [Action]. (“blacklist”) o tabla en la cual se guardará Figura 2. mod_evasive
SecFilterSacnPost On
42
Linux+ 1/2007
seguridad Protección de servidor
LoadModule evasive_module libexec/mod_evasive.so AddModule mod_evasive.c
Señal inequívoca de que el módulo se ha instalado correctamente, es ahora cuando podemos empezar a añadir las directivas de configuración del módulo dos_evasive Para empezar a escribir las directivas dentro del fichero de configuración del Apache debemos de hacer lo siguiente: editamos el httpd.conf, podemos elegir el editor que más nos guste en nuestro caso nano –f
re la misma página, por defecto ponemos 1 procesos sobrantes, los valores que vienen por segundo. defecto son válidos y no conviene alterarlos.
DOSSiteInterval
KeepAliveTimeOut 15
Con este valor definimos el intervalo de tiempo por el cual el DOSPageInterval debe de contar el máximo de solicitud hechas sobre el mismo proceso, por defecto ponemos 1 segundo.
Este es el tiempo por el cual el servidor Apache esperará en atender la recepción de la siguiente petición, una vez pasado este tiempo el proceso desaparece, si el servidor Apache recibe muchas peticiones es aconsejable reducir dicha cantidad.
DOSBlockingPeriod
Como ya hemos mencionado anteriormente una vez que la IP de cualquiera de nuestros httpd.conf clientes cumple con las condiciones arriba inLa definición de la directiva del mod_ dicadas, dicha IP se suma a nuestra Blacklist, evasive será la siguiente: trayendo como resultado una página de error y se le niega el acceso al servidor Apache, esa <IfModule mod_evasive.c> situación de permanencia en nuestra Blacklist DOSHashTableSize 3097 no es definitiva y nosotros podemos definir DOSPageCount 10 durante cuanto tiempo dicha IP estará en DOSSiteCount 50 nuestra Blacklist, en nuestro caso dicha situa-
ción de negación de acceso será durante 10 segundos, una vez cumplido dicho período DOSBlockingPeriod 10 de tiempo la IP dejará de estar en nuestra </IfModule> Blacklist Debemos recordar que el mod_evasise, esDOSHashTableSize cribe en el syslog cualquier incidencia o Ddos Esta tabla define el máximo número de nodos attack que ha tenido, en dicho fichero aparea almacenar por proceso. Si incrementamos el cerá de la siguiente forma, ver abajo: número aumentará la velocidad de ejecución del proceso ya que reducirá el número de Active System Attack Alerts Iteraciones por registro, pero traerá como Oct 24 11:07:35 host mod_evasive[15587]: consecuencia un incremento de los recursos Blacklisting address xx.xx.xx.xx: possible del servidor, lo que implica que consumirá attack. más memoria del sistema. En el supuesto que tengamos un servidor Apache que tenga que Reiniciamos el Apache atender mucho trafico es aconsejable incre- Por último debemos hacer una mención del mentar dicha cantidad. fichero de configuración del Apache, he aquí unos consejos que servirán para poder meDOSPageCount jorar el funcionamiento del servidor Apache Este valor es el número de solicitudes sobre y lo reforzarán contra ataques maliciosos la misma página o URI por intervalo, si di- a través de Internet. chas solicitudes exceden al valor previamente definido, que para nuestro caso es de 10, la HostNameLookups off IP del cliente será sumada en nuestra Black- No activaremos la directriz, de esa forma el list. Apache registrará la IP de acceso de cada cliente que acceda al servidor, si la activaDOSSiteCount mos traerá como consecuencia un menor Este valor es el número máximo de solicitu- rendimiento del servidor. des hechas sobre el mismo proceso por el mismo cliente, si dicho valor excede el valor MinSpareServers/MaxSpareSarvers previamente definido, que para nuestro caso Ambas directrices sirven para regular la canes de 50, la IP del cliente será sumada en tidad de procesos, es decir tratan de mantener nuestra Blacklist. el suficiente número de procesos de carga, para ello comprueban la cantidad de veces que DOSPageInterval un proceso se queda esperando una petición, Con este valor definimos el intervalo de tiem- si son menos que el valor especificado por la po por el cual el DOSPageCount debe de con- instrucción MinSpareServer crea una reserva, tar el número máximo de solicitudes sob- si es superior a MaxSpareServer eliminará los DOSPageInterval 1 DOSSiteInterval 1
www.lpmagazine.org
AllowOverride None No permitiremos que un usuario del sistema pueda cambiar o sobrescribir mediante los ficheros .htaccess con el propósito de alterar el funcionamiento del Apache. Una vez llegado al final del articulo, hemos visto las formas de ataques que se producen a través de la red, o mejor dicho, a través de Internet, que van explícitamente a intentar atacar al servidor mediante solicitudes POST, para el cual hemos dispuesto la instalación del modulo mod_security con la intención de poner un filtro a dichas solicitudes y evitar en lo posible ataques a través de aplicaciones web que pueden producir un fallo de seguridad en el sistema, también dicho módulo nos da una idea de cual puede ser el usuario del sistema utilizado para producir el ataque. Junto con el módulo dos evasive que nos protege de los ataques de negación de servicio, también conocido como Ddos atacks, evitando que mediante un montón de solicitudes reiterativas sobre el servidor Apache atacado provoque la caída de éste. También hemos comentado la manera de mejorar los parámetros de configuración del Apache accediendo al fichero de configuración del mismo. Después de este curso podríamos caer en la tentación de empezar a instalar cualquier módulo para el servidor Apache que pueda hacer el mismo trabajo de protección, pero debemos de advertir que cuantos más módulos sean instalados, menor será el redimiendo del servidor, también puede abrir un fallo en la seguridad de su servidor dejando un hueco de seguridad el cual un cracker puede aprovechar y tener acceso al sistema. Lo que es más importante, y como de open source estamos hablando, es importante que dicho módulo tenga una comunidad que lo mantenga de tal forma que se actualice rápidamente en caso que aparezca un fallo de seguridad. Si dicha comunidad no existe no conviene pensar en instalarlo en nuestro servidor, porque podría resultar un peligro para nuestro sistema, sobre todo en un entorno de producción.
43