Webmin su Ubuntu 24.04: installazione e sicurezza
Installa Webmin su Ubuntu 24.04 e proteggi la porta 10000 con tunnel SSH o allowlist IP, certificato Let's Encrypt, autenticazione a due fattori e Fail2ban.
Cosa stai configurando
Webmin è un pannello di controllo web che fornisce un'interfaccia del browser per l'intero server Linux: utenti, pacchetti, cron job, firewall, Apache, BIND, dischi e centinaia di altri moduli. È raggiungibile tramite HTTPS sulla porta 10000. L'installazione richiede solo tre comandi e dura circa un minuto. Questa guida dedica la maggior parte dello spazio alla seconda fase perché Webmin esegue l'accesso come root e può fare tutto ciò che può fare root. Un'istanza Webmin esposta senza restrizioni o senza autenticazione non è semplicemente «un rischio da gestire»: equivale alla compromissione completa del server, con una pagina di accesso davanti. Installala quindi in dieci minuti, poi dedica il resto dell'ora a verificare che solo tu possa raggiungerla.
Prerequisiti e un avvertimento importante
Un VPS KVM Ubuntu 24.04 appena installato, con accesso come root o con un utente autorizzato a usare sudo. Webmin è scritto in Perl ed è leggero: 1 GB di RAM è più che sufficiente e, in condizioni di inattività, il consumo resta ampiamente sotto un quarto di gigabyte. Webmin resta in ascolto sulla porta TCP 10000 tramite il proprio web server integrato (miniserv.pl), non tramite Apache o nginx. Non è quindi necessario installare altro prima.
Prima di iniziare, devi prendere due decisioni. La prima riguarda l'account con cui effettuerai l'accesso. Webmin autentica gli account Unix tramite PAM. Devi quindi accedere come root oppure come utente appartenente al gruppo sudo, usando la password Unix di quell'account. Le immagini cloud usano spesso solo chiavi SSH e non impostano una password per l'utente predefinito. Webmin non può autenticare un account senza password. Imposta prima una password con sudo passwd youruser. In caso contrario, l'accesso fallirà indipendentemente da ciò che digiti.
La seconda decisione è l'avvertimento vero e proprio: non limitarti ad aprire la porta 10000 su Internet e a lasciarla esposta. Decidi subito se accederai a Webmin tramite un tunnel SSH (scelta consigliata, senza porte esposte) oppure se limiterai l'accesso al tuo indirizzo IP. Questa decisione determina tutti i passaggi successivi. Leggi quindi entrambe le opzioni prima di modificare il firewall.
Installare Webmin dal repository ufficiale
Webmin pubblica un repository apt firmato. Lo script di configurazione aggiunge il repository e la relativa chiave di firma GPG, così le esecuzioni future di apt upgrade scaricano Webmin come qualsiasi altro pacchetto. In questo modo si ricevono aggiornamenti autenticati invece di usare un .deb scaricato che non viene mai aggiornato.
curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.shLo script mostra le operazioni che sta per eseguire e richiede Setup repository? (y/N); rispondere y. Al termine, installare il pacchetto. Il flag --install-recommends installa le dipendenze comuni dei moduli Perl e SSL, evitando che i singoli moduli falliscano in seguito per librerie mancanti.
sudo apt-get install --install-recommends webminIn passato Webmin ha rinominato questo script. Le guide meno recenti fanno riferimento a setup-repos.sh. Se l'URL restituisce un errore 404, recuperare il one-liner corrente direttamente da webmin.com/download invece di fissare un nome. Un'installazione corretta termina con una riga simile a Webmin install complete. You can now login to https://your-host:10000/ as root. Il servizio è abilitato e in esecuzione, la configurazione si trova in /etc/webmin, le richieste vengono registrate in /var/webmin/miniserv.log e i tentativi di accesso non riusciti vengono inviati a syslog, che su Ubuntu 24.04 corrisponde al journal di systemd.
Verificare che il servizio sia effettivamente attivo e in ascolto prima di aprire un browser:
sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000È necessario ottenere uno stato active (running) e una riga che mostri miniserv.pl associato a 0.0.0.0:10000. Questo indirizzo cambia in 127.0.0.1:10000 quando si usa il tunnel descritto di seguito. Se ss non mostra nulla sulla porta 10000, Webmin non è stato avviato. Consultare journalctl -u webmin -n 50 prima di procedere.
Primo accesso e avviso sul certificato
Aprire nel browser https://YOUR_SERVER_IP:10000. Su un'installazione nuova si verificano due situazioni.
Se ufw è attivo, la pagina non viene caricata. L'immagine server di Ubuntu lo lascia disattivato, ma molti provider lo preattivano. Questo caso è descritto più avanti nelle modalità di errore. Se la porta è aperta, il browser visualizza una pagina di blocco completa: "La connessione non è privata", con il codice NET::ERR_CERT_AUTHORITY_INVALID in Chrome, oppure SEC_ERROR_UNKNOWN_ISSUER / "Attenzione: potenziale rischio per la sicurezza" in Firefox. Questo comportamento è previsto e non indica un'intrusione. Durante l'installazione Webmin ha generato un certificato autofirmato (/etc/webmin/miniserv.pem). Poiché nessuna autorità di certificazione ne conferma l'attendibilità, il browser non lo considera attendibile automaticamente. La connessione è comunque crittografata; semplicemente, il certificato non è convalidato da un'autorità. Per il momento fare clic su Advanced, quindi su Proceed. Più avanti sostituiremo correttamente questo certificato.
Accedere con root oppure con il proprio utente sudo e la relativa password Unix. Verrà visualizzata la dashboard System Information. Un errore comune consiste nell'inserire http:// invece di https://. miniserv risponde con HTTP non crittografato su quella porta e mostra esattamente il testo "This web server is running in SSL mode. Try the URL https://...". Per risolvere il problema, modificare semplicemente http in https nella barra degli indirizzi.
La decisione sulla sicurezza: come accederai a Webmin?
Questa è la parte più importante. Un pannello con privilegi equivalenti a root non dovrebbe essere esposto direttamente a Internet, dove risponde ai tentativi di accesso di ogni scanner presente sulla rete. Hai 2 opzioni difendibili, in ordine di preferenza. Ogni interfaccia di amministrazione self-hosted porta alla stessa domanda. Per questo la sicurezza di Vaultwarden dipende dal suo endpoint di amministrazione e dal suo file di backup, non dalla crittografia.
Il tunnel SSH dell'Opzione B è la scelta migliore, perché non espone nulla. L'elenco di indirizzi IP consentiti dell'Opzione A è accettabile se il tuo indirizzo è statico. Non adottare nessuna delle 2 opzioni è esattamente l'errore che questa guida vuole prevenire. Se preferisci accedere a Webmin tramite una rete privata, invece di usare una delle 2 opzioni, inserisci il server dietro una VPN WireGuard self-hosted e configura Webmin in ascolto sull'indirizzo del tunnel anziché su quello pubblico.
Opzione A: limitare Webmin al proprio indirizzo IP
Nel pannello, apri Webmin, quindi Webmin Configuration, quindi IP Access Control. Seleziona "Only allow from listed addresses" e inserisci il tuo indirizzo IP pubblico, che puoi trovare eseguendo curl ifconfig.me sul laptop. Salva. Webmin scrive questo valore nella riga allow= di /etc/webmin/miniserv.conf e si riavvia.
Il problema è il seguente: se l'indirizzo IP di casa è dinamico e cambia, oppure inserisci l'indirizzo in modo errato, perdi l'accesso. Il browser mostra quindi "Access denied for <your IP>", senza il modulo di accesso, e non esiste un percorso web per rientrare. Devi correggere la configurazione dalla console del server tramite SSH o tramite VNC del provider:
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 webminL'eliminazione della riga allow= ripristina l'accesso completamente aperto. Esegui questa operazione solo per recuperare l'accesso, quindi imposta immediatamente un valore corretto.
Opzione B: associare il servizio a localhost e usare un tunnel SSH (scelta consigliata)
La soluzione migliore di qualsiasi allowlist è non ascoltare affatto sull’interfaccia pubblica. Configura miniserv in modo che utilizzi soltanto il loopback, quindi accedi al servizio tramite un tunnel SSH autenticato e cifrato.
Modifica /etc/webmin/miniserv.conf e aggiungi o modifica una riga:
bind=127.0.0.1Riavvia con sudo systemctl restart webmin. Webmin non è più raggiungibile da Internet, una scansione delle porte sulla porta 10000 non rileva nulla e il controllo ss eseguito in precedenza ora mostra che il servizio è associato a 127.0.0.1:10000. Dal laptop, apri un tunnel:
ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IPLascia aperta la sessione e accedi a https://localhost:10000. Il traffico passa all’interno di SSH, già autenticato tramite la tua chiave e cifrato. Puoi quindi accettare senza rischi il certificato autofirmato: la protezione effettiva è fornita dal livello SSH. Chiudi la sessione SSH e Webmin non sarà più raggiungibile. Non c’è nulla da aggiungere a un’allowlist, nulla di esposto e nessun servizio aggiuntivo da mettere in sicurezza.
Se imposti bind=127.0.0.1 e dimentichi il tunnel, l’accesso remoto si interrompe semplicemente. È il comportamento previsto, non un errore. Per ripristinare l’accesso, procedi come nell’opzione A: dalla console, rimuovi la riga bind oppure imposta bind=0.0.0.0, quindi riavvia. È la stessa modalità di tunneling che useresti per raggiungere un ambiente di sviluppo remoto che esegue Claude Code in tmux: una sessione SSH, tutto privato e nessun servizio aggiuntivo in ascolto sull’interfaccia pubblica.
Sostituire il certificato autofirmato con uno reale
Se esponi Webmin su un hostname come descritto nell'Opzione A, elimina l'avviso del browser usando un certificato reale di Let's Encrypt. Ti serve un nome DNS, ad esempio panel.example.com, con un record A che punti al server, e un servizio che risponda alla challenge HTTP sulla porta 80 durante la convalida.
Webmin include questa funzione: Webmin, poi Webmin Configuration, poi SSL Encryption, quindi la scheda Let's Encrypt. Inserisci l'hostname, indica come "website root directory" un percorso pubblicato sulla porta 80 per quel dominio e invia la richiesta. Webmin ottiene il certificato, aggiorna per te le righe certfile= e keyfile= in miniserv.conf e lo rinnova automaticamente prima della scadenza. Ricarica la pagina: il lucchetto risulta senza avvisi.
L'unico limite da considerare è questo: il server interno di Webmin usa la porta 10000, non la 80. Pertanto, la challenge http-01 richiede un server web reale, Apache o nginx, che risponda per panel.example.com sulla porta 80, oppure una convalida basata su DNS. Su un server che esegue solo Webmin e non ha nulla sulla porta 80, la richiesta fallisce con un errore di convalida finché non fornisci a Let's Encrypt un modo per raggiungere il file della challenge. La procedura, i record DNS, la challenge sulla porta 80 e il rinnovo sono gli stessi usati per emettere un certificato per qualsiasi sito web. Per approfondire, la guida ai certificati TLS Let's Encrypt con Certbot e nginx descrive in dettaglio il flusso di convalida e la configurazione DNS. Se hai scelto il metodo del tunnel SSH, puoi saltare interamente questa sezione: il certificato autofirmato è sufficiente dietro SSH, mentre un certificato reale emesso per panel.example.com produrrebbe comunque un avviso di mancata corrispondenza del nome quando visiti https://localhost:10000.
Attivare l'autenticazione a due fattori
Una password da sola offre una protezione insufficiente per un pannello root, quindi aggiungi un secondo fattore. Apri Webmin, poi Webmin Configuration, quindi Two-Factor Authentication. Seleziona il provider Google Authenticator, che usa il TOTP standard, quindi funziona con Authy, 1Password o qualsiasi app di autenticazione, e salva. Webmin installa il piccolo modulo Perl necessario (Authen::OATH e un generatore di codici QR) e abilita la funzionalità; questo passaggio da solo non protegge ancora alcun account.
Ogni account deve quindi registrare il proprio dispositivo. Con 2FA abilitato, apri Webmin, poi Webmin Users, seleziona l'account, scegli Enable Two-Factor For User e Webmin mostra un codice QR; scansionalo con l'app e inserisci un codice generato per confermare. Da quel momento, il login richiede il token di 6 cifre dopo la password. Completa la registrazione prima di uscire: se 2FA è obbligato ma il tuo account non ha mai scansionato un codice, puoi comunque rimuovere il requisito dalla console, ma è molto più semplice completare prima la registrazione.
Aggiungere Fail2ban per bloccare i tentativi di accesso a forza bruta
Anche un endpoint di accesso limitato deve reagire ai tentativi falliti ripetuti. Webmin registra gli accessi non riusciti in syslog nel formato webmin[12345]: Invalid login as root from 10.0.0.9 oppure Non-existent login as ... quando il nome utente non corrisponde nemmeno a un account Unix. In Ubuntu 24.04 queste righe finiscono nel journal di systemd, perché un'immagine standard non contiene /var/log/auth.log. Fail2ban include il filtro standard webmin-auth, che corrisponde esattamente a queste due righe. Il jail seguente imposta direttamente backend = systemd, quindi non richiede espressioni regolari personalizzate né un percorso dei log.
Creare /etc/fail2ban/jail.d/webmin.local:
[webmin-auth]
enabled = true
port = 10000
filter = webmin-auth
backend = systemd
maxretry = 4
bantime = 1hRicaricare la configurazione con sudo systemctl restart fail2ban, quindi verificare che il jail sia attivo:
sudo fail2ban-client status webmin-authIl jail dovrebbe essere elencato con un contatore dei blocchi inizialmente pari a zero. Con il backend journal non è presente alcuna riga File list:. Per verificare l'intero funzionamento, eseguire intenzionalmente alcuni tentativi di accesso non riusciti da un'altra rete. Eseguire quindi di nuovo il comando di stato e monitorare l'incremento di Currently banned. Se il contatore non aumenta, verificare che l'indirizzo utilizzato per il test non sia incluso in ignoreip di Fail2ban. Eseguire inoltre journalctl SYSLOG_IDENTIFIER=webmin sul server per verificare che le righe Invalid login vengano effettivamente scritte. Se Fail2ban non è ancora installato su questo server, la guida a Fail2ban su Ubuntu 24.04 per SSH descrive l'installazione e il jail SSH da eseguire insieme a questo.
Limita ciò che ogni utente Webmin può modificare
Non tutti gli utenti che devono accedere al pannello hanno bisogno dei privilegi root sull'intero sistema. In Webmin, quindi Webmin Users, crea account Webmin aggiuntivi e assegna a ciascuno solo i moduli necessari. Ad esempio, un operatore dei backup può visualizzare soltanto i moduli cron e filesystem. Modificando un utente viene mostrato un elenco di controllo con tutti i moduli. Deselezionare un modulo lo rimuove dal menu dell'utente e blocca gli URL corrispondenti. È una misura di difesa in profondità: anche una sessione Webmin a privilegi ridotti eventualmente sottratta non può modificare /etc/shadow se il modulo Users non è incluso nel relativo elenco.
Mantenere Webmin aggiornato
Poiché l'installazione proviene dal repository apt, sudo apt update && sudo apt upgrade scarica le nuove release di Webmin insieme agli altri aggiornamenti di sistema. Applicate rapidamente le patch: un pannello di controllo è un obiettivo frequente. Webmin può anche aggiornarsi dall'interfaccia, selezionando Webmin, quindi Webmin Configuration e infine Upgrade Webmin, ma su Ubuntu il percorso tramite apt è più semplice e mantiene le versioni coerenti con il resto della gestione dei pacchetti. Non consideratelo facoltativo: diverse CVE di Webmin pubblicate in passato riguardavano vulnerabilità di esecuzione di codice da remoto, e la sola differenza tra un sistema con le patch applicate e un server compromesso era la rapidità con cui l'amministratore eseguiva l'aggiornamento.
Modalità di errore e stringhe visualizzate
"Your connection is not private" / NET::ERR_CERT_AUTHORITY_INVALID. Viene visualizzato al primo caricamento. Causa: il certificato autofirmato generato da Webmin durante l'installazione non ha un'autorità di certificazione attendibile. Non indica un attacco: il canale è crittografato, ma il certificato non è verificato da un'autorità attendibile. Correzione: per ora proseguire oltre l'avviso, quindi emettere un certificato Let's Encrypt reale oppure accettare definitivamente il certificato se si accede a Webmin tramite un tunnel SSH.
"This web server is running in SSL mode. Try the URL https://..." Hai digitato http://server:10000. miniserv supporta solo TLS su quella porta e lo comunica in testo normale. Correzione: sostituire http con https nella barra degli indirizzi.
La pagina va in timeout, ERR_CONNECTION_TIMED_OUT / "This site can't be reached". La richiesta non raggiunge Webmin. Su Ubuntu, quasi sempre ufw sta bloccando la porta 10000. Verificare con sudo ufw status; se 10000 non è elencata, aprirla con sudo ufw allow 10000/tcp oppure, preferibilmente, lasciarla chiusa e usare il tunnel SSH dell'Opzione B. La distinzione è importante: un timeout indica che un firewall sta eliminando silenziosamente i pacchetti, mentre ERR_CONNECTION_REFUSED indica invece che la porta è raggiungibile ma Webmin non è in esecuzione; verificare sudo systemctl status webmin.
"Access denied for <your IP>." Hai configurato IP Access Control nell'Opzione A e l'indirizzo corrente non è incluso nell'elenco degli indirizzi consentiti. Potrebbe trattarsi di un indirizzo IP dinamico cambiato oppure di un errore di digitazione. Non è possibile ripristinare l'accesso dal browser. Correzione dalla console: modificare la riga allow= in /etc/webmin/miniserv.conf, correggerla o eliminarla, quindi eseguire sudo systemctl restart webmin.
"Login failed. Please try again." con credenziali sicuramente corrette. L'account non ha una password Unix, una configurazione standard nelle immagini cloud che usano esclusivamente chiavi. Webmin esegue l'autenticazione tramite PAM usando la password Unix, che per quell'utente non esiste. Correzione: eseguire sudo passwd youruser sul server, quindi effettuare l'accesso. Se /var/webmin/miniserv.log mostra Non-existent login as ..., stai inserendo un nome utente che non corrisponde ad alcun account Unix.
Per più di un paio di server, l'automazione è più scalabile rispetto a un pannello di controllo installato su ogni macchina: il tuo primo playbook Ansible è il punto di partenza.
FAQ
Webmin è sicuro se esposto su Internet pubblico?
Considera un'istanza di Webmin esposta a Internet come una shell root con una pagina di accesso, perché è esattamente questo. È sufficientemente sicura solo se la proteggi a più livelli: un certificato valido, l'autenticazione a due fattori, Fail2ban e una whitelist IP restrittiva o, meglio ancora, nessuna esposizione pubblica. La configurazione con il rischio minore associa Webmin a 127.0.0.1 e lo raggiunge tramite un tunnel SSH, in modo che la porta 10000 non risponda a nessuno su Internet pubblico.
Come posso eliminare l'avviso relativo al certificato di Webmin?
L'avviso (NET::ERR_CERT_AUTHORITY_INVALID) compare perché Webmin distribuisce un certificato autofirmato. Emetti un certificato valido da Webmin, Webmin Configuration, SSL Encryption, Let's Encrypt, usando un nome DNS che punti al server e un servizio che esponga la challenge sulla porta 80 per la convalida. Se raggiungi Webmin esclusivamente tramite un tunnel SSH verso localhost, l'avviso è innocuo: SSH cifra e autentica già la connessione e puoi accettare senza rischi il certificato autofirmato.
Come posso limitare Webmin al solo mio indirizzo IP?
Apri Webmin, Webmin Configuration, IP Access Control, seleziona "Only allow from listed addresses" e inserisci il tuo IP pubblico da curl ifconfig.me. Webmin memorizza questa impostazione nella riga allow= di /etc/webmin/miniserv.conf. Presta attenzione agli IP dinamici delle connessioni domestiche: se l'indirizzo cambia, perdi l'accesso e devi correggere la riga allow= dalla console del server. In pratica, un indirizzo statico o il metodo del tunnel SSH sono più affidabili.
Perché l'accesso non riesce anche se la password è corretta?
Webmin esegue l'autenticazione tramite PAM usando la password Unix. Le immagini cloud usano generalmente solo chiavi e non impostano una password per l'account predefinito. PAM non trova quindi alcuna password da verificare e rifiuta l'accesso. Esegui sudo passwd youruser sul server per impostarne una, quindi accedi. Una riga Non-existent login as ... in /var/webmin/miniserv.log indica invece che il nome utente non corrisponde a un account Unix reale.
A cosa serve Webmin rispetto al semplice SSH?
Webmin offre un livello di individuazione e praticità. È utile per sfogliare i file di log, gestire utenti e cron, modificare le regole del firewall e controllare lo stato dei dischi e dei servizi senza dover memorizzare ogni comando. Questo è pratico per gli amministratori occasionali o per i team con competenze diverse. SSH è più veloce, può essere usato negli script ed espone una superficie di attacco molto più ridotta per le attività ordinarie. Molti amministratori usano entrambi: SSH per le attività quotidiane e Webmin associato a localhost e raggiunto tramite un tunnel per le operazioni occasionali eseguite dall'interfaccia grafica. Se la domanda riguarda quale pannello scegliere, invece del confronto tra pannello e shell, conviene valutare prima Cockpit e Webmin, perché i due prodotti differiscono sia per la quantità di componenti del sistema che possono modificare, sia per il metodo con cui autenticano l'utente.