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:
- SSL Labs Server Test – Análisis completo de SSL/TLS
- Security Headers – Verificación de headers de seguridad
- Mozilla Observatory – Análisis integral de seguridad web
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:
