Nginx reverse proxy con https a través de letsencrypt

Nginx reverse proxy con https a través de letsencrypt
Este es un seguimiento de mi publicación anterior donde configuramos un servidor proxy inverso simple usando NGINX. En esta publicación, aseguraremos la conexión entre el cliente y el servidor proxy inverso utilizando TLS gratuito (A.k.un certificado SSL) de LetsEnCrypt. Te animo a que revises la publicación mencionada anteriormente sobre el poder inversa de lo básico.

Requisitos previos

  1. Un servidor con IP pública estática. Aquí es donde se está ejecutando Nginx.
  2. Servidores de back -end con el sitio web previsto que se ejecuta sobre HTTP
  3. Un nombre de dominio registrado. Estaré usando Ranvirslog.com como mi nombre de dominio principal y los dos sitios web están en FQDNS - WW1.ranvirslog.com y ww2ranvirslog.comunicarse

Configuración

Entonces las direcciones IP han cambiado desde la última vez, ya que estoy haciendo esta configuración nuevamente. Aquí están los nuevos IP y nombres de host.

VM/nombre de host IP público IP privada Papel/función
Proxietre 68.183.214.151 10.135.127.136 Punto de terminación TLS y servidor proxy inverso
Web1 N / A 10.135.126.102 Hosting WW1.ranvirslog.comunicarse

Sitio web a través del puerto 80 http

Web2 N / A 10.135.126.187 Alojamiento

Segunda Guerra Mundial.ranvirslog.comunicarse

Sitio web a través del puerto 80 http

Los registros DNS se configuran como tales, ambos sitios web (diferentes subdominios) apuntan a la misma IP pública estática. Esta es la dirección IP de nuestro proxy inversa de Nginx:

Un expediente Valor
WW1.ranvirslog.comunicarse 68.183.214.151
Segunda Guerra Mundial.ranvirslog.comunicarse 68.183.214.151

Para que nuestro DNS inverso funcione a través de HTTP sin cifrar, creamos dos archivos en /etc /conf.d/ llamado WW1.conf y ww2.Conf cada uno con la siguiente configuración:

/etc/conf.D/WW1.confusión

servidor
Escucha 80;
escuchar [::]: 80;
server_name ww1.ranvirslog.com;
ubicación /
proxy_pass http: // 10.135.126.102/;
proxy_buffering off;
proxy_set_header X-Real-IP $ Remote_addr;

/etc/conf.d/ww2.confusión

servidor
Escucha 80;
escuchar [::]: 80;
server_name ww2.ranvirslog.com;
ubicación /
proxy_pass http: // 10.135.126.187/;
proxy_buffering off;
proxy_set_header X-Real-IP $ Remote_addr;

El sistema operativo que estamos utilizando es Ubuntu 18.04 LTS y tenemos remoto el archivo/etc/nginx/sites-habilitado/predeterminado para que NGINX pueda actuar exclusivamente como un DNS inverso utilizando las configuraciones que se muestran arriba.

Objetivo

Con el DNS inverso (y los sitios web de backend) que ya están en funcionamiento, nuestro objetivo es instalar un solo certificado TLS para ambos FQDNS (eso es WW1.ranvirslog.com y ww2.ranvirslog.com) en nuestro proxy inverso nginx.

El tráfico entre cualquier cliente y el proxy inverso se va a encriptar, pero el tráfico entre el proxy inverso y los servidores de backend no está encriptado. Sin embargo, esta sigue siendo una opción infinitamente más segura que no tener https en absoluto. Para los casos en que el proxy inverso y los diversos servidores web estén en el mismo host, digamos que si está utilizando contenedores Docker para alojar todos en el mismo VPS, incluso este tráfico no entrelazado está contenido en un solo host.

Instalación de CertBot

CERTBOT es un programa de cliente que se ejecutará en nuestro servidor proxy inverso y negociará un certificado TLS con LetsenCrypt. Demostrará a Letsencrypt que el servidor de hecho tiene control de los FQDN que afirma tener control sobre. No nos preocuparemos por cómo lo hace Certbot.

Tradicionalmente, puede usar CERTBOT como un software independiente que solo obtendrá los certificados (que básicamente son solo llaves criptográficas largas) y guardarlo en el servidor. Pero afortunadamente, para la mayoría de los sistemas operativos hay complementos personalizados para NGINX, Apache y otros softwares. Instalaremos el CertBot con el complemento Nginx. Esto configurará automáticamente a Nginx para usar las claves recién obtenidas y deshacerse de reglas inseguras como escuchar HTTP en el puerto 80.

Si está utilizando sistemas basados ​​en Debian, como en mi caso estoy usando Ubuntu 18.04 lts, ​​entonces la instalación es una brisa.

$ sudo apt actualización
$ sudo apt instalación software-propiedades comunes
$ sudo add-apt-repositorio universo
$ sudo add-apt-repository PPA: certbot/certbot
$ sudo apt actualización
$ sudo apto install python-certbot-nginx

Otros sistemas operativos, su Redhat, Gentoo, Fedora pueden seguir las instrucciones oficiales como se enumeran aquí.

Una vez que haya instalado certbot con complemento Nginx Para su combinación de sistema operativo podemos llegar a los negocios.

Obtener certificados TLS

Para obtener el certificado TLS por primera vez, ejecute el siguiente comando:

$ sudo certbot -nginx

Esto se ejecutará a través de una serie de preguntas interactivas, como se muestra a continuación:

  1. Introduce tu correo electrónico

Guardar registro de depuración para /var/log/letsencrypt/Letsencrypt.registro
Complementos seleccionados: autenticador nginx, instalador nginx
Ingrese la dirección de correo electrónico (utilizada para avisos de renovación y seguridad de urgencia) (ingrese 'C' para cancelar): [email protected]

  1. Acepta TOS

Lea los términos de servicio en https: // Letsencrypt.org/Documents/LE-SA-V1.2 de noviembre-15-2017.pdf. Debe acordar para registrarse con el servidor ACME en https: // acme-v02.API.Letsencrypt.org/directorio
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A) Gree/(c) Ancel: A

  1. Boletín opcional

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
¿Estaría dispuesto a compartir su dirección de correo electrónico con Electronic Frontier Foundation, un socio fundador del Proyecto Let’s Let Cintpt y la organización sin fines de lucro que desarrolla CERTBOT? Nos gustaría enviarle un correo electrónico sobre nuestro trabajo en cifrado de la web, noticias de ef, campañas y formas de apoyar la libertad digital.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y) es/(n) o: y

  1. Luego detectará los nombres de dominio en su servidor, y si desea seleccionar todos los dominios, simplemente presione

¿Qué nombres le gustaría activar HTTPS para?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: WW1.ranvirslog.comunicarse
2: WW2.ranvirslog.comunicarse
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Seleccione los números apropiados separados por comas y/o espacios, o deje la entrada en blanco para seleccionar todas las opciones que se muestran (ingrese 'C' para cancelar):

  1. Redirigir todo a TLS. Elegí la opción 2, para redirigir todo a SSL, pero su caso de uso puede diferir. Para nuevas instalaciones de backend, es seguro elegir la opción 2.

Elija si redirige o no el tráfico HTTP a HTTPS, eliminando el acceso HTTP.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

1: Sin redirección: no realice más cambios en la configuración del servidor web.
2: Redirección: haga que todas las solicitudes redirigan para asegurar el acceso HTTPS. Elija esto para nuevos sitios, o si está seguro de que su sitio funciona en HTTPS. Puede deshacer este cambio editando la configuración de su servidor web.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Seleccione el número apropiado [1-2] y luego [Enter] (presione 'C' para cancelar): 2

Si todo salió bien, le mostrará este mensaje, solo para sus nombres de dominio.

Felicidades! Ha habilitado con éxito https: // ww1.ranvirslog.com y https: // ww2.ranvirslog.com puede visitar los fqdns y notar que los sitios web ahora tienen el letrero del candado que sugiere que todo está encriptado.

Mira los archivos de configuración

Si ve los archivos de configuración que creamos anteriormente, a saber /etc /conf.D/WW1.conf y /etc /conf.d/ww2.Conf, notará que todas las reglas de "escuchar 80" han desaparecido y se han agregado algunas líneas nuevas que le dice al servidor que la comunicación debe estar encriptada y la ubicación de los certificaciones y claves para realizar dicho cifrado.

Recomiendo encarecidamente mirar a través de los archivos de configuración, ya que eso también puede enseñarle cómo instalar correctamente los certs y escribir archivos de configuración.

Renovación de certificación

Los certificados típicos de LetsEnsencrypt son válidos por 90 días y antes de que expiren, necesite renovarlos. Puede usar CertBot para ejecutar primero la renovación, ejecutando el comando:

$ sudo certbot renovar-secado

Si la operación tiene éxito, verá el siguiente mensaje:

Felicitaciones, todas las renovaciones tuvieron éxito. Se han renovado los siguientes certificados:

/etc/letsencrypt/live/ww1.ranvirslog.com/fullchain.PEM (éxito)
** Run en seco: simulando 'certbot renovar' cerca de la cadena de certificación
** (Los certificados de prueba anteriores no se han guardado.)

Ahora puede agregar un trabajo cron que intentará renovar cada semana más o menos. CertBot no renovará los certificados a menos que realmente se encuentren con eso, por lo que no tiene que preocuparse. El comando para la renovación real es:

$ certbot renovar

Agréguelo al trabajo cron de Root usando:

$ sudo crontab -e

En el siguiente mensaje, seleccione su editor favorito (elija Nano si no está seguro) y agregue las siguientes líneas al final del archivo ahora abierto:


# Por ejemplo, puede ejecutar una copia de seguridad de todas sus cuentas de usuario
# a las 5 a.M todas las semanas con:
# 0 5 * * 1 tar -zcf/var/backups/home.TGZ /Inicio /
#
# Para obtener más información, consulte las páginas manuales de Crontab (5) y Cron (8)
#
# M H Dom Mon Dow Command
* 2 * * 2 certbot renovar

Esto ejecutará el comando CertBot Renew a las 2 de la mañana en cualquier minuto aleatorio, el segundo día de cada semana.

Conclusión

Si es nuevo en los certificados TLS, experimentar con cosas como HSTS puede ser arriesgado. Dado que estos cambios son irreversibles. Sin embargo, si desea bajar por la madriguera del conejo de la seguridad, puedo recomendar encarecidamente el blog de Troy Hunt, que es una de las principales inspiraciones detrás de este artículo.