Este post es básicamente una traducción de este otro, donde se enumeran, como dice el título, 20 métodos para conseguir que nuestro servidor Apache esté más seguro. Recuerda que son eso, recomendaciones, y no garantías de que no vayas a tener problemas, así que no descuídes la tarea de hacer copias de seguridad. Por otra parte, alguno de estos métodos (sobre todo combinados) puede(n) reducir el rendimiento del servidor, así que no los apliques a ciegas sin pensartelo.
Nota: cuando se indique que hay que agregar o cambiar líneas del archivo de configuración de Apache, se refiere al archivo httpd.conf
, que suele estar situado en el subdirectorio conf
en /etc/httpd
o dentro del directorio de instalación de Apache (pero el directorio puede variar mucho según el sistema operativo, distribución o incluso la configuración de tu sistema).
Antes de nada, asegúrate de tener instalados los últimos parches de seguridad instalados
Si no tenemos los agujeros de seguridad bien tapados no tiene demasiado sentido continuar con la optimización de seguridad.
Asegúrate de que sólo root tiene acceso de lectura a los binarios y ficheros de configuración de Apache
Suponiendo que la instalación de este programa está en /usr/local/apache habría que hacer esto:
# chown -R root:root /usr/local/apache# chmod -R o-rwx /usr/local/apache
Restringir acceso por IP
Si tienes un recurso al que deba solamente tener acceso alguna red o IP en concreto, puedes configurarlo en Apache (por ej: si deseas restringir el acceso a tu Intranet para permitir solamente la red 176.16):
Order Deny,Allow
Deny from all
Allow from 176.16.0.0/16
o por IP:
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Oculta la versión y otra información delicada
Muchas instalaciones de Apache muestran el número de versión del servidor, el sistema operativo y un informe de módulos de Apache instalados; información que los usuarios maliciosos pueden usar para atacar tu servidor.
Hay dos directivas que necesitas agregar, o cambiar en el archivo de configuración:
ServerSignature Off
ServerTokens Prod
El ServerSignature
aparece en la parte inferior de las páginas generadas por Apache, por ej al mostrar el error 404 (documento no encontrado).
La directiva ServerTokens
sirve para determinar lo que pondrá Apache en la cabecera de la respuesta HTTP del servidor.
Apache debe funcionar bajo su propia cuenta y grupo de usuario
Algunas versiones de Apache, al igual que muchos otros programas, se ejecutan con el usuario nobody; esto compromete mucho su seguridad — al compartir la misma cuenta de usuario — así que conviene usar:
User apache Group apache
Utiliza el mod_security con las reglas de gotroot.com
El mod_security es un módulo estupendo de Apache escrito por Ivan Ristic, el autor de Apache Security de O’Reilly.
Esta es una lista de cosas que puedes hacer con mod_security:
- Filtración simple
- Filtración basada en expresiónes regular
- Validación de codificación de la URL
- Validación de codificación Unicode
- Auditing
- Prevención del ataque NULL Byte
- Límitar la memoria de subida
- Enmascarar la identidad del servidor
- Y más
Deshabilitar cualquier módulo innecesario
Apache viene por defecto instalado con un serie de módulos. Debes echarle un vistazo a la documentación de Apache y ver para qué sirve cada uno; así sabrás cuáles no son útiles en tu servidor (y de paso, ahorras algunos recursos para la ejecución de éste).
Busca en httpd.conf las lineas que contengan LoadModule
. Para deshabilitar el módulo debes agregar un # al principio de la línea; así pasa a ser un comentario. Para buscar los módulos prueba con:
$ grep LoadModule httpd.conf
Estos son algunos de los módulos que se instalan por defecto pero que suelen ser innecesarios: mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex.
Asegúrarte de que los archivos a los que se accede son los deseados
No deseamos que se pueda acceder a los directorios que no tengan permisos para ello. Suponiendo que el directorio raiz para nuestras webs es /web, la configuración óptima debería ser:
<Directory />
Order Deny,Allow
Deny from all
Options None
AllowOverride None
</Directory>
<Directory /web>
Order Allow,Deny
Allow from all
</Directory>
Ten en cuenta que al establecer Options None
y AllowOverride None
desabilitas todas las “options” y “overrides” para el servidor. Ahora tendrás que añadirlas explicitamente para cada directorio que requiera una Option
u Override
.
Desactiva las opciones para explorar directorios
Esto lo puedes hacer con las opciones de directiva dentro de la etiqueta <Directory>; tiene dos posibles valores: none o indexes.
Options -Indexes
Desactiva los includes del lado servidor
Esto también se hace con las opciones de directiva dentro de la etiqueta <Directory>; tiene dos posibles valores none o include.
Options -Includes
Desactiva la ejecución de CGI
Si no necesitas la ejecución de CGI por algún motivo en concreto, desactívala. Esto se hace con las opciones de directiva dentro de la etiqueta directorio; tiene dos posibles valores none
o ExecCGI
.
Options -ExecCGI
No permitir que Apache siga enlaces simbólicos
De nuevo, se configura con las opciones de directiva dentro de la etiqueta <Directory>. Tiene dos posibles valores none
o FollowSymLinks
.
Options -FollowSymLinks
Desactivar todas las opciones
Si deseas desactivar el uso de todas las opciones simplemente usa:
Options None
Si solamente deseas desactivar algunas en concreto, sepáralas con un espacio en las opciones de directiva:
Options -ExecCGI -FollowSymLinks -Indexes
Desactivar la ayuda para los archivos .htaccess
Esto ya está hecho, pero con la directiva AllowOverride
en Directory
. Cámbialo a none
.
AllowOverride None
Otra opción interesante sería bloquear la descarga de todos los archivos que comiencen con .ht (por ejemplo). Se haría de la siguiente forma:
AccessFileName .httpdoverride
<Files ~ “^\.ht”>
Order allow,deny
Deny from all
Satisfy All
</Files>
Disminuye el valor máximo de tiempo de espera
Por el defecto, el tiempo de espera es 300 segundos. Puedes disminuirlo por seguridad (para mejorar la resistencia a ataques de denegación de servicio) así:
Timeout 45
Limitar el tamaño maximo de peticiones
Apache tiene varias directivas que permiten limitar el tamaño de una petición, lo que puede ser muy útil para asegurarlo contra ataques por desbordamiento, por ejemplo.
Una buena forma de comenzar es con la directiva LimitRequestBody
, que está fijada a ilimitado por defecto. Si permities uploads de archivos que no sean mayores a 1MB, podrías fijar este ajuste a:
LimitRequestBody 1048576
Y si no estás permitiendo uploads de archivos, puedes fijarlo a un tamaño más pequeño.
Algunas otras directivas que puede ser conviente mirar son: LimitRequestFields
, LimitRequestFieldSize
y LimitRequestLine
.
Limitar el tamaño de un XML Request Body
Si tienes en ejecución mod_dav
(por ej, para usarlo con subversion) puede que quieras limitar el tamaño máximo de un XML request body. La directiva LimitXMLRequestBody
sólo está en Apache 2 y su valor predeterminado es de 1 million de bytes (~ 1 MB). Si estableces este valor a 0 eliminas la limitación de tamaño, lo que puede ser útil si el servidor va a manejar ficheros grandes, pero si no es el caso, puede ser conveniente establecer un límite Por ej, para definir un tamaño máximo de 10 MB:
LimitXMLRequestBody 10485760
Limitar la concurrencia
Esto más que para asegurar Apache es para mejorar su rendimiento, aunque también puede venir bien para hacer frente a las denegaciones de servicio. El programa tiene bastantes opciones de configuración que pueden usarse para ajustar el manejo de peticiones concurrentes. MaxClients
es el nº máximo de procesos hijos que serán creados para servir las peticiones. Otras directivas que puede ser importante ajustar son MaxSpareServers
, MaxRequestsPerChild
, y en Apache2, ThreadsPerChild
, ServerLimit
, y MaxSpareThreads
. No pongo nºs porque esto depende mucho del sistema de cada uno; en este caso la mejor manera de saber lo que conviene es la experimentación :-S
Ajustar la configuración de KeepAlive
Según la documentación de Apache, el uso de las directivas Keep Alive puede mejorar el rendimiento hasta en un 50% de cara al cliente, por lo que has de ser cuidadoso a la hora de cambiar su configuración, ya que puedes disminuir bastante el rendimiento a cambio de estar algo más protegido contra denegaciones de servicio.
Estas directivas están activadas por defecto y deberías dejarlas así, pero puede que te interese cambiar el valor de MaxKeepAliveRequests
puesto inicialmente a 100
, y el de KeepAliveTimeout
(por defecto 15
). Conviene que analices tus archivos log para determinar los valores más convenientes.
Ejecutar Apache en un entorno chroot
chroot
permite ejecutar un programa de forma aislada, para impedir que un fallo o ataque sobre éste afecte a otros elementos del sistema.
En el caso de que uses OpenBSD, ya viene configurado de esta forma por defecto. Si no es así, tendrás que hacerlo tú mismo, y esto puede ser complicado por culpa de las dependencias con ciertas librerías. El módulo mod_security
tiene incorporado el soporte para chroot. Si todo va bien, la cosa es tan simple como añadr esta directiva para mod_security
en tu configuración:
SecChrootDir /chroot/apache
Esto puede tener algunas pegas; por ello y por las complicaciones con dependendias que puede haber, deberías mirar la documentación para más info.
Buenas noches, muchas gracis por la info esta muy coimpoleta,
pero me disculpara y soy nuevo en configurar apache me podria hacer el favor de explicar em que parte del archivo httpd.conf va cada linea es que he intentado y no me funciona pero cro}eo que es que noi o colo en donde deberia ser.
gracias y
amigo no entiendo que quieres que te explique del archivo httpd.conf y en que tienes dudas…. explicate mejor
Excelente información.
Yo tengo esta configuración:
TimeOut 120
MaxKeepAliveRequest 500
KeepAliveTimeOut 60
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
Y me gustaría optimizarla pues a decir verdad estoy teniendo problemas de altos tiempos de respuesta y en consecuencia debo hacer los ajustes; pero no quiero hacerlos de manera arbitraria, sino que quiero hacerlo apegado a las normas.
Mi portal es un portal de mucho contenido multimedia pues es un periodico que maneja un CMS, estoy montado en un servidor Centos x64 con 16gb de memoria.
Cual es tu sugerencia al respecto?
Si quieres ponte en contacto conmigo desde el formulario de contacto diciendome el hardware de tu servidor 😀
Perdón, pero en que archivo pusiste esas configuraciones?, yo los pongo en server.xml y me no trabaja el apache Tomcat 6.0.
Gracias
el artículo se basa en el archivo httpd.conf o apache2.conf…. basicámente en el archivo global de configuracion de apache
Ayuda
Buenas Tardes
Estoy iniciando un proyecto con mysql y Jsp, con Apache Tomcat y tengo un problema grave y ya tengo mucho tiempo con este, por eso es mi molestia, no se si me puedas ayudar. Por favor.
Mira tengo apache 6.0 en Windows 2003, se quedan mis sesiones en TIME_WAIT, y quiero configurar con los valores que anexo
KeepAlive On
KeepAliveTimeout 3
Pero al ingresarlos al archivo server.xml. El apache Tomcat ya no quiere iniciar. Los quito y sigue trabajando
En donde los pongo es en el archivo server.xml? o es en otro archivo?:
Con este no puede iniciar
Quito esos renglones y arranca
Que puedo hacer?
Me puedes ayudar
Gracias y saludos.