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-available
000-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.
DocumentRoot
Se 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/html
index.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.VirtualHost
ErrorLog
CustomLog
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:ServerName
example.conf
a2ensite
/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/private
ssl-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.SSLCertificateFile
SSLCertificateKeyFile
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/log
iptables
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/fail2ban
jail.conf
jail.local
jail.conf
/var/log/auth.log
sshd 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.conf
sudo
<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.conf
httpd.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.ServerSignature
ServerTokens
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.