/ seguridad

Asegurar Nginx con Let's Encrypt en Ubuntu 16.04

Pre-requisitos

Para poder seguir con este tutorial debereas tener lo siguiente:

  • Servidor Ubuntu 16.04 con su respectiva configuración inicial.
  • Un nombre de dominio registrado. En este tutorial utilizaremos el dominio ejemplo.com, sin embargo puedes comprar un nombre de dominio en Namecheap, obtener uno gratuito en Freenom o usar l registrar de tu elección.
  • Tener dos registros DNS apuntando a tu servidor (la manera en que se configura el DNS puede variar dependiendo del registrar que elijas):
    • Un registro de tipo A con el nombre ejemplo.com apuntando a la IP pública de tu servidor
    • Un registro de tipo A con el nombre www.ejemplo.com apuntando a la IP pública de tu servidor.
  • Tener Nginx instalado.

Paso 1 - Instalación de Certbot

El primar paso para utilizar Let's Encrypt y obtener certificados SSL es instalar el software Certbot en tu servidor.

Certbot está actualmente en desarrollo y los paquetes que provee Ubuntu para su instalación suelen estar desactualizados. Sin embargo, los desarrolladores de Certbot mantienen un repositorio de Ubuntu con las versiones más recientes de este software, así que vamos a usar este repositorio en su lugar.

Primero debemos añadir el repositorio.

sudo add-apt-repository ppa:certbot/certbot

Luego debemos presionar ENTER para aceptar y posteriormente debemos actualziar los paquetes para poder hacer uso de el nuevo repositorio.

sudo apt-get update

Y finalmente instalaremos la versión de Certbot para Nginx con apt-get

sudo apt-get install python-certbot-nginx

Después de haber seguido estos pasos podremos hacer uso de Certbot, pero para que pueda configurar SSL en Nginx, debemos verificar algunas configuraciones de Nginx.

Paso 2 - Configurar Nginx

Ahora es posible que certbot pueda configurar SSL para Nginx de manera automática, sin embaro necesita poder encontrar primero el bloque server antes de poder hacerlo. Esto lo hace buscando la directiva server_name, el cuál debe conincidir con el domino al que estamos solicitando el certificado.

Si estás en una instalación limpa de Nginx puedes modificar el archivo de configuración default de Nginx. Abre el archivo con nano o tu editor favorito:

sudo nano /etc/nginx/sites-available/default

Busca la linea que inicie con la directiva server_name y cambia el _ por tu nombre de dominio

...
server_name ejemplo.com www.ejemplo.com
...

Guarda los cambios y cierra el editor y después verifica la configuración de Nginx con el siguiente comando:

sudo nginx -t

Si recibes algún error vuelve a modificar tu archivo de configuración y corrige los typos que puedas tener.
Una vez que no te muestre errores reinicia la configuración de Nginx

sudo systemctl reload nginx

Con esto Certbot podrá encontrar el bloque server adecuado para poder actualizarlo. Después vamos a actualizar la configuración del firewall para permitir el tráfico HTTPS.

Paso 3 - Permitir el paso de HTTPS a través del Firewall

Si tienes ufw habilitado como lo recomendamos en la configuración inicial de Ubuntu 16.04, deberás ajustar las configuraciones para permitir el tráfico HTTPS. Afortunadamente, Nginx registra algunos perfiles al momento de hacer su instalación.

Para verificar el estado actual ejecuta lo siguiente:

sudo ufw status

Deberás ver algo como lo siguiente

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Para permitir el tráfico HTTPS deberás habilitar el perfil Nginx Full y deshabilitar el perfil Nginx HTTP para no tener redundancia en las reglas del firewall.

sudo ufw allow 'Nginx Full'
sudo ufw delete 'Nginx HTTP'

Revisa ahora el estatus del firewall

sudo ufw status

Deberás ver algo como esto

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

Ahora todo está preparado y listo para que Certbot pueda obtener nuestros certificados.

Paso 4 - Obtener un certificado SSL

Certbot provee una variedad de formas en las que podemos obtener certificados SSL, a través de varios plugins. El plugin de Nginx se encargará de reconfigurar Nginx y reiniciar la configuración cuando sea necesario.

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

Esto va a ejecutar Certbot con el plugin de Nginx, el parámetro -d nos sirve para indicar los nombres para los cuales queremos que sea válido el certificado.

Si es la primera vez que ejecutamos Certbot, se nos va a pedir que indiquemos una dirección de correo electrónico para aceptar los términos de servicio. Después de aceptarlos, Certbot se va a comunicar con el servidor de Let's Encrypt, luego hará una verificación para confirmar que efectivamente controlamos el dominio al que queremos estamos solicitando el certificado.

Si todo es correcto, Certbot nos va a preguntar cómo queremos establecer las configuraciones HTTPS.

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-----------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration.
-----------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Selecciona la opcion que necesites y presiona enter. La configuración se actualizará automáticamente y Nginx se reiniciará para aplicar las nuevas configuracione. Certbot mostrará después un mensaje indicando que el proceso ha concluido exitosamente y te dirá dónde se encuentran los certificados.

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
   expire on 2017-10-23. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again with the
   "certonly" option. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Los certificados ahora han sido descargados, instalados y aplicados. Si ahora refrescamos la página web en el navegador podrás ver el indicador de seguridad. Esto indicará que nuestro sitio ha sido asegurado correctamente, usualmente con el logotipo de un candado en color verde a un lado de la URL.

Por último, vamos a revisar el proceso de renovación.

Paso 5 - Verificar la auto-renovación de Certbot

Los certificados de Let's Encrypt son válidos solamente por 90 días. Esto lo manejan así para alentar a los usuarios de este servicio a automatizar el proceso de renovación de certificados. El paquete de Certbot que insalamos, toma cartas en el asunto por nosotros ejecutando el comando certbot renew dos veces al día en una tarea programada. Esto renovará los certificados con 30 días de anticipación antes de vencer el certificado.

Para probar el proceso de renovación, puedes ejecutar un dry run con Certbot.

sudo certbot renew --dry-run

Si no ves ningún error, todo se encuentra bien. Si el proceso llegara a fallar, Certbot va a enviar un correo a la dirección especificada al momento de empezar a utilizar Certbot, indicando que uno de tus certificados está a punto de expirar.