Servidor web Apache: instalación, configuración y protección contra ataques.

El servidor web Apache no necesita presentación. Es un software de código abierto lanzado por la Fundación Apache, uno de los servidores web más utilizados en el mundo. Echemos un vistazo a cómo instalarlo y cómo configurar un firewall para permitir el tráfico HTTP y HTTPS y los hosts virtuales en Ubuntu 18.04.

Pasos de instalación de Apache

Instalar Apache Web Server en Ubuntu 18.04 Bionic Beaver es muy simple:

$ sudo apt-get update && apt-get install apache2

Los scripts de instalación de Ubuntu se encargarán de ejecutar y habilitar el servicio apache2 en el momento del arranque.

Configurar el firewall

Para acceder al contenido del servidor en la misma máquina donde funciona, debe iniciar un navegador web y escribir en la barra de direcciones. Si todo está configurado correctamente, la página te saludará con las palabras: «¡Funciona!».localhost

http://local.server.ip

Si el firewall está habilitado en el sistema (como debería ser), para que el contenido esté disponible desde fuera de nuestra máquina, debemos permitir el tráfico entrante a través del puerto 80. El comando para ejecutar depende del administrador de firewall que esté utilizando. Por ejemplo, al usar (usado en Ubuntu por defecto) debemos ejecutar:ufw

$ sudo ufw allow http

Si está utilizando, puede ejecutar:firewalld

$ sudo firewall-cmd --permanent --add-service=http && firewall-cmd --reload

Tenga en cuenta que el comando anterior será válido de forma predeterminada en la zona. Si desea trabajar con otra zona, debe especificarla mediante la opción.firewalld--zone

Te puede interesar: Generar certificados SSL para Windows y Android

Configuración del host virtual

Un servidor web Apache puede ejecutar varios sitios web en un solo equipo. Cada sitio en ejecución («host virtual» en la terminología de Apache) debe tener su propia configuración. Un host virtual puede ser una IP o un nombre.

En esta guía, nos centraremos en el segundo tipo, ya que es más fácil de configurar y no requiere múltiples direcciones IP (los hosts virtuales basados en nombres permiten que varios sitios web usen la misma dirección IP).

Host virtual predeterminado

En Ubuntu, el host virtual predeterminado se define en un directorio dentro del archivo. Considéralo:/etc/apache2/sites-available000-default.conf

<VirtualHost *:443>
  [...]
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html

  [...]

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

  [...]
</VirtualHost>

La directiva de primera línea se aplica a un grupo de parámetros utilizados por Apache para un host virtual en particular. Lo primero que verás en él es una instrucción. Especifica la dirección IP y el puerto utilizado por el host virtual.<VirtualHost>*:80

Se pueden definir varios sitios en el mismo archivo o por separado. En ambos casos, la primera definición se considera la predeterminada si ningún otro host virtual coincide con la solicitud del cliente.

La directiva en la línea 3 no es obligatoria, se utiliza para especificar una dirección de contacto. Por lo general, las directivas proporcionan una dirección de correo electrónico válida como argumento para facilitar el contacto con el administrador.

DocumentRootSe requiere la línea 4, esto es importante para la configuración del host virtual. El argumento de esta instrucción debe tener acceso al sistema de archivos. El directorio especificado se considerará el directorio raíz del host virtual y no debe contener el carácter «/» final. En este caso, el directorio raíz del documento es . Si nos fijamos en su contenido, podemos ver que contiene una página que usted ha visto previamente como la página de bienvenida del servidor./var/www/htmlindex.html

Los dos últimos comandos de las líneas 8 a 9 se muestran en este —y. Con el primero, especifique un archivo en el que el servidor escribirá los errores que se produzcan. El segundo se utiliza para registrar las solicitudes enviadas al servidor en el formato especificado.VirtualHostErrorLogCustomLog

Nuevo host virtual

Ha visto cómo se define el host virtual predeterminado. Ahora digamos que desea alojar otro sitio web utilizando su servidor web. Para hacer esto, debe definir un nuevo host virtual.

Como se indicó anteriormente, los archivos de host virtual deben definirse dentro del directorio (al menos en distribuciones basadas en Debian). Así que vamos a crear este archivo allí. Antes de hacerlo, debe crear un directorio que se utilizará como raíz del documento y también crear una página básica que se mostrará al abrir el sitio:/etc/apache2/sites-available

