Tutorial

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

NginxSecurityUbuntu 18.04

El autor seleccionó Electronic Frontier Foundation para recibir una donación como parte del programa Write for DOnations.

Introducción

Cloudflare es un servicio que se encuentra entre el visitante y el servidor del propietario del sitio web, actuando 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 servidor de nombres de dominio distribuidos.

Nginx es un servidor web popular responsable de alojar algunos de los sitios de mayor tamaño y mayor tráfico en Internet. Es común que las organizaciones sirvan a sitios web con Nginx y utilicen Cloudflare como un proveedor de CDN y DNS.

En este tutorial, protegerá su sitio web servido por Nginx con un certificado Origin CA de Cloudflare y a continuación configurará Nginx para usar solicitudes de incorporación de cambios autenticadas. Las ventajas de usar esta configuración son que se beneficia de la CDN de Cloudflare y de la rápida resolución DNS al tiempo que garantiza que todas las conexiones pasen a través de Cloudflare. Esto evita que cualquier solicitud maliciosa llegue a su servidor.

Requisitos previos

Para completar este tutorial, necesitará lo siguiente:

Paso 1: Generar un certificado TLS de Origin CA

El Cloudflare Origin CA le permite generar un certificado TLS gratuito firmado por Cloudflare para instalarlo en su servidor Nginx. Mediante 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 Cloudflare en un navegador web. Seleccione el dominio que desea proteger y vaya a la sección SSL/TLS de su panel de control de Cloudflare. Desde ahí, vaya a la pestaña Servidor de origen y haga clic en el botón Crear certificado:

Cree la opción de certificado en el panel de control de Cloudflare

Deje la opción predeterminada de Permitir que Cloudflare genere una clave privada y una CSR seleccionada.

Opciones de GUI de Origin CA

Haga clic en Siguiente y verá un 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 mostrará de nuevo, de forma que debe copiarla a su servidor antes de hacer clic en Ok.

Diálogo que muestra el certificado de origen y la clave privada

Usaremos el directorio /etc/ssl en el servidor para guardar el certificado de origen y los archivos de claves privados. 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.

A continuación, en su servidor, abra /etc/ssl/cert.pem en su editor de texto preferido:

  • sudo nano /etc/ssl/cert.pem

Añada el contenido del certificado al archivo. Guarde y salga del editor.

A continuación, 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, guárdelo y salga del editor.

Nota: A veces, cuando copie el certificado y la clave desde el panel de control de Cloudflare y lo pegue en los archivos pertinentes del servidor, se insertan líneas en blanco. Nginx tratará esos certificados y claves como no válidos, de forma que asegúrese de que no haya líneas en blanco en sus archivos.

Advertencia: Cloudflare solo confía en el certificado de Origin CA de Cloudflare y, por lo tanto, solo debería usar los servidores de origen que están activamente conectados a Cloudflare. Si en algún momento detiene o deshabilita Cloudflare, su certificado Origin CA arrojará un error de certificado no fiable.

Ahora que copió los archivos de la clave y del certificado a su servidor, deberá actualizar la configuración de Nginx para usarlos.

Paso 2: Instalar el certificado Origin CA en Nginx

En la sección anterior, generó un certificado de origen y una clave privada usando el panel de control de Cloudflare y guardó los archivos en su servidor. Ahora actualizará la configuración 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.

Primero, asegúrese de que UFW permitirá el tráfico HTTPS. Habilite Nginx Full, que abrirá el puerto 80 (HTTP) y el puerto 443 (HTTPS):

  • sudo ufw allow 'Nginx Full'

Ahora vuelva a cargar UFW:

  • sudo ufw reload

Por último, compruebe que se permiten sus nuevas reglas y que UFW está activo:

  • sudo ufw status

Verá un resultado similar a este:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

Ahora está listo para ajustar su bloque de servidor 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 Nginx para su dominio:

  • sudo nano /etc/nginx/sites-available/your_domain

El archivo debería tener este aspecto:

/etc/nginx/sites-available/your_domain
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 Nginx para hacer lo siguiente:

  • Escuche el puerto 80 y redireccione todas las solicitudes para usar https.
  • Escuche el puerto 443 y utilice el certificado de origen y la clave privada que añadió en la sección anterior.

Modifique el archivo de forma que se vea lo siguiente:

/etc/nginx/sites-available/your_domain
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, compruebe que no haya errores de sintaxis en ninguno de sus archivos de configuración Nginx:

  • sudo nginx -t

