Saltar al contenido

CyberSkills – Tutoriales de Seguridad y Servidores

Configuración de Servidor Web Seguro en Ubuntu Server 24.04

Tutorial: Configuración de un Servidor Web Seguro (Nginx/Apache con SSL/TLS)

Este tutorial completo cubre la configuración de un servidor web seguro utilizando Nginx o Apache en Ubuntu Server 24.04, incluyendo la implementación de SSL/TLS con certificados Let’s Encrypt para cifrar el tráfico y garantizar la máxima seguridad.


1. Elección del Servidor Web (Nginx vs Apache)

Ambos son excelentes opciones con características distintivas:

  • Nginx: Conocido por su alto rendimiento y eficiencia como proxy inverso y servidor de contenido estático
  • Apache: Muy flexible y ampliamente utilizado, con una gran cantidad de módulos disponibles

Nota importante: Para este tutorial cubriremos ambos servidores, pero solo debes instalar uno según tus necesidades.

2. Instalación del Servidor Web

Opción A: Instalar Nginx

sudo apt update
sudo apt install nginx

Después de la instalación, Nginx debería iniciarse automáticamente. Verifica su estado:

sudo systemctl status nginx

Opción B: Instalar Apache

sudo apt update
sudo apt install apache2

Después de la instalación, Apache debería iniciarse automáticamente. Verifica su estado:

sudo systemctl status apache2

3. Configuración Básica del Firewall (nftables)

Antes de habilitar el servidor web, asegúrate de que tu firewall nftables permita el tráfico HTTP (puerto 80) y HTTPS (puerto 443):

# Permitir tráfico HTTP
sudo nft add rule inet filter input tcp dport 80 ct state new,established counter accept

# Permitir tráfico HTTPS
sudo nft add rule inet filter input tcp dport 443 ct state new,established counter accept

# Guardar las reglas
sudo nft list ruleset > /etc/nftables.conf

Importante: Si no tienes nftables configurado, consulta nuestro tutorial específico de nftables para una configuración completa del firewall.

4. Configuración del Virtual Host

Opción A: Configuración de Nginx

Crea un nuevo archivo de configuración para tu sitio web. Reemplaza tudominio.com con tu dominio real:

sudo nano /etc/nginx/sites-available/tudominio.com

Añade el siguiente contenido (configuración inicial para HTTP):

server {
    listen 80;
    listen [::]:80;
    server_name tudominio.com www.tudominio.com;

    root /var/www/tudominio.com;
    index index.html index.htm index.nginx-debian.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Crea el directorio raíz de tu sitio web:

sudo mkdir -p /var/www/tudominio.com
sudo chown -R $USER:$USER /var/www/tudominio.com
sudo chmod -R 755 /var/www/tudominio.com

Crea un archivo index.html de prueba:

sudo nano /var/www/tudominio.com/index.html

Con el siguiente contenido:

<!DOCTYPE html>
<html>
<head>
    <title>¡Hola desde Nginx!</title>
</head>
<body>
    <h1>¡Tu servidor Nginx está funcionando!</h1>
</body>
</html>

Habilita el sitio y prueba la configuración:

sudo ln -s /etc/nginx/sites-available/tudominio.com /etc/nginx/sites-enabled/
sudo nginx -t

Si la prueba es exitosa, reinicia Nginx:

sudo systemctl restart nginx

Opción B: Configuración de Apache

Crea un nuevo archivo de configuración para tu sitio web:

sudo nano /etc/apache2/sites-available/tudominio.com.conf

Añade el siguiente contenido:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName tudominio.com
    ServerAlias www.tudominio.com
    DocumentRoot /var/www/tudominio.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Crea el directorio raíz y el archivo de prueba (igual que en Nginx):

sudo mkdir -p /var/www/tudominio.com
sudo chown -R $USER:$USER /var/www/tudominio.com
sudo chmod -R 755 /var/www/tudominio.com
sudo nano /var/www/tudominio.com/index.html
<!DOCTYPE html>
<html>
<head>
    <title>¡Hola desde Apache!</title>
</head>
<body>
    <h1>¡Tu servidor Apache está funcionando!</h1>
</body>
</html>

Habilita el sitio y reinicia Apache:

sudo a2ensite tudominio.com.conf
sudo systemctl restart apache2

5. Instalación de Certbot (Let’s Encrypt)

Certbot es la herramienta oficial recomendada para obtener y renovar certificados SSL/TLS de Let’s Encrypt:

sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

6. Obtención e Instalación del Certificado SSL/TLS

Para Nginx

sudo certbot --nginx -d tudominio.com -d www.tudominio.com

Para Apache

sudo certbot --apache -d tudominio.com -d www.tudominio.com

Proceso automático: Certbot te guiará a través del proceso, solicitando tu email y aceptación de términos. Recomendamos redirigir todo el tráfico HTTP a HTTPS.

7. Verificación de la Renovación Automática

Los certificados de Let’s Encrypt son válidos por 90 días. Certbot instala automáticamente un cron job para renovarlos. Prueba el proceso:

sudo certbot renew --dry-run

Si no hay errores, la renovación automática está configurada correctamente.

8. Pruebas de Seguridad

Una vez que tu sitio esté en línea con HTTPS, utiliza estas herramientas para verificar la seguridad:

9. Hardening Adicional del Servidor Web

Para Nginx

Edita la configuración principal de Nginx:

sudo nano /etc/nginx/nginx.conf

Añade estas directivas de seguridad en la sección http:

# Protocolos SSL/TLS seguros
ssl_protocols TLSv1.2 TLSv1.3;

# Cifrados seguros
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;

# Ocultar versión de Nginx
server_tokens off;

# Headers de seguridad
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;

Para HSTS, añade en tu bloque server con SSL:

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

Para Apache

Habilita los módulos de seguridad necesarios:

sudo a2enmod headers
sudo a2enmod ssl
sudo a2enmod rewrite

Edita la configuración SSL:

sudo nano /etc/apache2/mods-available/ssl.conf

Añade estas directivas de seguridad:

# Protocolos SSL/TLS seguros
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

# Cifrados seguros
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder on

# Headers de seguridad
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "no-referrer-when-downgrade"
Header always set Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'"

# HSTS (en VirtualHost con SSL)
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

Reinicia el servidor después de los cambios:

# Para Nginx
sudo systemctl restart nginx

# Para Apache
sudo systemctl restart apache2

10. Lista de Verificación Final

  • Servidor web instalado y funcionando
  • Firewall configurado (puertos 80 y 443 abiertos)
  • Virtual Host configurado
  • Certificado SSL/TLS instalado
  • Renovación automática configurada
  • Headers de seguridad implementados
  • Pruebas de seguridad realizadas

¡Felicitaciones! Has configurado exitosamente un servidor web seguro con SSL/TLS en Ubuntu Server 24.04. Tu sitio web ahora cuenta con cifrado de extremo a extremo y las mejores prácticas de seguridad implementadas.


Tutoriales relacionados:

Únete a la conversación

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