$ sudo mkdir /var/www/example && echo "Welcome to example!" > /var/www/example/index.html

Ahora puede comenzar a configurar el host virtual:

<VirtualHost *:80>
DocumentRoot /var/www/example
ServerName www.example.local
</VirtualHost>

Esta es la configuración mínima requerida para ejecutarlo. Aquí puedes ver la nueva directiva. Esto es lo que define su host virtual. Guardemos este archivo como. Para activar el host virtual, utilice el comando. Este comando crea un enlace simbólico al archivo en el directorio:ServerNameexample.confa2ensite/etc/apache2/sites-enabled

$ sudo a2ensite example.conf

Después de eso, debe reiniciar la configuración del servidor:

$ sudo systemctl reload apache2.service

Para comprobar que la configuración funciona, debe agregar una entrada al equipo con el que está intentando ponerse en contacto con el sitio./etc/hosts

$ sudo echo "192.168.122.241 www.example.local" >> /etc/hosts

Sin esta cadena (y sin un registro DNS), sería imposible asociar la dirección del servidor con su nombre de host virtual, y el uso directo de un servidor IP en su lugar «iniciaría» el host virtual predeterminado.

Desde el equipo cliente, si ahora navega hasta, debería ver la página mínima que configuró anteriormente.www.example.local

Configurar SSL

SSL (Secure Sockets Layer) es una tecnología que nos permite cifrar los datos asociados a la conexión entre el cliente y el servidor. Cuando se utilizan certificados SSL, HTTPS (Hyper Text Transfer Protocol Secure) reemplaza a HTTP en la URL.

Los certificados SSL son emitidos por una autoridad de certificación y pueden ser muy costosos, pero hay otras dos formas de obtener un certificado: crear un certificado autofirmado o usar el servicio Let’s encrypt.

Crear un certificado SSL autofirmado

Crear un certificado autofirmado es una tarea sencilla. Esto puede ser útil si solo desea obtener cifrado. Podemos crear un certificado autofirmado usando la utilidad OpenSSL:

$ sudo openssl req -x509 \
 -days 365 \
 -sha256 \
 -newkey rsa:2048 \
 -nodes \
 -keyout example.key \
 -out example-cert.pem

Veamos qué hace este equipo. La primera opción especifica que se genera un certificado estándarX509.-x509

Con la ayuda de nosotros, establecemos el período de validez del certificado en días. La siguiente opción es. Con él, creamos una nueva clave, en este caso una clave RSA de 2048 bits. En el caso de prueba, no necesitamos cifrar el archivo de clave privada, por lo que lo usamos. Si no se especifica esta opción, el archivo en el que se almacena la clave estará protegido por una contraseña, que deberá presentarse cada vez que se reinicie el servidor web.-days-newkey-nodes

Utilícelo para especificar un archivo para escribir la clave generada y el certificado, respectivamente. Cuando ejecutemos el comando, se nos pedirá que respondamos algunas preguntas, después de lo cual se generará una clave y un certificado.-keyout-out

Copie la clave y el certificado generados en los directorios, respectivamente:/etc/ssl/private/etc/ssl/ssl-certs

$ sudo cp example-cert.pem /etc/ssl/certs

El certificado es público, por lo que no requiere un permiso especial.

Ahora la clave:

$ sudo cp example.key /etc/ssl/private

Es importante configurar los derechos de acceso al archivo de claves. La carpeta pertenece al usuario raíz y al grupo, y tiene derechos de acceso 710. Esto significa que el propietario tiene todos los derechos sobre él, y el propietario del grupo solo puede acceder a él y enumerar su contenido, pero no puede dar permiso a otros:/etc/ssl/privatessl-cert

$ ls -ld /etc/ssl/private
drwx--x--- 2 root ssl-cert 4096 Mar 16 11:57 /etc/ssl/private

Cambiemos los derechos de acceso al archivo de claves para otorgar al propietario acceso de lectura/escritura y permisos de solo lectura para el grupo:

$ sudo chown root:ssl-cert /etc/ssl/private/example.key
$ sudo chmod 640 /etc/ssl/private/example.key

Ahora, para usar el certificado, debe habilitar el módulo SSL usando el comando:a2enmod

$ sudo a2enmod ssl

Casi todo está listo. Ahora es el momento de cambiar nuestro host virtual y configurarlo de la siguiente manera:

