Seguridad

Webmin hostname SSL Let’s encrypt, yo lo hice así

Con las nuevas exigencias de uso de certificados SSL en la navegación uno de los viejos amigos de los administradores, Webmin, comenzó a dar problemas, ya que por defecto se instala con un certificado autofirmado, que además no pasa muchas configuraciones de seguridad de los navegadores más usuales. Quise instalar Let’s Encrypt en una máquina Ubuntu 18.04, pero me encontré lo de siempre: muchos post son copia de otros que no sirven para nada.

Es posible que los atacantes estén intentando robar tu información de smart01.xxxxx.xxx (por ejemplo, contraseñas, mensajes o tarjetas de crédito). Más información
NET::ERR_CERT_AUTHORITY_INVALID

Te explico como lo  hice yo, y me funciono, para una Ubuntu 18.04, con Let’s Encrypt basado en DNS-01 challenge, con Cloudflare como nameserver del dominio, usando acme.sh

Este artículo fue reeditado el 18 de marzo para corregir los cambios existentes en Clouflare y acme.sh

Escenario usando Cloudflare

Llevaba tiempo pasando de largo del problema de los certificados autofirmados de Webmin. Sabía que se podía usar Let’s Encrypt, pero como imaginaba, no iba a ser todo fácil.

Cuando llegue a su configuración algo fallaba.

Había algo que no cuadraba, y la ayuda en Virtualmin, en sus foros, en la red, no era muy alagüeña.

  • Website root directory for validation file.
    • Other directory, no ofrece algo real. La validación por desafío HTTP-01, requiere tener abierto el puerto 80 ó 443, para el hostname FDQN a validar. En principio esto supondría que en esa máquina, tenemos un servidor web, lo cual puede ser un escenario que no es el nuestro, y que dicho servidor tiene un virtualhost con dicho hostname. Por lo que no es valido para nuestro propósito.
    • Use DNS domains for validation. BIen, en un primer intento supuse con mucha alegría que webmin gestionaría todo. Que iluso. Asi que me quedaba, claro que el método de validación por desafío DNS-01 era lo más apropiado, y además me servía la práctica para mis futuras pruebas con Kubernetes.

acme.sh: Un simple script ACME

No quería perderme en un sin fin de paquetes, clientes oficiales y no oficiales de Let’s Encrypt, y dado que tengo clientes en diversos proveedores y registradores, opte por este script acme.sh

En mi caso, el dominio que estaba configurando, lo tengo en una cuenta de Cloudflare, que tiene un hermosa API, que me facilitaba las cosas, ya que la validación por desafío DNS-01 requiere una entrada TXT, y mejor si una vez validado el hostname, borramos la entrada de nuestra zona dns.

Instalar y configurar acme.sh

En un usuario (mejor por seguridad, no acostumbrarse a trabajar como root)

$ cd /tmp
# git clone https://github.com/Neilpang/acme.sh.git
# cd acme.sh
# ./acme.sh --install --accountemail tu-correo-id@tu-dominio-correo

Crear nuestro token API de Cloudflare

Editado el 17 de Marzo 2021 – Nuevo método con CloudFlare

En el fichero de configuración account.conf debemos añadir, nuestros datos de la cuenta de Cloudflare que gestiona el dominio en cuestión, que podemos obtener en nuestro dashboard de usuario de Cloudflare, en profile.

  • SAVED_CF_key -> Global Key de nuestro usuario de Cloudflare
  • SAVED_CF_Email -> Nuestro email de usuario de Cloudflare
CF_Key='bb1ec8f3ImAGiNaRiO4f12786d1597e99'
CF_Email='mi_correo_tecnico@castris.com'

Como en todo las cosas cambian con el tiempo, y aprovecho que hoy tenía que actualizar a un cliente de Outsourcing su instalación de webmin, para corregir el nuevo modelo. 

  1. Entre en Cloudflare
  2. Ir a nuestro perfil
  3. Tokens de API
  4. Crear token
  5. Crear token de api con la plantilla Editar Zona de DNS
  6. Comprobar el token generado

Al crear el token nuestro consejo es el siguiente, sobre todo si tenemos multiples dominios y/o multiples subdominios en un dominio, por seguridad.

  • Permiso para Editar zona DNS
  • Elegir un recurso de zona especifico
  • Elegir una IP especifica (filtrado de ip)