Si no se encontraron problemas, reinicie Nginx para habilitar sus cambios:

  • sudo systemctl restart nginx

Ahora vaya a la sección SSL/TLS del panel de control de Cloudflare, vaya a la pestaña Vista general y cambie el modo de cifrado SSL/TLS a Full (strict). Esto informa a Cloudflare para que cifre siempre la conexión entre Cloudflare y su servidor Nginx de origen.

Habilite el modo SSL Full(strict) en el panel de control de Cloudflare

Ahora visite su sitio web en https://your_domain para verificar que se haya configurado correctamente. Verá su página de inicio y el navegador informará de que el sitio es seguro.

En la siguiente sección, configurará las incorporaciones de cambios de origen autenticadas para verificar que su servidor de origen de hecho está hablando con Cloudflare y no con otro servidor. Al hacerlo, Nginx se configurará para solo aceptar solicitudes que utilicen un certificado de cliente válido desde Cloudflare. Se eliminarán todas las solicitudes que no hayan pasado a través de Cloudflare.

Paso 3: Configurar las incorporaciones de cambios de origen autenticadas

El certificado Origin CA ayudará a Cloudflare a verificar que está hablando con el servidor de origen correcto. Este paso utilizará Autenticación de cliente TLS para verificar que su servidor Nginx de origen está hablando con Cloudflare.

En una conexión TLS autenticada por el cliente, ambos lados proporcionan un certificado para verificarlo. El servidor de origen está configurado para solo aceptar solicitudes que utilizan un certificado de cliente válido desde Cloudflare. Las solicitudes que no hayan pasado a través de Cloudflare se eliminará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 los certificados firmados por una CA con el siguiente certificado:

-----BEGIN CERTIFICATE-----
MIIGCjCCA/KgAwIBAgIIV5G6lVbCLmEwDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNV
BAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmln
aW4gUHVsbDEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZv
cm5pYTEjMCEGA1UEAxMab3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwHhcNMTkx
MDEwMTg0NTAwWhcNMjkxMTAxMTcwMDAwWjCBkDELMAkGA1UEBhMCVVMxGTAXBgNV
BAoTEENsb3VkRmxhcmUsIEluYy4xFDASBgNVBAsTC09yaWdpbiBQdWxsMRYwFAYD
VQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQD
ExpvcmlnaW4tcHVsbC5jbG91ZGZsYXJlLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAN2y2zojYfl0bKfhp0AJBFeV+jQqbCw3sHmvEPwLmqDLqynI
42tZXR5y914ZB9ZrwbL/K5O46exd/LujJnV2b3dzcx5rtiQzso0xzljqbnbQT20e
ihx/WrF4OkZKydZzsdaJsWAPuplDH5P7J82q3re88jQdgE5hqjqFZ3clCG7lxoBw
hLaazm3NJJlUfzdk97ouRvnFGAuXd5cQVx8jYOOeU60sWqmMe4QHdOvpqB91bJoY
QSKVFjUgHeTpN8tNpKJfb9LIn3pun3bC9NKNHtRKMNX3Kl/sAPq7q/AlndvA2Kw3
Dkum2mHQUGdzVHqcOgea9BGjLK2h7SuX93zTWL02u799dr6Xkrad/WShHchfjjRn
aL35niJUDr02YJtPgxWObsrfOU63B8juLUphW/4BOjjJyAG5l9j1//aUGEi/sEe5
lqVv0P78QrxoxR+MMXiJwQab5FB8TG/ac6mRHgF9CmkX90uaRh+OC07XjTdfSKGR
PpM9hB2ZhLol/nf8qmoLdoD5HvODZuKu2+muKeVHXgw2/A6wM7OwrinxZiyBk5Hh
CvaADH7PZpU6z/zv5NU5HSvXiKtCzFuDu4/Zfi34RfHXeCUfHAb4KfNRXJwMsxUa
+4ZpSAX2G6RnGU5meuXpU5/V+DQJp/e69XyyY6RXDoMywaEFlIlXBqjRRA2pAgMB
AAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1Ud
DgQWBBRDWUsraYuA4REzalfNVzjann3F6zAfBgNVHSMEGDAWgBRDWUsraYuA4REz
alfNVzjann3F6zANBgkqhkiG9w0BAQ0FAAOCAgEAkQ+T9nqcSlAuW/90DeYmQOW1
QhqOor5psBEGvxbNGV2hdLJY8h6QUq48BCevcMChg/L1CkznBNI40i3/6heDn3IS
zVEwXKf34pPFCACWVMZxbQjkNRTiH8iRur9EsaNQ5oXCPJkhwg2+IFyoPAAYURoX
VcI9SCDUa45clmYHJ/XYwV1icGVI8/9b2JUqklnOTa5tugwIUi5sTfipNcJXHhgz
6BKYDl0/UP0lLKbsUETXeTGDiDpxZYIgbcFrRDDkHC6BSvdWVEiH5b9mH2BON60z
0O0j8EEKTwi9jnafVtZQXP/D8yoVowdFDjXcKkOPF/1gIh9qrFR6GdoPVgB3SkLc
5ulBqZaCHm563jsvWb/kXJnlFxW+1bsO9BDD6DweBcGdNurgmH625wBXksSdD7y/
fakk8DagjbjKShYlPEFOAqEcliwjF45eabL0t27MJV61O/jHzHL3dknXeE4BDa2j
bA+JbyJeUMtU7KMsxvx82RmhqBEJJDBCJ3scVptvhDMRrtqDBW5JShxoAOcpFQGm
iYWicn46nPDjgTU0bX1ZPpTpryXbvciVL5RkVBuyX2ntcOLDPlZWgxZCBp96x07F
AnOzKgZk4RzZPNAxCXERVxajn/FLcOhglVAKo5H0ac+AitlQ0ip55D2/mf8o72tM
fVQ6VpyjEXdiIXWUq/o=
-----END CERTIFICATE-----

También puede descargar el certificado directamente desde Cloudflare aquí.

Copie este certificado.

A continuación, cree el archivo /etc/ssl/cloudflare.crt para guardar el certificado de Cloudflare:

  • sudo nano /etc/ssl/cloudflare.crt

Añada el certificado al archivo. Guarde el archivo y cierre el editor.

Ahora actualice su configuración Nginx para usar incorporaciones de cambios de origen autenticadas de TLS. Abra el archivo de configuración para su dominio:

  • sudo nano /etc/nginx/sites-available/your_domain

Añada las directivas ssl_client_certificate y ssl_verify_client como se muestra en el siguiente ejemplo:

/etc/nginx/sites-available/your_domain
. . .

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, compruebe que no haya errores de sintaxis en su configuración Nginx:

  • sudo nginx -t

Si no se encontraron problemas, reinicie Nginx para habilitar sus cambios:

  • sudo systemctl restart nginx

Por último, para habilitar las incorporaciones de cambios autenticadas, abra la sección SSL/TLS en el panel de control de Cloudflare, vaya a la pestaña Servidor de origen y cambie la opción Incorporaciones de cambios de origen autenticadas.

Habilite las incorporaciones de cambios de origen autenticadas

Ahora visite su sitio web en https://your_domain para verificar que se haya configurado correctamente. Como antes, verá su página de inicio.

Para verificar que su servidor solo aceptará las solicitudes firmadas por la CA de Cloudflare, cambie la opción Incorporaciones de cambios de origen autenticadas para deshabilitarlo y vuelva a cargar su sitio web. Debería obtener el siguiente mensaje de error:

Mensaje de error

Su servidor de origen crea un error si la CA de Cloudflare no firma una solicitud.

Nota: La mayoría de los navegadores almacenarán solicitudes de caché, de forma que para ver el cambio anterior puede usar el modo de navegación de Incógnito/privado en su navegador. Para evitar que Cloudflare almacene las solicitudes de caché mientras configura su sitio web, vaya a Visión general en el panel de control de Cloudflare y cambie el modo de desarrollo.

Ahora que sabe que funciona correctamente, vuelva a la sección SSL/TLS en el panel de control de Cloudflare, vaya a la pestaña Servidor de origen y cambie la opción Incorporaciones de cambios de origen autenticadas para habilitarlo.

Conclusión

En este tutorial, aseguró su sitio web con Nginx cifrando el tráfico entre Cloudflare y el servidor Nginx usando un certificado Origin CA de Cloudflare. A continuación, configuró las incorporaciones de cambios de origen autenticadas en el servidor Nginx para asegurarse de que solo acepta solicitudes de los servidores de Cloudflare, evitando a cualquier otra persona conectarse directamente al servidor Nginx.

Creative Commons License