<VirtualHost *:443>
  DocumentRoot /var/www/example
  ServerName www.example.local

  # Enable ssl engine
  SSLEngine on

  SSLCertificate /etc/ssl/certs/example-cert.pem
  SSLCertificateKeyFile /etc/ssl/private/example.key
</VirtualHost>

El puerto 443 en la línea 1 es el puerto utilizado para HTTPS (en lugar del puerto 80 utilizado para HTTP).

También agregamos la declaración de iones en la línea 6.SSLEngine

Finalmente, en las líneas 8 a 9, definimos las rutas para el certificado y el archivo de claves siguiendo instrucciones.SSLCertificateFileSSLCertificateKeyFile

Ahora siga las instrucciones para abrir los puertos del firewall desde el principio del artículo, pero esta vez para permitir el servicio HTTPS:

$ sudo ufw allow https

Finalmente, reinicie la configuración de Apache:

$ sudo systemctl reload apache2

Listo. Ahora, si vamos a la dirección https://www.example.local, deberíamos ver un servidor web advirtiéndonos de que el certificado utilizado no es seguro. Esto, sin embargo, es una señal de que nuestro certificado está funcionando y el tráfico entre el cliente y el servidor se cifrará (debe agregar una excepción para que el certificado lo use).

Configurar Let’s encrypt

Una alternativa a los certificados comerciales y autofirmados es «Let’s encrypt». Es una autoridad de certificación gratuita, automatizada y abierta. Su propósito es hacer posible obtener automáticamente un certificado que sea de confianza para el navegador, sin ninguna intervención humana.

Para ello, utilice el protocolo ACME (agente de administración de certificados), que se ejecuta en el servidor.

Para obtener un certificado, debe confirmar que tiene control sobre el dominio para el que desea usarlo. Si no tiene acceso al shell en el servidor, debe ponerse en contacto con su proveedor de servicios para activar el certificado en su nombre, pero puede haber una sección especial en el panel de configuración del servicio.

Si tiene acceso al shell, debe instalar el cliente.certbotACME

Para instalar Certbot en Ubuntu 18.04, simplemente ejecute:

$ sudo apt-get update && apt-get install certbot python-certbot-apache

El paquete Certbot viene con un módulo que ejecutará Certbot dos veces al día para mantener el certificado actualizado. Obtener un certificado es bastante simple:systemd timer

$ sudo certbot --apache -m  -d

Obviamente, para que esto funcione, el dominio debe apuntar correctamente a su dirección IP pública. Certbot le pedirá algunas preguntas para configurar, y si todo va bien, el certificado y la clave se almacenarán en un directorio. Simplemente configure el archivo de host virtual para que apunte a ellos y listo./etc/letsencrypt/live/

Te puede interesar: Cómo poner tus finanzas en orden antes del Año Nuevo

Cómo proteger su servidor Apache

Medios básicos de protección

Instalar Fail2ban en Ubuntu Server 18.04

Si desea proteger su servidor Ubuntu, lo primero que debe hacer es instalar el sistema de detección de intrusos Fail2ban.

Fail2ban supervisa archivos de registro específicos (c) para detectar intentos fallidos de inicio de sesión o ataques automáticos en el servidor. Cuando se detecta un intento de comprometer una dirección IP, Fail2ban la bloquea agregando una nueva cadena para evitar el acceso o un nuevo ataque al servidor./var/logiptables

Fail2ban es tan fácil de instalar y usar que se puede considerar como una solución simple y versátil para todos los servidores Linux.

Instalarlo es simple. Inicie sesión en su servidor Ubuntu y actualícelo si es necesario. Tenga en cuenta que si el kernel se actualiza en este proceso, el servidor debe reiniciarse, así que elija un momento en que sea posible reiniciarlo. Para actualizar el servidor, escriba los siguientes comandos:

sudo apt-get update
sudo apt-get upgrade

Después de ejecutar los comandos, reinicie el servidor si es necesario.
Puede instalar Fail2ban con un solo comando:

sudo apt-get install -y fail2ban

Compruebe la versión instalada:

fail2ban-server --version

Fail2ban está listo para funcionar. Puede iniciar y habilitar el servicio de la siguiente manera:

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

Configuración de la cárcel

Vamos a configurarlo para los intentos de inicio de sesión SSH. En el catálogo encontrarás el archivo. No lo edites. En su lugar, cree un nuevo archivo que anule dicha configuración. La nueva configuración supervisará, usará un filtro, establecerá el puerto SSH en 22 y establecerá el número máximo de intentos en 3. Para ello, ejecute el comando:/etc/fail2banjail.confjail.localjail.conf/var/log/auth.logsshd fail2ban

