Instalar y proteger Webmin en Ubuntu 24.04
Instala Webmin en Ubuntu 24.04 y protege el puerto 10000 con tunel SSH o lista IP, certificado Let's Encrypt, 2FA y Fail2ban.
Qué va a instalar
Webmin es un panel de control web que proporciona una interfaz de navegador para administrar un servidor Linux completo: usuarios, paquetes, tareas de cron, el firewall, Apache, BIND, discos y cientos de módulos más. Está disponible mediante HTTPS en el puerto 10000. La instalación consta de tres comandos y tarda aproximadamente un minuto. Esta guía dedica la mayor parte de su extensión a la segunda mitad porque Webmin inicia sesión como root y puede hacer todo lo que puede hacer root. Un Webmin expuesto sin restricciones o sin autenticación no es simplemente «un riesgo que gestionar»: implica el compromiso completo del servidor, con una página de inicio de sesión delante. Instálelo en diez minutos y dedique el resto de la hora a asegurarse de que sólo usted pueda acceder a él.
Requisitos y una advertencia importante
Necesita un VPS KVM nuevo con Ubuntu 24.04 y acceso como root o mediante un usuario con sudo. Webmin está escrito en Perl y consume pocos recursos: 1 GB de RAM es suficiente y, en reposo, utiliza bastante menos de un cuarto de gigabyte. Escucha en el puerto TCP 10000 mediante su propio servidor web incluido (miniserv.pl), no mediante Apache ni nginx. Por tanto, no es necesario instalar nada más antes.
Debe decidir dos aspectos antes de empezar. Primero, la cuenta con la que iniciará sesión: Webmin autentica las cuentas de Unix mediante PAM. Puede iniciar sesión como root o como un usuario del grupo sudo usando la contraseña de Unix de esa cuenta. Las imágenes de la nube suelen configurarse para usar sólo claves y no tienen una contraseña establecida para el usuario predeterminado. Webmin no puede iniciar sesión con una cuenta sin contraseña. Establezca primero una contraseña con sudo passwd youruser. De lo contrario, el inicio de sesión fallará independientemente de lo que escriba.
Segundo, esta es la advertencia: no abra simplemente el puerto 10000 a Internet y lo deje así. Decida ahora si accederá a Webmin mediante un túnel SSH (recomendado, sin exponer ningún puerto) o si restringirá el acceso a su propia IP. Esta decisión determina todos los pasos siguientes. Lea ambas opciones antes de modificar el firewall.
Instalar Webmin desde el repositorio oficial
Webmin publica un repositorio apt firmado. El script de configuración añade el repositorio y su clave de firma GPG para que las ejecuciones futuras de apt upgrade obtengan Webmin como cualquier otro paquete, con actualizaciones autenticadas en lugar de un .deb descargado que nunca se actualiza.
curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.shEl script muestra lo que va a hacer y solicita Setup repository? (y/N); responda y. Cuando termine, instale el paquete. La opción --install-recommends obtiene las dependencias habituales de Perl y los módulos SSL para que los módulos individuales no fallen después por errores de bibliotecas ausentes.
sudo apt-get install --install-recommends webminWebmin ha cambiado antes el nombre de este script. Las guías antiguas hacen referencia a setup-repos.sh. Si la URL directa devuelve un error 404, obtenga el comando de una línea actual directamente desde webmin.com/download en lugar de fijar un nombre. Una instalación correcta termina con una línea similar a Webmin install complete. You can now login to https://your-host:10000/ as root. El servicio está habilitado y en ejecución, la configuración se encuentra en /etc/webmin, las peticiones se registran en /var/webmin/miniserv.log y los inicios de sesión fallidos se envían a syslog o, en Ubuntu 24.04, al diario de systemd.
Confirme que realmente está activo y escuchando antes de abrir un navegador:
sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000Debe aparecer un estado active (running) y una línea que muestre miniserv.pl asociado a 0.0.0.0:10000. Esa dirección cambia a 127.0.0.1:10000 cuando use el túnel indicado más abajo. Si ss no muestra nada en 10000, Webmin no se inició; revise journalctl -u webmin -n 50 antes de continuar.
Primer inicio de sesión y advertencia del certificado
Abra https://YOUR_SERVER_IP:10000 en el navegador. En una instalación nueva ocurren dos cosas.
Si ufw está activo, la imagen de servidor propia de Ubuntu lo incluye inactivo, pero muchos proveedores lo habilitan de antemano, la página no se cargará en absoluto. Esto se explica en las situaciones de error siguientes. Si el puerto está abierto, el navegador muestra un bloqueo a pantalla completa: "Tu conexión no es privada", con el código NET::ERR_CERT_AUTHORITY_INVALID en Chrome, o SEC_ERROR_UNKNOWN_ISSUER / "Advertencia: posible riesgo de seguridad" en Firefox. Esto es normal y no indica una intrusión. Webmin generó un certificado autofirmado durante la instalación (/etc/webmin/miniserv.pem). Como ninguna autoridad de certificación lo respalda, el navegador se niega a confiar en él automáticamente. La conexión sigue cifrada; simplemente no está respaldada por una autoridad de certificación. Haga clic en las opciones para continuar (Avanzado y después Continuar). Más adelante reemplazaremos correctamente este certificado.
Inicie sesión con root o con su usuario de sudo y su contraseña de Unix para acceder al panel de información del sistema. Un error habitual es escribir http:// en lugar de https://. miniserv responde con HTTP sin cifrado en ese puerto y muestra exactamente el texto "Este servidor web se está ejecutando en modo SSL. Pruebe la URL https://...". La solución consiste literalmente en cambiar http por https en la barra de direcciones.
La decisión de seguridad: ¿cómo accederá a Webmin?
Ahora viene la parte importante. Un panel con privilegios equivalentes a root no debe quedar expuesto en Internet y aceptar intentos de inicio de sesión de cualquier scanner. Tiene dos opciones justificables, en este orden de preferencia. Toda interfaz de administración autohospedada plantea la misma cuestión. Por eso, si Vaultwarden es seguro depende de su endpoint de administración y de su archivo de backup, no de su cifrado.
El túnel SSH de la opción B es mejor porque no expone nada. La lista de permitidos por IP de la opción A es aceptable si su dirección es estática. No hacer ninguna de las dos cosas es exactamente el error que esta guía pretende evitar. Si prefiere acceder a Webmin a través de una red privada, configure el servidor detrás de una VPN WireGuard autohospedada y vincule Webmin a la dirección del túnel en lugar de a la dirección pública.
Opción A: restringir Webmin a tu IP
En el panel, abre Webmin, luego Webmin Configuration y después IP Access Control. Selecciona "Only allow from listed addresses" e introduce tu IP pública, que puedes consultar ejecutando curl ifconfig.me en tu portátil. Guarda los cambios. Webmin escribe este valor en la línea allow= de /etc/webmin/miniserv.conf y se reinicia.
El riesgo es el siguiente: si tu IP doméstica es dinámica y cambia, o introduces una dirección incorrecta, perderás el acceso. El navegador mostrará "Access denied for <your IP>", sin formulario de inicio de sesión, y no habrá ninguna vía de acceso web. Debes corregirlo desde la consola del servidor mediante SSH o mediante la consola VNC de tu proveedor:
sudo nano /etc/webmin/miniserv.conf
# find the line that begins allow=
# correct your IP, or delete the whole line to allow all again
sudo systemctl restart webminEliminar la línea allow= restaura el acceso completamente abierto. Hazlo sólo para recuperar el acceso y establece inmediatamente un valor correcto.
Opción B: enlazar con localhost y crear un túnel SSH (recomendado)
Es mejor que cualquier lista de permitidos no escuchar en la interfaz pública. Configure miniserv para que se enlace sólo con loopback y acceda a él mediante un túnel SSH cifrado en el que ya confía.
Edite /etc/webmin/miniserv.conf y añada o cambie una línea:
bind=127.0.0.1Reinicie con sudo systemctl restart webmin. Webmin ya no será accesible desde Internet, un escaneo de puertos del puerto 10000 no encontrará nada y la comprobación de ss anterior mostrará que está enlazado con 127.0.0.1:10000. Desde su portátil, abra un túnel:
ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IPMantenga abierta esa sesión y vaya a https://localhost:10000. El tráfico circula dentro de SSH, que ya está autenticado mediante su clave y cifrado, por lo que aquí puede aceptar de forma segura el certificado autofirmado: la capa SSH proporciona la protección real. Cierre la sesión SSH y Webmin dejará de estar disponible. No hay nada que añadir a una lista de permitidos, nada expuesto ni ningún servicio adicional que proteger.
Si configura bind=127.0.0.1 y olvida el túnel, el acceso remoto simplemente se detendrá. Esa es la función esperada, no un fallo. Recupérelo de la misma forma que en la opción A: desde la consola, elimine la línea bind o establezca bind=0.0.0.0 y reinicie. Este es el mismo procedimiento de túnel que usaría para acceder a un equipo de desarrollo remoto que ejecuta Claude Code en tmux: una sesión SSH, todo privado y nada adicional escuchando en la interfaz pública.
Sustituir el certificado autofirmado por uno real
Si expone Webmin en un nombre de host según la opción A, elimine la advertencia del navegador con un certificado real de Let's Encrypt. Necesita un nombre DNS, por ejemplo panel.example.com, con un registro A que apunte al servidor, y algún servicio que responda al desafío HTTP del puerto 80 durante la validación.
Webmin incluye esta función: Webmin, después Webmin Configuration, después SSL Encryption y después la pestaña Let's Encrypt. Introduzca el nombre de host, indique en "website root directory" una ruta que se sirva por el puerto 80 para ese dominio y solicite el certificado. Webmin obtiene el certificado, actualiza por usted las líneas certfile= y keyfile= en miniserv.conf y lo renueva automáticamente antes de que caduque. Recargue la página y el candado aparecerá sin advertencias.
El único inconveniente real es el siguiente: el servidor propio de Webmin se ejecuta en el puerto 10000, no en el 80. Por tanto, el desafío http-01 necesita un servidor web real, Apache o nginx, que responda por panel.example.com en el puerto 80, o una validación basada en DNS. En un equipo que sólo ejecuta Webmin y no tiene nada en el puerto 80, la solicitud falla con un error de validación hasta que proporciona a Let's Encrypt una forma de acceder al archivo del desafío. El funcionamiento, los registros DNS, el desafío del puerto 80 y la renovación son los mismos que al emitir un certificado para cualquier sitio web. Si necesita conocer esos detalles, la guía de certificados TLS de Let's Encrypt con Certbot y nginx explica el flujo de validación y la configuración de DNS. Si eligió la opción del túnel SSH, puede omitir esta sección: el certificado autofirmado funciona correctamente detrás de SSH, y un certificado real emitido para panel.example.com sólo produciría una advertencia de nombre no coincidente al visitar https://localhost:10000.
Activar la autenticación de dos factores
Una contraseña por sí sola ofrece poca protección para un panel de root, así que añada un segundo factor. Abra Webmin, después Webmin Configuration y después Two-Factor Authentication. Seleccione el proveedor Google Authenticator, que usa TOTP estándar y funciona con Authy, 1Password o cualquier aplicación de autenticación, y guarde los cambios. Webmin instala el pequeño módulo de Perl que necesita (Authen::OATH y un generador de códigos QR) y activa la función. Este paso por sí solo todavía no protege ninguna cuenta.
Después, cada cuenta debe registrar su propio dispositivo. Con 2FA activado, abra Webmin, después Webmin Users, seleccione la cuenta, elija Enable Two-Factor For User y Webmin mostrará un código QR. Escanéelo con la aplicación e introduzca uno de los códigos generados para confirmar. A partir de ese momento, el inicio de sesión solicitará el token de seis dígitos después de la contraseña. Registre el dispositivo antes de cerrar la sesión. Si 2FA es obligatorio pero su cuenta nunca ha escaneado un código, todavía puede eliminar el requisito desde la consola, pero es mucho más sencillo registrarlo primero.
Añadir Fail2ban para bloquear los inicios de sesión por fuerza bruta
Incluso un endpoint de inicio de sesión restringido debe penalizar los fallos repetidos. Webmin registra los inicios de sesión fallidos en syslog con el formato webmin[12345]: Invalid login as root from 10.0.0.9, o Non-existent login as ... cuando el nombre de usuario ni siquiera corresponde a una cuenta de Unix. En Ubuntu 24.04, esas líneas llegan al journal de systemd, porque una imagen estándar no tiene /var/log/auth.log. Fail2ban incluye un filtro estándar webmin-auth que coincide exactamente con esas dos líneas. La jaula siguiente establece backend = systemd por sí misma, por lo que no necesita una expresión regular ni una ruta de registro personalizadas.
Cree /etc/fail2ban/jail.d/webmin.local:
[webmin-auth]
enabled = true
port = 10000
filter = webmin-auth
backend = systemd
maxretry = 4
bantime = 1hRecargue con sudo systemctl restart fail2ban y confirme que la jaula está activa:
sudo fail2ban-client status webmin-authDebería ver la jaula en la lista, con un contador de bloqueos inicial de cero. En el backend del journal no aparece ninguna línea File list:. Para comprobar todo el flujo, provoque varios fallos de inicio de sesión desde otra red y vuelva a ejecutar el comando de estado. Compruebe que Currently banned aumente. Si nunca aumenta, asegúrese de no estar probando desde una dirección incluida en ignoreip de Fail2ban. Ejecute journalctl SYSLOG_IDENTIFIER=webmin en el servidor para confirmar que las líneas Invalid login se están escribiendo realmente. Si Fail2ban todavía no está instalado en este servidor, la guía de Fail2ban en Ubuntu 24.04 para SSH explica cómo instalarlo y qué jaula de SSH debe ejecutar junto con esta.
Limite lo que puede modificar cada usuario de Webmin
No todas las personas que necesitan el panel necesitan acceso root a todo. En Webmin, luego Webmin Users, cree cuentas de Webmin adicionales y conceda a cada una sólo los módulos que necesita. Por ejemplo, un operador de copias de seguridad puede ver únicamente los módulos de cron y del sistema de archivos. Al editar un usuario se muestra una lista de comprobación con todos los módulos. Al desmarcar uno, se elimina del menú de ese usuario y se bloquean las URL correspondientes. Esto añade una capa de defensa: incluso si roban una sesión de Webmin con pocos privilegios, no podrán reescribir /etc/shadow cuando el módulo Users no esté incluido en su lista.
Mantener Webmin actualizado
Como lo instaló desde el repositorio de apt, sudo apt update && sudo apt upgrade obtiene las nuevas versiones de Webmin junto con el resto del sistema. Instale los parches sin demora: un panel de control es un objetivo frecuente. Webmin también puede actualizarse desde Webmin, luego Webmin Configuration y después Upgrade Webmin, pero la vía de apt es más sencilla en Ubuntu porque mantiene las versiones coherentes con el resto de la gestión de paquetes. No lo considere opcional: varias vulnerabilidades CVE anteriores de Webmin permitían la ejecución remota de código, y la única diferencia entre un sistema con parches y un servidor vulnerado era la rapidez con la que el administrador ejecutaba la actualización.
Modos de fallo y los mensajes que verá
"Your connection is not private" / NET::ERR_CERT_AUTHORITY_INVALID. Se muestra en la primera carga. Causa: el certificado autofirmado que Webmin generó durante la instalación no tiene una entidad emisora de confianza. No es un ataque; el canal está cifrado, pero el certificado no está validado por una entidad de confianza. Solución: omita temporalmente la advertencia y emita después un certificado real de Let's Encrypt, o acéptelo de forma permanente si accede a Webmin mediante un túnel SSH.
"This web server is running in SSL mode. Try the URL https://..." Ha escrito http://server:10000. miniserv sólo usa TLS en ese puerto y se lo indica en texto sin formato. Solución: cambie http por https en la barra de direcciones.
La página agota el tiempo de espera, ERR_CONNECTION_TIMED_OUT / "This site can't be reached". La petición nunca llega a Webmin. En Ubuntu, casi siempre se debe a que ufw descarta el puerto 10000. Confírmelo con sudo ufw status; si 10000 no aparece en la lista, puede abrirlo con sudo ufw allow 10000/tcp o, mejor, dejarlo cerrado y usar el túnel SSH de la opción B. Tenga en cuenta la diferencia: un timeout significa que un firewall descarta los paquetes silenciosamente, mientras que ERR_CONNECTION_REFUSED significa que el puerto es accesible, pero Webmin no está ejecutándose; compruébelo con sudo systemctl status webmin.
"Access denied for <your IP>." Ha configurado IP Access Control en la opción A y su dirección actual no está en la lista permitida. También puede tratarse de una IP dinámica que haya cambiado o de un error tipográfico. No existe una vía de recuperación desde el navegador. Corríjalo desde la consola: edite la línea allow= en /etc/webmin/miniserv.conf, corríjala o elimínela y ejecute sudo systemctl restart webmin.
"Login failed. Please try again." con credenciales que sabe que son correctas. La cuenta no tiene una contraseña de Unix, algo habitual en las imágenes cloud que sólo usan claves. Webmin se autentica mediante PAM con la contraseña de Unix, y esa contraseña no existe para el usuario. Solución: ejecute sudo passwd youruser en el servidor y vuelva a iniciar sesión. Si /var/webmin/miniserv.log muestra Non-existent login as ..., está escribiendo un nombre de usuario que no corresponde a ninguna cuenta de Unix.
Para más de un par de servidores, la automatización escala mejor que instalar un panel de control en cada equipo: su primer playbook de Ansible es el punto de partida.
FAQ
¿Es seguro exponer Webmin en Internet pública?
Trate un Webmin accesible desde Internet como un shell de root con una página de inicio de sesión, porque eso es exactamente lo que es. Sólo es lo bastante seguro si se aplican varias capas: un certificado válido, autenticación de dos factores, Fail2ban y una lista de permitidos de IP estricta o, mejor aún, ninguna exposición pública. La configuración de menor riesgo enlaza Webmin a 127.0.0.1 y permite acceder mediante un túnel SSH, de modo que el puerto 10000 no responda a nadie en Internet abierta.
¿Cómo elimino la advertencia del certificado de Webmin?
La advertencia (NET::ERR_CERT_AUTHORITY_INVALID) aparece porque Webmin incluye un certificado autofirmado. Emita uno válido desde Webmin, Webmin Configuration, SSL Encryption, Let's Encrypt, usando un nombre DNS que apunte al servidor y tenga algo que atienda el desafío del puerto 80 para la validación. Si sólo accede a Webmin mediante un túnel SSH hacia localhost, la advertencia no supone un problema: SSH ya cifra y autentica la conexión, y puede aceptar de forma segura el certificado autofirmado.
¿Cómo restrinjo Webmin para que sólo acepte mi dirección IP?
Vaya a Webmin, Webmin Configuration, IP Access Control, seleccione "Only allow from listed addresses" e introduzca su IP pública desde curl ifconfig.me. Webmin almacena esta configuración en la línea allow= de /etc/webmin/miniserv.conf. Tenga cuidado con una IP doméstica dinámica: si cambia, perderá el acceso y tendrá que corregir la línea allow= desde la consola del servidor. En la práctica, una dirección estática o el método del túnel SSH son más fiables.
¿Por qué falla el inicio de sesión aunque la contraseña sea correcta?
Webmin se autentica mediante PAM usando la contraseña de Unix, y las imágenes de servicios cloud suelen usar sólo claves, sin una contraseña definida para la cuenta predeterminada. Por tanto, PAM no tiene ninguna contraseña con la que comparar y rechaza el inicio de sesión. Ejecute sudo passwd youruser en el servidor para establecer una y, después, inicie sesión. Una línea Non-existent login as ... en /var/webmin/miniserv.log indica, en cambio, que el nombre de usuario no corresponde a una cuenta de Unix real.
¿Para qué sirve Webmin frente a usar SSH directamente?
Webmin proporciona una capa de descubrimiento y comodidad. Es útil para consultar archivos de registro, administrar usuarios y cron, editar reglas del firewall y consultar el estado de los discos y servicios sin memorizar todos los comandos. Esto resulta práctico para administradores ocasionales o equipos con distintos niveles de experiencia. SSH directo es más rápido, permite crear scripts y expone una superficie de ataque mucho menor para las tareas habituales. Muchos administradores usan ambos: SSH para el trabajo diario y Webmin enlazado a localhost detrás de un túnel para las tareas puntuales realizadas con la interfaz. Si su pregunta real es qué panel elegir, en lugar de comparar un panel con el shell, conviene valorar primero Cockpit frente a Webmin, porque ambos difieren en cuánto del sistema pueden modificar y en la forma en que autentican al usuario.