Tips Seguridad Servidor WEB – Hardening Secure Apache Web Server

El presente instructivo tiene como finalidad mostrar algunas recomendaciones de configuraciones que pueden ser aplicadas en servidor web apache2 para su protección.

El presente instructivo ha sido actualizado y es aplicado perfectamente a servidor Web Apache versión 2.4

Aplicaciones o configuraciones complementarias:

Recomendaciones a nivel de sistema operativo:

1. Cambiar el directorio por defecto donde es alojada los website en apache. Por defecto Apache 2.4 crea un directorio “/var/www/html” en el cual es colocado los website o páginas a servir, es recomendable cambiarlos o crear uno nuevo, ejemplo /opt/www/html o /srv/www/html.

admin@servidor:/$ sudo mkdir -p /opt/www/html

2. Se recomienda efectuar cambios a nivel de fstab de las opciones de montaje del directorio “/srv”, habilitando las siguientes opciones:

  • -nodev: Impide la interpretación de los dispositivos especiales o de bloques del sistema de archivos
  • -nosuid: Bloquea el funcionamiento de suid, y sgid bits. suid permite a los usuarios comunes ejecutar binarios con privilegios concedidos temporalmente
  • -noexec: No permite la ejecución de binarios que se encuentren en el sistema de archivos. Muy pendiente con el código o aplicativo que se utilizará con el servidor apache, ya que si tienen un binario, el mismo no podrá ser ejecutada

Ejemplo de una entrada en fstab:

/dev/mapper/VolGroup-lvsrv /opt   ext4   nodev,nosuid,noexec   0    2

Recomendaciones a nivel de aplicativo Apache 2.4
Configuración

Evita la búsquedas de DNS para que los nombres de host se pueden registrar
1. Editar archivo de configuración de apache2:

admin@servidor:/$ sudo nano /etc/apache2/apache2.conf

Leer más »

Anuncios

Dimensionamiento (Tunning) Apache2 prefork (+PHP5) Maxclients

La presente tiene como finalidad presentar un ejemplo práctico de como calcular el valor de Maxclients en Apache2 Prefork con PHP5.

Aplicaciones o configuraciones complementarias:

Documentación oficial de Apache2

La directiva MaxClients establece el límite en el número de solicitudes (peticiones) simultáneas que se servirán. Cualquier intento de conexión sobre el valor de MaxClients, se colocará en cola, hasta un número basado en la directiva ListenBacklog. Una vez que un proceso hijo se libera al final de una solicitud diferente, entonces será atendida la conexión.

Para los servidores prefork(que es nuestro caso de ejemplo), MaxClients se traduce en el número máximo de procesos secundarios que serán lanzadas para servir peticiones. El valor por defecto es 256; para aumentarlo se hace necesario incrementar ServerLimit.

Análisis servidor básico Debian + Apache2 + PHP5

Para efectuar los calculos de la directiva maxclients, se deben conocer los siguientes parámetros:
El el consumo de memoria RAM de Apache2 y PHP5, el consumo de memoria RAM del aplicativo (página web), la cantidad de memoria RAM consumido por el sistema operativo y la cantidad de memoria RAM a reservar

1. Consumo memoria RAM Apache2 + PHP5
2. Consumo memoria RAM aplicativo(página web)
3. Consumo memoria RAM sistema operativo
4. Cantidad memoria RAM a Reservar
Leer más »

Reducir el Tiempo, Reciclar y Reusar el Estado TIME_WAIT en conexión TCP

El presente instructivo tiene como finalidad presentar los pasos básicos necesarios para la configuración en el kernel de Linux del estado TIME_WAIT de conexión TCP.
Ésta configuración puede ser utilizada para optimizar las conexiones de servicios Web o Base de Datos, aunque es recomendado configurar una aplicación para el agrupamiento de conexiones (connection pooling) o en el caso del servidor WEB el Keep-Alive.

El agrupamiento de conexiones (connection pooling) permite entre otras cosas, el manejo de una colección de conexiones abiertas a una base de datos de manera que puedan ser reutilizadas al realizar múltiples consultas o actualizaciones. En el caso de los serviodres WEB (Apache), el “Keep-Alive”, permite “mantener viva” la conexión de un cliente durante algún periodo corto de tiempo.

En aplicaciones como Mysql, PostgreSQL, Oracle, entre otros entre otros suelen aperturar y cerrar conexiones a cada instante y dependiendo del número de usuarios y la demanda (peticiones por segundo), aumenta la posibilidad de sufrir degradación del servicio.

Cuando una conexión TCP se cierra activamente, el puerto DEBE permanecer en el estado de TIME-WAIT durante un tiempo de 2xMSL (Maximum Segment Lifetime), es decir 2 minutos, tiempo en el cual la conexión esta ocupada y no puede ser reutilizado inmediatamente.

A continuación esquema(Según Protocolo de Control de Transmisión RFC: 793) secuencia normal de cierre de una conexión TCP:

       TCP A                                                TCP B

  1.  ESTABLISHED                                          ESTABLISHED

  2.  (Close)
      FIN-WAIT-1  --> <SEQ=100><ACK=300><CTL=FIN,ACK>  --> CLOSE-WAIT

  3.  FIN-WAIT-2  <-- <SEQ=300><ACK=101><CTL=ACK>      <-- CLOSE-WAIT

  4.                                                       (Close)
      TIME-WAIT   <--  <SEQ=300><ACK=101><CTL=FIN,ACK> <-- LAST-ASK

  5.  TIME-WAIT   --> <SEQ=101><ACK=301><CTL=ACK>      --> CLOSED

  6.  (2 MSL)
      CLOSED

RFC 793. TRANSMISSION CONTROL PROTOCOL DARPA INTERNET PROGRAM PROTOCOL SPECIFICATION. 3.5. Closing a Connection. Secuencia de cierre normal. Figura 13

Configuración

1. Verificar las conexiones TIME_WAIT

root@server:/# netstat -nat | awk '{print $6}' | sort | uniq -c
      6 CLOSE_WAIT
      1 established)
     18 ESTABLISHED
      1 Foreign
     38 LISTEN
     10 TIME_WAIT

Leer más »

Desactivar OOM-Killer (out of memory killer) en Linux

El presente instructivo tiene como finalidad de desactivar la función del Kernel oom-killer.

El kernel de Linux asigna memoria a la demanda de las aplicaciones que se ejecutan en el sistema. Debido a que muchas aplicaciones asignan su memoria por adelantado y ha menudo no utilizan la memoria asignada, el kernel fue diseñado con la capacidad de “over-commit” de memoria, esto con la finalidad de hacer más eficiente el uso de la memoria. Este modelo de over-commit permite al núcleo asignar más memoria de la que realmente tiene físicamente disponible. Si un proceso utiliza realmente la memoria que fue asignada, el núcleo a continuación, proporciona estos recursos a la aplicación. Cuando varias aplicaciones comienzan a utilizar la memoria que le fueron asignadas, el modelo de over-commit puede ser problemático y el núcleo debe comenzar a “matar procesos” para mantenerse operativo. El mecanismo que el núcleo utiliza para recuperar la memoria en el sistema se conoce como “out-of-memory killer” o OOM-Killer.

Diagnóstico:

1. Verificar si el proceso oom-killer ha sido ejecutado en el sistema:

root@server:/# grep -i kill /var/log/messages*

2. Verificar uso de le memoria comando free

root@server:/# free -m

nota: Consultar interpretación comando free
3. verificar uso de la memoria comando vmstat

root@server:/# vmstat 3 50

Leer más »

Creando imágenes con Docker Container

El presente instructivo tiene como finalidad la creación de una imágen “personalizada” de docker y “subirla” a una cuenta en Docker Hub, utilizando para ellos los comandos Docker commit y Docker file

Requisitos:

  • Se debe contar con suficiente privilegios para la configuración de aplicativos
  • Se debe tener docker instalado
  • Tener una cuenta creada en Docker Hub

Configuraciones Relacionados:

Plataforma:

  • Equipos de arquitectura 64 bits
  • Sistema operativo ‘GNU/Linux’ Debian versión 8.0 (actualmente estable)

Crear Imagen

Las “buenas prácticas” recomiendan, que los datos de las aplicaciones no deben ser guardados en las imágenes, los mismos deberán ser guardadas en volumenes compartidos, lo que se guarda en las imagenes son los aplicativos o servicios y las configuraciones o customización. El objetivo es que dichas imagenes puedan ser reutilizadas.