sudo nano /etc/fail2ban/jail.local

En el nuevo archivo, pegue el siguiente contenido:

[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3

Guárdelo y ciérrelo. Reinicie Fail2ban usando el comando:

sudo systemctl restart fail2ban

En este punto, si alguien intenta iniciar sesión en su servidor Ubuntu a través de SSH y este intento falla 3 veces, ya no podrá iniciar sesión ya que iptables bloqueará la dirección IP.

Prueba y desbloqueo

Puede verificar si la cárcel está funcionando fallando intencionalmente tres intentos de iniciar sesión en el servidor a través de SSH. Después del tercer intento fallido, la conexión se bloqueará. Presione Ctrl+C para salir y, a continuación, intente volver al servidor a través de SSH. Ya no podrá utilizar SSH en este servidor desde la dirección IP que utilizó.

A continuación, puede desbloquear su dirección IP de prueba con el siguiente comando:

sudo fail2ban-client set sshd unbanip ip_address

¿Dónde está la dirección IP prohibida?ip_address

Ahora puedes volver a iniciar sesión.

Módulo mod_evasive

Otra gran utilidad para detectar y bloquear direcciones IP que se utilizan en un ataque de denegación de servicio. El módulo coloca las direcciones IP sospechosas en una lista negra temporal y las almacena allí si continúan comportándose de manera sospechosa.

Debido a su facilidad de configuración y eficiencia, se ha convertido en una de las herramientas favoritas para proteger los sistemas Apache. Si desea proteger su sitio web sin costo alguno, también puede usarlo.

Instalar mod_evasive en Ubuntu

Introduzca el comando:

# apt-get update

A continuación, instale el ayudante de utilidad:

sudo apt-get install apache2-utils

Para instalar el módulo mod_evasive en Ubuntu, ingrese lo siguiente:

# apt-get install libapache2-mod-evasive

Configurar mod_evasive

Como la mayoría de los paquetes de software de Linux, se administra mediante un archivo de configuración.mod_evasive

Ábralo en un editor de texto con el siguiente comando:

sudo nano /etc/apache2/mods-enabled/evasive.conf

Encuentra la entrada:

#DOSEmailNotify you@yourdomain.com

El letrero marca esto como un comentario. Elimínelo y reemplácelo con su dirección de correo electrónico. Use el que usa todo el tiempo: aquí es donde se enviarán las alertas.#you@yourdomain.com

Edite el archivo de registro para que tenga este aspecto:

Guarde y salga, luego reinicie Apache:

sudo systemctl reload apache2

Pruebas mod_evasive

Es hora de comprobar si el módulo funciona correctamente.
Utilice un script. Su guión se encuentra en esta dirección:test.pl

/usr/share/doc/libapache2-mod-evasive/examples/test.pl.

Para ejecutarlo, use este comando:

perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl

El resultado debería verse así:

Opciones y ajustes

DOSSystemCommand

Es posible que haya notado que esta opción se ha marcado como comentario y se ha desactivado. Le permite especificar el comando del sistema que se ejecutará cuando se agregue una dirección IP a la lista negra. Puede usarlo para ejecutar un comando para agregar una dirección IP a su firewall o filtro IP.

DOSHashTableSize

Aumente el valor de los servidores web más ocupados. Esta opción asigna espacio para realizar operaciones de búsqueda. Aumentar el tamaño mejora la velocidad a expensas de la memoria.

DOSPageCount

El número de solicitudes para una sola página, después de lo cual la dirección se pone en la lista negra. En el ejemplo, hay 2, pero este es un valor bastante pequeño (y agresivo). Aumentarlo para reducir el número de falsos positivos.

DOSSiteCount

El número total de solicitudes al mismo sitio en la misma dirección IP. El valor predeterminado es 50. Puede aumentarlo a 100 para reducir el número de falsos positivos.

DOSPageInterval

Número de segundos de DOSPageCount. El valor predeterminado es 1 segundo. Esto significa que si no lo cambia, solicitar 2 páginas en 1 segundo incluirá temporalmente en la lista negra la dirección IP.

DOSSiteInterval

Al igual que DOSPageInterval, determina el número de segundos que supervisa DOSSiteCount. De forma predeterminada, este valor es de 1 segundo, lo que significa que si una sola dirección IP solicita 50 recursos en el mismo sitio web en un segundo, se incluirá temporalmente en la lista negra.

DOSBlockingPeriod

El tiempo durante el cual la dirección IP permanece en la lista negra. El valor predeterminado es 10 segundos, pero puede cambiarlo a cualquier valor que desee.

DOSLogDir

De forma predeterminada, está configurado para escribir registros en. Puede ver estos registros más adelante para evaluar el comportamiento del cliente./var/log/mod_evasive

Direcciones IP blancas

Esta opción no se incluye en el archivo de forma predeterminada.evasive.conf

Abra el archivo para editarlo y agregue la siguiente línea:

DOSWhitelist ваш_IP_адрес

Sustituya la dirección IP que desea incluir en la lista blanca. Solo necesita especificar un registro por fila. Por lo general, la lista se utiliza para clientes de confianza que comparten una gran cantidad de datos con su sitio. Esta herramienta es buena para detectar bots y scripts. Si hay bots o scripts que desea permitir, puede enviarlos.

Asegúrese de guardar y salir del archivo y, a continuación, reinicie el servicio Apache antes de probar cualquiera de estas configuraciones.

Inyección de DNS

El spam de formularios web no solo es común, sino que también es una forma rápida de incluir en la lista negra un dominio como Spamhaus. Para evitar que esto suceda, debe agregar otro módulo a Apache.

En el terminal, escriba:

sudo apt-get -y install libapache2-mod-spamhaus

Una vez completada la instalación, escriba el siguiente comando:

sudo touch /etc/spamhaus.wl

A continuación, abra el archivo (usando su editor de texto favorito) y agregue un bloque al final de su archivo de configuración:/etc/apache2/apache2.confsudo

<IfModule mod_spamhaus.c>
  MS_METHODS POST, PUT, OPTIONS, CONNECT
  MS_WhiteList /etc/spamhaus.wl
  MS_CacheSize 256
</IfModule>

Guarde los archivos y, a continuación, reinicie Apache para que el nuevo módulo surta efecto.apache2.conf

Slowloris

Apache tiene un módulo para prevenir tales ataques DOS. Así es como funciona. Abra una ventana de terminal. Introduzca el comando:

sudo apt-get -y install libapache2-mod-qos

Una vez completada la instalación, verifique la configuración para asegurarse de que se ajuste perfectamente a sus necesidades. Después de configurar el módulo (si es necesario), reinicie Apache./etc/apache2/mods-available/qos.conf

Protecciones adicionales

Ocultar versión del servidor

Esta es una de las primeras consideraciones, ya que no desea mostrar qué versión del servidor web está utilizando. Exponerlo significa que estás ayudando al hacker a acelerar el proceso de inteligencia.
Vaya a la carpeta:

$ Web_Server/conf

Cambiar usando el editor. Agregue la siguiente directiva y guarde:httpd.confhttpd.conf

ServerTokens Prod
ServerSignature Off

Reinicie Apache.
Quite la información de versión de la página.
cambie el encabezado solo a working, es decir, Apache.ServerSignatureServerTokens

Protección contra ataques de clickjacking

Este tipo de ataque permite a un atacante hacer clic en un sitio víctima en nombre de un visitante legítimo.

Para proteger su servidor web, debe usar el encabezado «X-FRAME-OPTIONS» Puede
hacerlo editando el archivo.apache2.conf

sudo nano /etc/apache2/apache2.conf

Agregue la siguiente línea dentro:Directory /var/www/html/

Header always append X-Frame-Options SAMEORIGIN

Guarde el archivo y reinicie Apache.

sudo /etc/init.d/apache2 restart

Ahora intente abrir un navegador web para acceder al servidor web. Compruebe los encabezados de respuesta HTTP en el firebug. Debería ver X-Frame-Options.

Protección contra ataques XSS

XSS (Cross-Site Scripting) es uno de los ataques más comunes a nivel de aplicación.

Puede protegerse de él editando el archivo de configuración de Apache.

sudo nano /etc/apache2/apache2.conf

Agregue la siguiente línea dentro:Directory /var/www/html/

Header set X-XSS-Protection "1; mode=block"

Conclusión

Hemos cubierto la instalación y configuración, así como todas las formas más importantes de proteger su servidor Apache, y ahora puede comenzar a aprender completamente cómo funciona.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *