Cómo alojar un sitio web con Cloudflare y Nginx en Ubuntu 18.04

El autor seleccionó a la Electronic Frontier Foundation para recibir una donación como parte del programa Write for DOnations.
Introducción
Cloudflare es un servicio que se ubica entre el visitante y el servidor del propietario del sitio web y actúa como un proxy inverso para los sitios web. Cloudflare proporciona una red de distribución de contenido (CDN), así como servicios de mitigación de DDoS y de servidores de nombres de dominio distribuidos.
Nginx es un servidor web popular que aloja algunos de los sitios más grandes y con mayor tráfico de Internet. Es común que las organizaciones brinden servicios a sitios web con Nginx y utilicen Cloudflare como proveedor de CDN y DNS.
En este tutorial, protegerá su sitio web servido por Nginx con un certificado de CA de origen de Cloudflare y luego configurará Nginx para usar solicitudes de extracción autenticadas. Las ventajas de usar esta configuración son que se beneficia de la CDN de Cloudflare y la resolución rápida de DNS, al tiempo que garantiza que todas las conexiones pasen por Cloudflare. Esto evita que cualquier solicitud maliciosa llegue a su servidor.
Prerrequisitos
Para completar este tutorial, necesitarás lo siguiente:
- Un servidor Ubuntu 18.04 configurado siguiendo la guía de configuración inicial del servidor Ubuntu 18.04, incluido un
sudo
usuario no root y un firewall. - Nginx instalado en tu servidor. Puedes seguir nuestra guía sobre cómo instalar Nginx en Ubuntu 18.04.
- Una cuenta de Cloudflare.
- Un dominio registrado agregado a su cuenta de Cloudflare que apunta a su servidor Nginx. Nuestra guía sobre cómo mitigar los ataques DDoS contra su sitio web con Cloudflare puede ayudarlo a configurarlo. Nuestra introducción a la terminología, los componentes y los conceptos de DNS también puede brindarle ayuda.
- Un bloque de servidor Nginx configurado para su dominio, lo cual puede hacer siguiendo el Paso 5 de Cómo instalar Nginx en Ubuntu 18.04.
Paso 1: Generar un certificado TLS de CA de origen
La CA de origen de Cloudflare le permite generar un certificado TLS gratuito firmado por Cloudflare para instalarlo en su servidor Nginx. Al usar el certificado TLS generado por Cloudflare, puede proteger la conexión entre los servidores de Cloudflare y su servidor Nginx.
Para generar un certificado con Origin CA, inicie sesión en su cuenta de Clouflare en un navegador web. Seleccione el dominio que desea proteger y navegue hasta la sección SSL/TLS de su panel de control de Cloudflare. Desde allí, navegue hasta la pestaña Servidor de origen y haga clic en el botón Crear certificado :
Deje seleccionada la opción predeterminada de Permitir que Cloudflare genere una clave privada y una CSR .
Haga clic en Siguiente y verá un cuadro de diálogo con el Certificado de origen y la clave privada . Debe transferir tanto el certificado de origen como la clave privada desde Cloudflare a su servidor. Por razones de seguridad, la información de la clave privada no se volverá a mostrar, así que copie la clave a su servidor antes de hacer clic en Aceptar .
Usaremos el /etc/ssl
directorio del servidor para guardar el certificado de origen y los archivos de clave privada. La carpeta ya existe en el servidor.
Primero, copie el contenido del Certificado de Origen que se muestra en el cuadro de diálogo de su navegador.
Luego, en su servidor, abra /etc/ssl/cert.pem
en su editor de texto preferido:
- sudo nano /etc/ssl/cert.pem
Agregue el contenido del certificado al archivo. Luego, guarde y salga del editor.
Luego, vuelva a su navegador y copie el contenido de la clave privada . Abra el archivo /etc/ssl/key.pem
para editarlo:
- sudo nano /etc/ssl/key.pem
Pegue la clave privada en el archivo, guarde el archivo y salga del editor.
Nota: A veces, cuando copia el certificado y la clave desde el panel de Cloudflare y los pega en los archivos correspondientes en el servidor, se insertan líneas en blanco. Nginx tratará dichos certificados y claves como no válidos, por lo que debe asegurarse de que no haya líneas en blanco en sus archivos.
Advertencia: el certificado de CA de origen de Cloudflare solo es de confianza para Cloudflare y, por lo tanto, solo deben usarlo los servidores de origen que estén conectados activamente a Cloudflare. Si en algún momento pausa o deshabilita Cloudflare, su certificado de CA de origen generará un error de certificado no confiable.
Ahora que ha copiado los archivos de clave y certificado a su servidor, necesita actualizar la configuración de Nginx para usarlos.
Paso 2: Instalación del certificado de CA de origen en Nginx
En la sección anterior, generó un certificado de origen y una clave privada mediante el panel de control de Cloudflare y guardó los archivos en su servidor. Ahora, actualizará la configuración de Nginx para su sitio para usar el certificado de origen y la clave privada para proteger la conexión entre los servidores de Cloudflare y su servidor.
En primer lugar, asegúrese de que UFW permita el tráfico HTTPS. Habilite Nginx Full
, lo que abrirá tanto el puerto 80
(HTTP) como el puerto 443
(HTTPS):
- sudo ufw allow 'Nginx Full'
Ahora recarga UFW:
- sudo ufw reload
Por último, verifique que sus nuevas reglas estén permitidas y que UFW esté activo:
- sudo ufw status
Verás un resultado como este:
OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereNginx Full ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Nginx Full (v6) ALLOW Anywhere (v6)
Ahora está listo para ajustar el bloque de servidor de Nginx. Nginx crea un bloque de servidor predeterminado durante la instalación. Elimínelo si aún existe, ya que ya ha configurado un bloque de servidor personalizado para su dominio:
- sudo rm /etc/nginx/sites-enabled/default
A continuación, abra el archivo de configuración de Nginx para su dominio:
- sudo nano /etc/nginx/sites-available/your_domain
El archivo debería verse así:
/etc/nginx/sites-available/su_dominio
server { listen 80; listen [::]:80; root /var/www/your_domain/html; index index.html index.htm index.nginx-debian.html; server_name your_domain www.your_domain; location / { try_files $uri $uri/ =404; }}
Modificaremos el archivo de configuración de Nginx para hacer lo siguiente:
- Escuche en el puerto
80
y redirija todas las solicitudes para usarhttps
. - Escuche en el puerto
443
y use el certificado de origen y la clave privada que agregó en la sección anterior.
Modifique el archivo para que se parezca al siguiente:
/etc/nginx/sites-available/su_dominio
server { listen 80; listen [::]:80; server_name your_domain www.your_domain; return 302 https://$server_name$request_uri;}server { # SSL configuration listen 443 ssl http2; listen [::]:443 ssl http2; ssl on; ssl_certificate /etc/ssl/cert.pem; ssl_certificate_key /etc/ssl/key.pem; server_name your_domain www.your_domain; root /var/www/your_domain/html; index index.html index.htm index.nginx-debian.html; location / { try_files $uri $uri/ =404; }}
Guarde el archivo y salga del editor.
A continuación, realice una prueba para asegurarse de que no haya errores de sintaxis en ninguno de los archivos de configuración de Nginx:
- sudo nginx -t
Si no se encuentran problemas, reinicie Nginx para habilitar los cambios:
- sudo systemctl restart nginx
Ahora, vaya a la sección SSL/TLS del panel de control de Cloudflare , navegue hasta la pestaña Descripción general y cambie el modo de cifrado SSL/TLS a Completo (estricto) . Esto le indica a Cloudflare que siempre debe cifrar la conexión entre Cloudflare y su servidor Nginx de origen.
Ahora visite su sitio web en para verificar que esté configurado correctamente. Verá su página de inicio y el navegador le informará que el sitio es seguro.https://your_domain
En la siguiente sección, configurará las solicitudes de origen autenticadas para verificar que su servidor de origen se comunique con Cloudflare y no con otro servidor. Al hacerlo, Nginx se configurará para que solo acepte solicitudes que utilicen un certificado de cliente válido de Cloudflare; se descartarán todas las solicitudes que no hayan pasado por Cloudflare.
Paso 3: Configuración de extracciones de origen autenticado
El certificado de CA de origen ayudará a Cloudflare a verificar que se está comunicando con el servidor de origen correcto. Este paso utilizará la autenticación de cliente TLS para verificar que su servidor Nginx de origen se está comunicando con Cloudflare.
En un protocolo de enlace TLS autenticado por el cliente, ambas partes proporcionan un certificado para su verificación. El servidor de origen está configurado para aceptar únicamente solicitudes que utilicen un certificado de cliente válido de Cloudflare. Las solicitudes que no hayan pasado por Cloudflare se descartarán, ya que no tendrán el certificado de Cloudflare. Esto significa que los atacantes no pueden eludir las medidas de seguridad de Cloudflare y conectarse directamente a su servidor Nginx.
Cloudflare presenta certificados firmados por una CA con el siguiente certificado:
-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----
También puedes descargar el certificado directamente desde Cloudflare aquí.
Copiar este certificado.
A continuación, crea el /etc/ssl/cloudflare.crt
archivo que almacenará el certificado de Cloudflare:
- sudo nano /etc/ssl/cloudflare.crt
Agregue el certificado al archivo. Luego guarde el archivo y salga del editor.
Ahora actualice su configuración de Nginx para utilizar pulls de origen autenticados por TLS. Abra el archivo de configuración de su dominio:
- sudo nano /etc/nginx/sites-available/your_domain
Agregue las directivas ssl_client_certificate
and ssl_verify_client
como se muestra en el siguiente ejemplo:
/etc/nginx/sites-available/su_dominio
. . .server { # SSL configuration listen 443 ssl http2; listen [::]:443 ssl http2; ssl on; ssl_certificate /etc/ssl/cert.pem; ssl_certificate_key /etc/ssl/key.pem; ssl_client_certificate /etc/ssl/cloudflare.crt; ssl_verify_client on; . . .
Guarde el archivo y salga del editor.
A continuación, realice una prueba para asegurarse de que no haya errores de sintaxis en su configuración de Nginx:
- sudo nginx -t
Si no se encuentran problemas, reinicie Nginx para habilitar los cambios:
- sudo systemctl restart nginx
Por último, para habilitar las extracciones autenticadas, abra la sección SSL/TLS en el panel de Cloudflare, navegue hasta la pestaña Servidor de origen y active la opción Extracciones de origen autenticadas .
Ahora visite su sitio web en para verificar que se haya configurado correctamente. Como antes, verá su página de inicio.https://your_domain
Para verificar que su servidor solo acepte solicitudes firmadas por la autoridad de certificación de Cloudflare, desactive la opción Authenticated Origin Pulls y vuelva a cargar su sitio web. Debería recibir el siguiente mensaje de error:
Su servidor de origen genera un error si una solicitud no está firmada por la CA de Cloudflare.
Nota: la mayoría de los navegadores almacenan en caché las solicitudes, por lo que para ver el cambio anterior puede utilizar el modo de navegación privada o de incógnito en su navegador. Para evitar que Cloudflare almacene en caché las solicitudes mientras configura su sitio web, navegue hasta Descripción general en el panel de control de Cloudflare y active el Modo de desarrollo .
Ahora que sabe que funciona correctamente, regrese a la sección SSL/TLS en el panel de Cloudflare, navegue a la pestaña Servidor de origen y active la opción Extracciones de origen autenticadas nuevamente para habilitarla.
Conclusión
En este tutorial, protegiste tu sitio web con tecnología Nginx cifrando el tráfico entre Cloudflare y el servidor Nginx con un certificado de CA de origen de Cloudflare. Luego, configuraste las solicitudes de extracción de origen autenticadas en el servidor Nginx para garantizar que solo acepte solicitudes de los servidores de Cloudflare, lo que evita que cualquier otra persona se conecte directamente al servidor Nginx.
Deja una respuesta