Esta muy generalizado en los servidores en los que realizo auditorías, la dejadez por omisión de elementos que si bien son brechas mínimas de seguridad, puede llegar a ser grandes brechas. Si no se tiene una buena herramienta de gestión de recursos de sistemas, al final podemos olvidar que tenemos por ahí una llave API, que permite la edicíón de todos nuestro dominio y encima desde cualquier sitio. Imagínatelo!!! Menudo desastre.

Ejecutar acme.sh

Salimos de la sesión actual, ya que el instalador realizó algunos cambios en nuestro fichero de configuración del shell. Ahora solo resta hacer la primera llamada con el script para generar el certificado.

$ acme.sh --issue --dns dns_cf --ocsp-must-staple --keylength 4096 -d hostname.midominio.com
[Wed Mar 17 21:24:36 CET 2021] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Wed Mar 17 21:24:36 CET 2021] Single domain='hostname.domain.fdqn'
[Wed Mar 17 21:24:36 CET 2021] Getting domain auth token for each domain
[Wed Mar 17 21:24:38 CET 2021] Getting webroot for domain='hostname.domain.fdqn'
[Wed Mar 17 21:24:38 CET 2021] hostname.domain.fdqn is already verified, skip dns-01.
[Wed Mar 17 21:24:38 CET 2021] Verify finished, start to sign.
[Wed Mar 17 21:24:38 CET 2021] Lets finalize the order.
[Wed Mar 17 21:24:38 CET 2021] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/116012875/8509137526'
[Wed Mar 17 21:24:40 CET 2021] Downloading cert.
[Wed Mar 17 21:24:40 CET 2021] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/03fa004c3237206af92bc8cffaf9622c8582'
[Wed Mar 17 21:24:40 CET 2021] Cert success.
-----BEGIN CERTIFICATE-----
MIIGPjCCBSagAwIBAgISA/oATDI3IGr5K8jP+vliLIWCMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMTAzMTcxOTI0MzlaFw0yMTA2MTUxOTI0MzlaMB4xHDAaBgNVBAMT
...
...

i9gCzGkO2ul4kwgwEQYIKwYBBQUHARgEBTADAgEFMA0GCSqGSIb3DQEBCwUAA4IB
AQC1m+63A4s2hgzjYEePgWvue5sne8XS6n4D1DN3QvLr5WgQRyeeQmAGrG1n88Mn
5Na/fSD3vHCFyF7mOFq+raFot9NQkemIT5nefic1CnSKpf9AKp0LRcNdT7K5zk6g
GM+45x3+mkJ1GHZ5ZGXEyLqK17DWwza7N2zquxb/dwaUBZNFC8T6rp+yuQQin9qA
xsYWkplU7FcZN1Rd1Rc5kZarADhyl2q+sBV6pExm5B6dDKKOGABM2c9dMzlV10K0
qtKtQpJh1K5gUOK4JJG50h4lCF0JzDuG2ACPDT91vR6stNIxbUg7+0PC7KoLr/NK
uRszqVFYCSs9K+y5fd/kFxtt
-----END CERTIFICATE-----
[Wed Mar 17 21:24:40 CET 2021] Your cert is in  /root/.acme.sh/hostname.midominio.com/hostname.midominio.com.cer 
[Wed Mar 17 21:24:40 CET 2021] Your cert key is in /root/.acme.sh/hostname.midominio.com/hostname.midominio.com.key 
[Wed Mar 17 21:24:40 CET 2021] The intermediate CA cert is in /root/.acme.sh/hostname.midominio.com/ca.cer 
[Wed Mar 17 21:24:40 CET 2021] And the full chain certs is there: /root/.acme.sh/hostname.midominio.com/fullchain.cer

Tarea Cron de renovación

acme.sh instalará por nosotros una tarea cron de verificación del estado de validez de nuestro certificado, con el fin de renovarlo cuando sea conveniente

44 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

Compobación en el shell de nuestro token

Cloudflare nos aporta un ejemplo rápido para poder verificar que nuestro token funciona, evitando así las típicas dudas cuando programamos una interacción con una API, que nos devolverá un json con un success enverdadero.

curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \ -H "Authorization: Bearer gdwbtx8e2kkkkkkkkaaaaaaaaaa8b6Ob6KT0LRuJ" \ -H "Content-Type:application/json"
{"result":{"id":"13c3fede49jhkjahsdt0ef0c1a87106b1f","status":"active"},"success":true,"errors":[],"messages":[{"code":10000,"message":"This API Token is valid and active","type":null}]}

Configuración de webmin

Vía Webmin

Si tenemos acceso a webmin pese a las advertencias del problema con los certificados, como ejemplo usando Opera, en el que podemos acuir a Webmin -> Webmin Configuration -> SSL Encryption y poner en

Vía shell en fichero de configuración

Puede ocurrir, que se nos atranque el acceso, que alguna vez puede pasar por poner algún valor inadecuado en la configuración SSL, y la única forma que nos queda es editar el fichero de configuración de Webmin, generalmente en /etc/webmin/miniserv.conf

keyfile=/home/miusuario/.acme.sh/hostname.midominio.com/hostname.midominio.com.key
certfile=/home/miusuario/.acme.sh/hostname.midominio.com/hostname.midominio.com.cer
extracas=/home/miusuario/.acme.sh/hostname.midominio.com/fullchain.cer

Tras esta acción tenemos que reiniciar el servicio webmin

$ sudo systemctl restart webmin

Consideraciones finales

El alcance de este artículo, no es la seguridad, sino salir adelante con un tema que es recurrente en muchas piezas de software que tienen que ver con el ecosistema de los servidores.

He dedicado un tiempo, porque imaginé que me serviría para afrontar varios escenarios, similares en los que me he encontrado con la misma historia. Con Proxmox, su manual no me funciono, y no sólo eso sino que tuve que echar hacia atrás mis backups, porque me dejo inestable el sistema. Así, que ese es la siguiente ampliación de este artículo, ya que en el fondo pero con algunas salvedades, es casi igual.

Créditos

Gracias por la imagen de portada, Samuel Zeller de Unsplash.com y a Canva por su editor

Comparte este articulo en

Abkrim

Yo solo se que no se nada, y que me paso la vida aprendiendo

Ver comentarios

  • Hola,

    buen articulo. Pero hay una via más simple:
    En el Webmin entre en la página "Webmin Configuration" en la pestaña "Let´s Encrypt"
    bajo "Hostnames for certificate" su hostname(s)
    bajo "Website root directory for validation file" activa "Other directory y entra el directorio de letsencrypt, que según estándar es "/etc/letsencrypt/keys".

    Con éstas entras funciona directamente.

    • Hola Philip.
      Que haces si NO PUEDES ACCEDER A WEBMIN VIA NAVEGADOR?
      De eso va el articulo.
      Que tengas un buen día.

  • Lo siento. No me expliqué bien:

    En el articulo dices: "En mi caso, el dominio que estaba configurado, lo tengo en una cuenta de Cloudflare"

    Mi pregunta es: Si no tengo una cuenta en CLoudflare, cómo configuro el acme.sh?

    Saludos

Entradas recientes

Fatal error: Allowed memory size of 268435456 bytes exhausted en WordPress. Otro post más… pero diferente

No es la primera vez que me encuentro con el agotamiento de la memoria en…

5 meses hace

Problemas de Acceso con Centos 7, Almalinux 8, Ubuntu 20.04, y Debian 10/11: Un Enigma Firewall CSF

Descubre cómo solucionar problemas de acceso a servidores con Centos 7, Almalinux 8, Ubuntu 20.04…

9 meses hace

MySQL no inicia debido a errores en la base de datos interna de MySQL

Uno de los mensajes más alarmantes que puedes encontrarte es aquel que indica que tu…

11 meses hace

Actualización de seguridad 6.2.1 para WordPress y la importancia de los backups confiables

La seguridad de nuestro sitio web es de vital importancia en el mundo digital actual.…

12 meses hace

El mito de los ficheros SVG inseguros en las subidas de ficheros

Los ficheros SVG son archivos gráficos vectoriales escalables ampliamente utilizados en diseño web. Aunque no…

12 meses hace

Solución de problemas de errores 500 en Castris Hosting: una guía para usuarios de cPanel

En este artículo, te guiamos en la solución de problemas de errores 500 en Castris…

1 año hace