Cómo obtener un certificado Let's Encrypt con Ansible 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
La mejor manera de gestionar la infraestructura moderna es mediante procesos y herramientas automatizados. Obtener un certificado Let's Encrypt mediante el cliente estándar de Certbot es rápido y sencillo, pero generalmente es una tarea que debe realizarse manualmente cuando se ponen en servicio los servidores. Esto es factible para una configuración de servidor individual, pero puede volverse tedioso cuando se implementa una flota más grande.
El uso de una herramienta de gestión de configuración como Ansible para adquirir un certificado hace que esta tarea sea completamente automática y reproducible. Si alguna vez tiene que reconstruir o actualizar su servidor, puede simplemente ejecutar su manual de Ansible, en lugar de tener que volver a realizar los pasos manualmente.
En este tutorial, escribirá un manual de Ansible para adquirir un certificado Let's Encrypt automáticamente para una máquina host de Ansible.
Prerrequisitos
Para completar este tutorial, necesitarás:
- Dos servidores Ubuntu 18.04 configurados siguiendo la configuración inicial del servidor con Ubuntu 18.04, incluido un usuario sudo no root.
El primer servidor se utilizará como servidor Ansible, al que llamaremos servidor Ansible en este tutorial. Aquí es donde Ansible se ejecutará para enviar los comandos a la máquina host. Alternativamente, puede utilizar su máquina local o cualquier otra máquina que tenga su inventario Ansible configurado como su servidor Ansible .
En su servidor Ansible , necesitará:
- Una instalación de Ansible configurada correctamente que pueda conectarse a sus hosts Ansible siguiendo Cómo instalar y configurar Ansible en Ubuntu 18.04.
El segundo servidor se utilizará como host de Ansible, al que llamaremos máquina host en este tutorial. Esta es la máquina que desea configurar y en la que emitir certificados. Esta máquina también ejecutará un servidor web para servir los archivos de validación de emisión de certificados.
En su máquina host , necesitará:
-
Un nombre de dominio para el que puede adquirir un certificado TLS, con los registros DNS necesarios configurados para apuntar a su máquina host de Ansible . En este ejemplo en particular, el libro de estrategias adquirirá un certificado válido para
your-domain
y , sin embargo, se puede ajustar para otros dominios o subdominios si es necesario.www.your-domain
-
Un servidor web al que se pueda acceder desde Internet a través del puerto
80
(HTTP), por ejemplo, siguiendo los pasos 1, 2 y 3 de Cómo instalar el servidor web Apache en Ubuntu 18.04. También podría ser un servidor Nginx o cualquier otro software de servidor web adecuado.
Una vez que tenga esto listo, inicie sesión en su servidor Ansible como su usuario no root para comenzar.
Paso 1: Configuración de los ajustes para el módulo Ansible Let's Encrypt
Ansible tiene un módulo integrado llamado letsencrypt
, que le permite adquirir certificados TLS válidos utilizando el protocolo ACME (Entorno de administración de certificados automatizado).
En este primer paso, agregará un archivo de configuración de variables de host para definir las variables de configuración que se requieren para usar el módulo.
Nota: El letsencrypt
módulo ha cambiado de nombre acme_certificate
a partir de Ansible 2.6. El letsencrypt
nombre ahora es un alias de acme_certificate
, por lo que seguirá funcionando, pero es posible que desee utilizar acme_certificate
en su lugar para garantizar la resistencia a futuro de sus playbooks. Puede comprobar su versión de Ansible utilizando ansible --version
. Al momento de escribir este tutorial, los repositorios de Apt de Ubuntu 18.04 acme_certificate
aún no son compatibles.
En primer lugar, cree el host_vars
directorio Ansible en su servidor Ansible :
- sudo mkdir /etc/ansible/host_vars
A continuación, crea un nuevo archivo en el /etc/ansible/host_vars
directorio con el nombre de tu máquina host de Ansible . En este ejemplo, usarás host1
como nombre del host:
- sudo nano /etc/ansible/host_vars/host1
La siguiente configuración de muestra incluye todo lo que necesita para comenzar, incluido: el método de validación y la dirección del servidor, una dirección de correo electrónico para recibir recordatorios de vencimiento del certificado y los directorios donde se guardarán sus claves y certificados de Let's Encrypt.
Copie la configuración de muestra en el archivo:
/etc/ansible/vars_host/host1
---acme_challenge_type: http-01acme_directory: https://acme-v02.api.letsencrypt.org/directoryacme_version: 2acme_email: certificate-reminders@your-domainletsencrypt_dir: /etc/letsencryptletsencrypt_keys_dir: /etc/letsencrypt/keysletsencrypt_csrs_dir: /etc/letsencrypt/csrsletsencrypt_certs_dir: /etc/letsencrypt/certsletsencrypt_account_key: /etc/letsencrypt/account/account.keydomain_name: your-domain
Guarde y cierre el archivo cuando haya terminado.
Ajuste el nombre de dominio y la dirección de correo electrónico según sea necesario. Puede utilizar cualquier dirección de correo electrónico, no es necesario que sea la que figura en your-domain
.
Es posible que algunas de las rutas de directorios o archivos definidas aún no existan en el servidor. Esto no es un problema; la primera parte del manual será crear estos directorios y asignar los permisos correspondientes.
Ha agregado las variables de configuración necesarias a su archivo de inventario de Ansible. A continuación, comenzará a escribir el manual para adquirir un certificado.
Paso 2: Creación de los directorios y la clave de cuenta de Let's Encrypt
En este paso, escribirá las tareas de Ansible que usará para crear los directorios Let's Encrypt necesarios, asignar los permisos correctos y generar una clave de cuenta Let's Encrypt.
En primer lugar, crea un nuevo playbook con el nombre letsencrypt-issue.yml
de tu servidor Ansible en un nuevo directorio de tu elección, por ejemplo /home/user/ansible-playbooks
:
- cd ~
- mkdir ansible-playbooks
- cd ansible-playbooks
- nano letsencrypt-issue.yml
Antes de comenzar a escribir tareas de Ansible, deberá especificar los hosts y las configuraciones asociadas. Ajuste lo siguiente según cómo hizo referencia a sus hosts en el tutorial de requisitos previos. Luego, agregue lo siguiente en la parte superior del archivo:
letsencrypt-problema.yml
---- hosts: "host1" tasks:
Ahora puede comenzar a escribir las tareas necesarias, la primera de las cuales es crear los directorios del sistema de archivos necesarios para almacenar los archivos de Let's Encrypt. Agregue la siguiente tarea de Ansible al archivo después del contenido anterior:
letsencrypt-problema.yml
... - name: "Create required directories in /etc/letsencrypt" file: path: "/etc/letsencrypt/{{ item }}" state: directory owner: root group: root mode: u=rwx,g=x,o=x with_items: - account - certs - csrs - keys
Esta tarea de Ansible creará los directorios account
, certs
, csrs
y keys
en /etc/letsencrypt
, que es donde se almacenarán los archivos necesarios para adquirir certificados.
Establece el propietario de los directorios root
y aplica los permisos u=rwx,g=x,o=x
para que solo root
tenga acceso de lectura y escritura a ellos. Esto es recomendable ya que los directorios contendrán claves privadas, solicitudes de firma de certificados (CSR) y certificados firmados, que deben mantenerse confidenciales.
A continuación, es necesario crear la clave de la cuenta Let's Encrypt. La utilizarás para identificarte en el servicio Let's Encrypt.
Añade la siguiente tarea a tu libro de jugadas:
letsencrypt-problema.yml
... - name: "Generate a Let's Encrypt account key" shell: "if [ ! -f {{ letsencrypt_account_key }} ]; then openssl genrsa 4096 | sudo tee {{ letsencrypt_account_key }}; fi"
No es necesario volver a crear la clave de la cuenta cada vez que renueva los certificados, por lo que también debe agregar una verificación para encontrar una clave existente if [ ! -f {{ letsencrypt_account_key }} ];
, para asegurarse de que no se sobrescriba.
Continuarás trabajando letsencrypt-issue.yml
en el siguiente paso, así que no cierres este archivo todavía.
Ha creado su manual de estrategias y ha configurado la configuración inicial y las tareas para prepararse para la adquisición de su certificado Let's Encrypt. A continuación, agregará más tareas para la generación de la clave privada y la CSR.
Paso 3: Generación de su clave privada y solicitud de firma de certificado
En este paso, escribirá las tareas del libro de estrategias para generar la clave privada requerida y la solicitud de firma de certificado.
La primera tarea de esta sección generará la clave privada necesaria para su certificado. Agregue lo siguiente al final del manual que comenzó a escribir en el paso 2:
letsencrypt-problema.yml
... - name: "Generate Let's Encrypt private key" shell: "openssl genrsa 4096 | sudo tee /etc/letsencrypt/keys/{{ domain_name }}.key"
Todos los subdominios del mismo dominio se agregarán al mismo certificado mediante el uso de nombres alternativos de sujeto (SAN), por lo que solo necesita generar una clave privada por ahora.
La siguiente tarea se utilizará para generar una solicitud de firma de certificado (CSR) para el certificado que desea adquirir. Esta solicitud se envía a Let's Encrypt para que validen y emitan cada certificado.
Añade lo siguiente al final del manual:
letsencrypt-problema.yml
... - name: "Generate Let's Encrypt CSR" shell: "openssl req -new -sha256 -key /etc/letsencrypt/keys/{{ domain_name }}.key -subj "/CN={{ domain_name }}"" -reqexts SAN -config (cat /etc/ssl/openssl.cnf (printf ""n[SAN]nsubjectAltName=DNS:{{ domain_name }}No related posts.
Deja una respuesta