Existen básicamente dos formas de crear una imágen:

  • 1.- Utilizando el comando de construcción de Docker Dockerfile (recomendado)
  • 2.- Utilizando el comando de Docker commit

Para la creación de imágenes “personalizadas” es recomendeble utilizar Dockerfile, ya que utiliza un mecanismo más flexible, potente, transparente y repetible

CREANDO IMAGEN
Las imagenes creadas en los siguientes ejemplo será una imagen docker a partir de debian 8 y contedrá la instalación de apache2, el modulo de soporte de apache para php5, php5 y el módulo de conexión de mysql para php5. Al final estará expuesto el puerto 80 con el servicio apache instalado
Leer más »

Instalando servicio web apache2 en Docker

El presente instructivo tiene como finalidad describir de forma breve los pasos a seguir para la puesta en funcionamiento de un servicio web Apache dentro de Docker

Requisitos:

  • Se debe contar con suficiente privilegios para la configuración de aplicativos
  • Se debe tener docker instalado

Configuraciones Relacionados:

Plataforma:

  • Equipos de arquitectura 64 bits
  • Sistema operativo ‘GNU/Linux’ Debian versión 8.0 (actualmente estable)

Configuración
Desde Servidor anfitrion

1. Crear container basado en la imagen ubuntu versión 15.10

root@server:/# docker run -i -t --name apache2 -h apache2 -p 80:80 ubuntu:15.10 /bin/bash

donde:

 -i -> interactive
 -t -> consola tty
 --name -> nombre de la imagen, es éste caso apache2
 -h -> nombre del host, en éste caso apache2
 -p 80:80 -> Puertos de interconexión entre el container (puerto interior) y la maquina anfitrion (puerto exterior). 
             Le dice a Docker que mapee los puertos que el contenedor este exponiendo, en éste caso 80, hacia el S.O huesped en el puerto 80 
 ubuntu:15.10 -> nombre de la imagen y versión (tag), en éste caso ubuntu versión 15.10
 /bin/bash -> comando a ejecutar cuando inicie la imagen, en éste caso la consola bash
 

Nota: En éste caso el container se comunicará a través del puerto 80 de la maquina anfitriona.
Leer más »

Instalación y configuración de módulo Mod_Evasive Servidor Web (Apache)

El presente instructivo tiene como finalidad dar a conocer el procedimiento para la instalación y configuración del módulo Mod-Evasive (minimizar ataques HTTP DoS) para Apache2 en la distribución GNU/Linux Debian version 8.0 ( “jessie”) stable.

Mod_evasive es un módulo de apache que básicamente lo que hace es mantener una tabla dinámica con las páginas (URIs) accedidas por las distintas direcciones IP de los clientes (navegadores) que acceden al site web (Apache), y permite ejecutar algunas acciones cuando una misma IP (atacante) solicita un mismo recurso (una misma URI o elementos de un mismo sitio) más de n veces en m segundos. La acción por default que ejecuta el mod_evasive es, una vez superado el máximo de requests por segundo permitidos, bloquear durante una cantidad de tiempo (segundos) a la IP del cliente (atacante) devolviendo un error 403 (Forbidden) a la petición HTTP, de igual forma permite ejecutar un comando de sistema al registrar un “intento de ataque”, lo que flexibiliza la configuración, de por ejemplo, reglas de iptables para bloquear la IP del cliente (atacante).

Requisitos:

  • Se debe contar con el funcionamiento de servicio Web apache2
  • Se debe contar con suficiente privilegios para la instalación de aplicativos

Plataforma:

  • La presente instalación es para equipos de arquitectura 64 bits.
  • El sistema operativo empleado es ‘GNU/Linux’ Debian versión 8.0, actualmente estable

Configuraciones Relacionados:

Aplicaciones:

  • Apache -> 2.4.10 (aunque es funcional para Apache 2.2)
  • libapache2-mod-evasive -> 1.10.1-3
  • Apache-utils -> 2.4.10-10+deb8u5 (para las pruebas con ApacheBench)

Instalación de Dependencias

operador@servidor:/$ sudo aptitude install libapache2-mod-evasive

Leer más »