7

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

Webmin, certificado SSL con letsencrypt para el hostname

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

Error webmin certificado NET::ERR_CERT_AUTHORITY_INVALID

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.

Configuracion Webmin para Letsencrypt

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
Cloudflare : Perfil : Keys
CF_Key='bb1ec8f3ImAGiNaRiO4f12786d1597e99'
CF_Email='[email protected]'

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
Cloudflare : Crear token API para editar zona DNS

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.
Cloudflare : Crear token API con permisos específicos

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}]}
Cloudflare :: Creacion de token :: Creado correctamente

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

Webmin :: Configuracion de Webmin :: Encriptación SSL

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

Comments 7

  1. Post
    Author
  2. 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.

    1. Post
      Author
  3. 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

    1. Post
      Author
  4. Post
    Author

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *