El autor seleccionó a la Electronic Frontier Foundation para recibir una donación como parte del programa Write for DOnations.
Tabla de contenidos
ToggleIntroducció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 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 16.04 configurado siguiendo la guía de configuración inicial del servidor Ubuntu 16.04, incluido un usuario sudo no root y un firewall.
- Nginx instalado en su servidor, como se muestra en Cómo instalar Nginx en Ubuntu 16.04.
- Una cuenta de Cloudflare.
- Un dominio registrado agregado a tu cuenta de Cloudflare que apunta a tu servidor Nginx. Sigue Cómo mitigar ataques DDoS contra tu sitio web con CloudFlare para configurarlo.
- Un bloque de servidor Nginx configurado para su dominio, lo cual puede hacer siguiendo Cómo configurar bloques de servidor Nginx (hosts virtuales) en Ubuntu 16.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, dirígete a la sección Criptografía de tu panel de control de Cloudflare. Desde allí, haz clic en el botón Crear certificado en la sección Certificados de origen :
Deje la opción predeterminada de Permitir que CloudFlare genere una clave privada y una CSR seleccionada.
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.
Usaremos el /etc/ssl/certs
directorio del servidor para guardar el certificado de origen. El /etc/ssl/private
directorio contendrá el archivo de clave privada. Ambas carpetas ya existen 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/certs/cert.pem
para editar:
- sudo nano /etc/ssl/certs/cert.pem
Pegue el contenido del certificado en el archivo. Luego, guárdelo y salga del editor.
Luego, vuelva a su navegador y copie el contenido de la clave privada . Abra el archivo /etc/ssl/private/key.pem
para editarlo:
- sudo nano /etc/ssl/private/key.pem
Pegue la clave en el archivo, guarde el archivo y salga del editor.
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.
Nginx crea un bloque de servidor predeterminado durante la instalación. Elimínelo si 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/example.com
El archivo debería verse así:
ejemplo.com^“/etc/nginx/sites-available/^ejemplo.com^
server { listen 80; listen [::]:80; root /var/www/example.com/html; index index.html index.htm index.nginx-debian.html; server_name example.com www.example.com; 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:
ejemplo.com^“/etc/nginx/sites-available/^ejemplo.com^
server { listen 80; listen [::]:80; server_name example.com www.example.com; return 302 https://$server_name$request_uri;}server { # SSL configuration listen 443 ssl http2; listen [::]:443 ssl http2; ssl on; ssl_certificate /etc/ssl/certs/cert.pem; ssl_certificate_key /etc/ssl/private/key.pem; server_name example.com www.example.com; root /var/www/example.com/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 Criptografía del panel de control de Cloudflare y cambie el modo SSL a Completo . 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://example.com
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 y se descartarán 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. Pero, ¿cómo puede su servidor Nginx de origen verificar que realmente se está comunicando con Cloudflare? Introduzca la autenticación de cliente TLS.
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/certs/cloudflare.crt
archivo que almacenará el certificado de Cloudflare:
- sudo nano /etc/ssl/certs/cloudflare.crt
Pegue el certificado en el 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/example.com
Agregue las directivas ssl_client_certificate
and ssl_verify_client
como se muestra en el siguiente ejemplo:
ejemplo.com^“/etc/nginx/sites-available/^ejemplo.com^
. . .server { # SSL configuration listen 443 ssl http2; listen [::]:443 ssl http2; ssl on; ssl_certificate /etc/ssl/certs/cert.pem; ssl_certificate_key /etc/ssl/private/key.pem; ssl_client_certificate /etc/ssl/certs/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 los pulls autenticados, abra la sección Crypto en el panel de Cloudflare y active la opción Pulls de origen autenticado .
Ahora visite su sitio web en para verificar que se haya configurado correctamente. Como antes, verá su página de inicio.https://example.com
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.
Ahora que sabe que funciona correctamente, regrese a la sección Criptografía en el panel de Cloudflare y active la opción Extracción de origen autenticado 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.