Cómo proteger Apache con Let's Encrypt en FreeBSD 12.0

El autor seleccionó el Fondo de Código Libre y Abierto para recibir una donación como parte del programa Write for DOnations.
Introducción
Let's Encrypt es una autoridad de certificación (CA) que ofrece una forma sencilla de obtener e instalar certificados TLS/SSL gratuitos, lo que permite el cifrado HTTPS en servidores web. Simplifica el proceso al ofrecer un cliente de software, Certbot, que intenta automatizar la mayoría (si no todos) de los pasos necesarios.
En este tutorial, utilizará Certbot para configurar un certificado TLS/SSL de Let's Encrypt en un servidor FreeBSD 12.0 que ejecuta Apache como servidor web. Además, automatizará el proceso de renovación del certificado mediante una tarea programada.
Nota: a partir del 1 de julio de 2022, DigitalOcean ya no admite la creación de nuevos Droplets de FreeBSD a través del Panel de control o la API. Sin embargo, aún puede crear Droplets de FreeBSD utilizando una imagen personalizada. Aprenda a importar una imagen personalizada a DigitalOcean siguiendo nuestra documentación del producto.
Prerrequisitos
Antes de comenzar esta guía necesitarás lo siguiente:
-
Un servidor FreeBSD 12.0 que puedes configurar como desees usando esta guía sobre Cómo comenzar a usar FreeBSD.
-
Apache instalado completando el Paso 1 de este tutorial de pila FAMP.
-
Un firewall habilitado mediante el paso de configuración del firewall en las instrucciones de este tutorial.
-
Dos registros DNS A que apuntan su dominio a la dirección IP pública de su servidor. Nuestra configuración utilizará
your-domain
y como nombres de dominio, y ambos requerirán un registro DNS válido. Puede consultar esta introducción a DigitalOcean DNS para obtener detalles sobre cómo agregar los registros DNS con la plataforma DigitalOcean. Los registros DNS A son necesarios debido a la forma en que Let's Encrypt valida que usted es el propietario del dominio para el que se emite un certificado. Por ejemplo, si desea obtener un certificado para , ese dominio debe resolverse en su servidor para que funcione el proceso de validación.www.your-domain
your-domain
Una vez cumplidos estos requisitos previos ya podrás empezar a instalar Certbot, la herramienta que te permitirá instalar certificados Let's Encrypt.
Paso 1: Instalación de la herramienta Certbot para Let's Encrypt
Un certificado Let's Encrypt garantiza que los navegadores de los usuarios puedan verificar que el servidor web está protegido por una autoridad de certificación de confianza. Las comunicaciones con el servidor web están protegidas mediante cifrado mediante HTTPS.
En este paso instalará la herramienta Certbot para su servidor web para realizar una solicitud a los servidores Let's Encrypt para emitir un certificado y claves válidos para su dominio.
Ejecute el siguiente comando para instalar el paquete Certbot y su complemento HTTP Apache:
- sudo pkg install -y py37-certbot py37-certbot-apache
Ahora que ha instalado el paquete, puede continuar para habilitar las conexiones TLS en el servidor web.
Paso 2: Habilitación de conexiones SSL/TLS en Apache HTTP
De forma predeterminada, cualquier instalación de Apache HTTP servirá contenido en el puerto 80
(HTTP). La Listen 80
entrada en el httpd.conf
archivo de configuración principal lo confirma. Para permitir conexiones HTTPS, necesitará que el puerto predeterminado sea 443
. Para agregar un puerto 443
y establecer conexiones SSL/TLS, deberá habilitar el mod_ssl
módulo en Apache HTTP.
Para encontrar este módulo en el httpd.conf
archivo, deberá utilizar grep
la -n
bandera para numerar las líneas del archivo en la ruta especificada. Para encontrarlo, mod_ssl.so
ejecute el siguiente comando:
- grep -n 'mod_ssl.so' /usr/local/etc/apache24/httpd.conf
Como resultado recibirás el número de la línea que necesitas:
/usr/local/etc/apache24/httpd.conf
148 #LoadModule ssl_module libexec/apache24/mod_ssl.so
Para habilitar el módulo, eliminará el símbolo de hashtag al comienzo de la línea.
Usando el número de línea del comando anterior abra el archivo con lo siguiente:
- sudo vi +148 /usr/local/etc/apache24/httpd.conf
Esto te llevará directamente a la línea correcta para editar.
Edite la línea para que se vea como la siguiente presionando x
:
/usr/local/etc/apache24/httpd.conf
#LoadModule session_dbd_module libexec/apache24/mod_session_dbd.so#LoadModule slotmem_shm_module libexec/apache24/mod_slotmem_shm.so#LoadModule slotmem_plain_module libexec/apache24/mod_slotmem_plain.soLoadModule ssl_module libexec/apache24/mod_ssl.so#LoadModule dialup_module libexec/apache24/mod_dialup.so#LoadModule http2_module libexec/apache24/mod_http2.so#LoadModule proxy_http2_module libexec/apache24/mod_proxy_http2.so
Una vez que hayas eliminado el #
, presiona :wq
y luego ENTER
para cerrar el archivo.
Habilitó las funciones SSL/TLS en Apache HTTP. En el siguiente paso, configurará los hosts virtuales en Apache HTTP.
Paso 3: Habilitación y configuración de hosts virtuales
Un host virtual es un método mediante el cual varios sitios web pueden vivir de forma simultánea e independiente en el mismo servidor utilizando la misma instalación HTTP de Apache. Certbot requiere esta configuración para colocar reglas específicas dentro del archivo de configuración (host virtual) para que funcionen los certificados Let's Encrypt.
Para comenzar, deberá habilitar los hosts virtuales en Apache HTTP. Ejecute el siguiente comando para localizar la directiva en el archivo:
- grep -n 'vhosts' /usr/local/etc/apache24/httpd.conf
Verás el número de línea en tu salida:
Output508 #Include etc/apache24/extra/httpd-vhosts.conf
Ahora use el siguiente comando para editar el archivo y eliminarlo #
desde el principio de esa línea:
- sudo vi +508 /usr/local/etc/apache24/httpd.conf
Como antes, presione x
para eliminar #
desde el principio de la línea para que se vea como sigue:
/usr/local/etc/apache24/httpd.conf
...# User home directories#Include etc/apache24/extra/httpd-userdir.conf# Real-time info on requests and configuration#Include etc/apache24/extra/httpd-info.conf# Virtual hostsInclude etc/apache24/extra/httpd-vhosts.conf# Local access to the Apache HTTP Server Manual#Include etc/apache24/extra/httpd-manual.conf# Distributed authoring and versioning (WebDAV)#Include etc/apache24/extra/httpd-dav.conf...
Luego presione :wq
y ENTER
para guardar y salir del archivo.
Ahora que ha habilitado los hosts virtuales en Apache HTTP, modificará el archivo de configuración del host virtual predeterminado para reemplazar los dominios de ejemplo con su nombre de dominio.
Ahora agregará un bloque de host virtual al httpd-vhosts.conf
archivo. Editará el archivo y eliminará los dos VirtualHost
bloques existentes, después del bloque de comentarios en la línea 23, con el siguiente comando:
- sudo vi +23 /usr/local/etc/apache24/extra/httpd-vhosts.conf
Después de abrir el archivo, elimine los dos bloques de configuración existentes VirtualHost
y luego agregue el siguiente bloque con esta configuración específica:
/usr/local/etc/apache24/extra/httpd-vhosts.conf
VirtualHost *:80 ServerAdmin your_email@your_domain.com DocumentRoot "/usr/local/www/apache24/data/your_domain.com" ServerName your_domain.com ServerAlias www.your_domain.com ErrorLog "/var/log/your_domain.com-error_log" CustomLog "/var/log/your_domain.com-access_log" common/VirtualHost
En este bloque estás configurando lo siguiente:
ServerAdmin
:Aquí se coloca el correo electrónico de la persona a cargo de ese sitio en particular.DocumentRoot
:Esta directiva define dónde se colocarán y desde dónde se leerán los archivos del sitio específico.ServerName
:Esto es para el nombre de dominio del sitio.ServerAlias
:Similar aServerName
pero colocándolowww.
antes del nombre de dominio.ErrorLog
:Aquí se declara la ruta del registro de errores. Todos los mensajes de error se escribirán en el archivo especificado en esta directiva.CustomLog
:Similar aErrorLog
, pero esta vez el archivo es el que recoge todos los registros de acceso.
Por último, crearás el directorio donde se ubicará el sitio. Esta ruta debe coincidir con la que declaraste en la DocumentRoot
directiva del httpd-vhosts.conf
archivo.
- sudo mkdir /usr/local/www/apache24/data/your_domain.com
Ahora cambie los permisos del directorio para que el proceso HTTP Apache (que se ejecuta como www
usuario) pueda trabajar con él:
- sudo chown -R www:www /usr/local/www/apache24/data/your_domain.com
Solías chown
cambiar la propiedad con la -R
bandera para hacer que la acción fuera recursiva. El usuario y el grupo se configuran mediante el www:www
.
Habilitó los hosts virtuales en Apache HTTP. Ahora habilitará el módulo de reescritura.
Paso 4: Habilitar el módulo de reescritura
Es necesario habilitar el módulo de reescritura dentro de Apache HTTP para realizar cambios en las URL, por ejemplo al redireccionar de HTTP a HTTPS.
Utilice el siguiente comando para encontrar el módulo de reescritura:
- grep -n 'rewrite' /usr/local/etc/apache24/httpd.conf
Verá un resultado similar a este:
Output180 #LoadModule rewrite_module libexec/apache24/mod_rewrite.so
Para habilitar el módulo, ahora eliminará #
del principio de la línea:
- sudo vi +180 /usr/local/etc/apache24/httpd.conf
Edite su archivo para que se vea como el siguiente presionando x
eliminar #
desde el comienzo de la línea:
/usr/local/etc/apache24/httpd.conf
#LoadModule actions_module libexec/apache24/mod_actions.so#LoadModule speling_module libexec/apache24/mod_speling.so#LoadModule userdir_module libexec/apache24/mod_userdir.soLoadModule alias_module libexec/apache24/mod_alias.soLoadModule rewrite_module libexec/apache24/mod_rewrite.soLoadModule php7_module libexec/apache24/libphp7.so# Third party modulesIncludeOptional etc/apache24/modules.d/[0-9][0-9][0-9]_*.confIfModule unixd_module
Guarde y salga de este archivo.
Ahora ha terminado de configurar las configuraciones necesarias en Apache.
Paso 5: Obtención de un certificado Let's Encrypt
Certbot ofrece una variedad de formas de obtener certificados SSL a través de varios complementos. El apache
complemento se encargará de reconfigurar Apache HTTP. Para ejecutar la instalación interactiva y obtener un certificado que cubra solo un dominio, ejecute el siguiente comando de certbot:
- sudo certbot --apache -d your-domain -d www.your-domain
Si desea instalar un único certificado válido para varios dominios o subdominios, puede pasarlos como parámetros adicionales al comando, etiquetando cada nuevo dominio o subdominio con la -d
bandera. El primer nombre de dominio en la lista de parámetros será el dominio base utilizado por Let's Encrypt para crear el certificado. Por este motivo, pase primero el nombre de dominio base, seguido de cualquier subdominio o alias adicional.
Si es la primera vez que utiliza certbot
este servidor, el cliente le solicitará que ingrese una dirección de correo electrónico y que acepte los términos de servicio de Let's Encrypt. Después de hacerlo, certbot
se comunicará con el servidor de Let's Encrypt y luego ejecutará un desafío para verificar que usted controla el dominio para el que está solicitando un certificado.
Si el desafío tiene éxito, Certbot le preguntará cómo desea configurar sus ajustes HTTPS:
Output. . .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 fornew sites, or if you're confident your site works on HTTPS. You can undo thischange by editing your web server's configuration.-------------------------------------------------------------------------------Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
También podrá elegir entre habilitar ambos HTTP
y HTTPS
acceder o forzar que todas las solicitudes se redirijan a HTTPS
. Para mayor seguridad, se recomienda elegir la opción 2: Redirect
si no tiene ninguna necesidad especial de permitir conexiones no cifradas. Seleccione su opción y luego presione ENTER
.
Esto actualizará la configuración y volverá a cargar Apache HTTP para recoger las nuevas configuraciones. certbot
Finalizará con un mensaje que le informará que el proceso fue exitoso y dónde se almacenan sus certificados:
OutputIMPORTANT NOTES:- Congratulations! Your certificate and chain have been saved at: /usr/local/etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /usr/local/etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on yyyy-mm-dd. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew"- Your account credentials have been saved in your Certbot configuration directory at /usr/local/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
Sus certificados ya están descargados, instalados y configurados. Intente volver a cargar su sitio web https://
y observe el indicador de seguridad de su navegador. Representará que el sitio está protegido correctamente, generalmente con un ícono de candado verde. Si prueba su servidor con la Prueba de servidor de SSL Labs, obtendrá una calificación A.
Certbot ha realizado algunos cambios de configuración importantes. Cuando instala los certificados en su servidor web, debe colocarlos en rutas específicas. Si ahora lee el contenido del httpd-vhosts.conf
archivo, observará algunos cambios realizados por el programa Certbot.
Por ejemplo, en la VirtualHost *:80
sección las reglas de redirección (si se eligen) se colocan en la parte inferior de la misma.
/usr/local/etc/apache24/extra/httpd-vhosts.conf
RewriteEngine onRewriteCond %{SERVER_NAME} =www.your_domain.com [OR]RewriteCond %{SERVER_NAME} =your_domain.comRewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
Certbot también ha creado un archivo llamado httpd-vhosts-le-ssl.conf
donde se ha colocado la configuración de los certificados en Apache:
/usr/local/etc/apache24/extra/httpd-vhosts-le-ssl.conf
IfModule mod_ssl.cVirtualHost *:443 ServerAdmin your_email@your_domain.com DocumentRoot "/usr/local/www/apache24/data/your_domain.com" ServerName your_domain.com ServerAlias www.your_domain.com ErrorLog "/var/log/your_domain.com-error_log" CustomLog "/var/log/your_domain.com-access_log" commonInclude /usr/local/etc/letsencrypt/options-ssl-apache.confSSLCertificateFile /usr/local/etc/letsencrypt/live/your_domain.com/fullchain.pemSSLCertificateKeyFile /usr/local/etc/letsencrypt/live/your_domain.com/privkey.pem/VirtualHost/IfModule
Nota: Si desea realizar cambios en el uso de conjuntos de cifrado en sitios con certificados Let's Encrypt, puede hacerlo en el /usr/local/etc/letsencrypt/options-ssl-apache.conf
archivo.
Una vez haya obtenido su certificado Let's Encrypt, ahora puede pasar a configurar las renovaciones automáticas.
Paso 6: Configuración de la renovación automática del certificado
Los certificados Let's Encrypt tienen una validez de 90 días, pero se recomienda renovarlos cada 60 días para permitir un margen de error. Por este motivo, se recomienda automatizar este proceso para comprobar y renovar periódicamente el certificado.
En primer lugar, examinemos el comando que utilizará para renovar el certificado. El certbot
cliente Let's Encrypt tiene un renew
comando que verifica automáticamente los certificados instalados actualmente e intenta renovarlos si faltan menos de 30 días para la fecha de vencimiento. Al utilizar esta --dry-run
opción, puede ejecutar una simulación de esta tarea para probar cómo funciona la renovación:
- sudo certbot renew --dry-run
Una forma práctica de garantizar que sus certificados no queden obsoletos es crear un trabajo cron que ejecute periódicamente el comando de renovación automática. Dado que la renovación primero verifica la fecha de vencimiento y solo ejecuta la renovación si faltan menos de 30 días para que caduque el certificado, es seguro crear un trabajo cron que se ejecute todas las semanas o incluso todos los días.
La documentación oficial de Certbot recomienda ejecutarlo cron
dos veces al día. Esto garantizará que, en caso de que Let's Encrypt inicie una revocación de certificado, no pasará más de medio día antes de que Certbot renueve su certificado.
Edite el crontab
para crear un nuevo trabajo que ejecutará la renovación dos veces al día. Para editar el crontab
para el usuario raíz , ejecute:
- sudo crontab -e
Coloque la siguiente configuración en el archivo para que, dos veces al día, el sistema busque certificados renovables y los renueve si es necesario:
SHELL=/bin/shPATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin# Order of crontab fields# minute hour mday month wday command 0 0,12 * * * /usr/local/bin/certbot renew
En las dos primeras líneas se declaran las variables de entorno, es decir, dónde se encuentran las rutas de los ejecutables y en qué shell se ejecutan. A continuación, se indican los intervalos de tiempo que nos interesan y el comando que se va a ejecutar.
Con este breve conjunto de instrucciones habrá configurado la renovación automática de certificados.
Conclusión
En este tutorial, instaló el cliente Let's Encrypt certbot
, descargó certificados SSL para un dominio, configuró Apache para usar estos certificados y configuró la renovación automática de certificados. Para obtener más información, consulte la documentación de Certbot.
Deja una respuesta