SSD Nodes Learn Hosting plans →
Guide Matt ConnorDi Matt Connor

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 un intero server Linux: utenti, pacchetti, cron job, firewall, Apache, BIND, dischi e circa un centinaio di altri moduli, raggiungibile tramite HTTPS sulla porta 10000. L'installazione richiede tre comandi e circa un minuto. Il motivo per cui questa guida dedica la maggior parte dello spazio alla seconda fase è che Webmin accede come root e può eseguire qualsiasi operazione consentita a root. Un'istanza di Webmin esposta senza restrizioni o priva di autenticazione non è semplicemente «un rischio da gestire»: comporta la compromissione completa del server, con una pagina di accesso davanti. Installa quindi Webmin in dieci minuti, poi dedica il resto dell'ora a verificare che possa raggiungerlo soltanto tu.

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 installano Webmin come qualsiasi altro pacchetto. In questo modo si ricevono aggiornamenti autenticati invece di 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.sh

Lo script mostra le operazioni che sta per eseguire e richiede Setup Webmin stable 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 a causa di librerie mancanti.

sudo apt-get install --install-recommends webmin

In passato Webmin ha rinominato questo script. Le guide meno recenti fanno riferimento a setup-repos.sh. Se l'URL diretto restituisce un errore 404, recuperare l'unica riga di comando aggiornata 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 gli accessi falliti vengono scritti in 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

Lo stato deve essere active (running) e deve comparire una riga che mostra miniserv.pl associato a 0.0.0.0:10000. L'indirizzo cambia in 127.0.0.1:10000 quando si utilizza il tunnel descritto più avanti. 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 webmin

L'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.1

Riavvia 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_IP

Lascia 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 un certificato valido

Se esponi Webmin tramite l'Opzione A, elimina l'avviso del browser usando un certificato Let's Encrypt valido. Ti servono un nome per il certificato e un modo per consentire a Let's Encrypt di raggiungere la porta 80 durante la validazione. Di solito il nome è un nome DNS, ad esempio panel.example.com, con un record A che punta al server. A partire da Webmin 2.650 (rilasciato il 25 giugno 2026), può essere anche l'indirizzo IP pubblico del server, purché sia installato Certbot 5.3 o versione successiva. Let's Encrypt rilascia certificati per indirizzi IP solo con il profilo a breve durata, valido per circa sei giorni. Imposta quindi l'intervallo di rinnovo automatico di Webmin in giorni: Webmin non accetta un intervallo più lungo per un certificato IP.

Webmin integra questa funzione: Webmin, quindi Webmin Configuration, quindi SSL Encryption, quindi la scheda Let's Encrypt. Inserisci il nome host o l'indirizzo IP, scegli un metodo di validazione e invia la richiesta. Webmin ottiene il certificato, aggiorna le righe certfile= e keyfile= in miniserv.conf e rinnova automaticamente il certificato prima della scadenza. Ricarica la pagina: il lucchetto non mostra più avvisi.

L'unico aspetto da gestire è questo: il server di Webmin è in ascolto sulla porta 10000, non sulla porta 80. Pertanto, qualcosa deve rispondere alla challenge http-01 sulla porta 80. Hai tre possibilità. Se Apache o nginx pubblica già il nome sulla porta 80, indica la directory dei documenti di quel sito come destinazione della validazione (per un indirizzo IP è necessario Certbot 5.4 o versione successiva). Se sulla porta 80 non è in ascolto alcun servizio, scegli il server Web integrato di Certbot, cioè la modalità standalone aggiunta da Webmin nella versione 2.110. Certbot avvia temporaneamente il proprio server Web sulla porta 80. Certbot deve quindi essere installato e la porta 80 deve essere libera e consentita dal firewall. In alternativa, usa la validazione DNS, che funziona per i nomi host ma non per gli indirizzi IP. Il pacchetto certbot incluso in Ubuntu 24.04 è alla versione 2.9. È sufficiente per la validazione standalone di un nome host, ma è troppo vecchio per i certificati IP. Per questi certificati, installa una versione aggiornata di Certbot, ad esempio lo snap, che a ottobre 2026 era alla versione 5.8. Senza una di queste opzioni, la richiesta fallisce con un errore di validazione. La procedura, i record DNS, la challenge sulla porta 80 e il rinnovo sono gli stessi usati per rilasciare un certificato per qualsiasi sito Web. Per il contesto completo, la guida ai certificati TLS Let's Encrypt con Certbot e nginx descrive in dettaglio il flusso di validazione e la configurazione DNS. Se hai scelto il metodo del tunnel SSH, puoi ignorare completamente questa sezione: il certificato autofirmato è sufficiente dietro SSH e un certificato valido rilasciato per panel.example.com mostrerebbe comunque un avviso di nome non corrispondente 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  = 1h

Ricaricare la configurazione con sudo systemctl restart fail2ban, quindi verificare che il jail sia attivo:

sudo fail2ban-client status webmin-auth

Il 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 messaggi visualizzati

"La connessione non è privata" / NET::ERR_CERT_AUTHORITY_INVALID. Viene visualizzato al primo accesso. 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. Soluzione: per il momento, proseguire oltre l'avviso, quindi emettere un certificato Let's Encrypt valido oppure accettare definitivamente quello esistente se si accede a Webmin tramite un tunnel SSH.

"Questo server web è in modalità SSL. Provare l'URL https://...". È stato digitato http://server:10000. miniserv usa TLS esclusivamente su quella porta e lo comunica in testo semplice. Soluzione: modificare http in https nella barra degli indirizzi.

La pagina va in timeout, ERR_CONNECTION_TIMED_OUT / "Impossibile raggiungere il sito". La richiesta non arriva mai a Webmin. Su Ubuntu, spesso ufw scarta la porta 10000, ma è necessario verificare prima di concludere che la causa sia questa. Eseguire sudo ufw status. Se restituisce Status: inactive, ufw non sta bloccando nulla (Ubuntu lo distribuisce disabilitato e l'aggiunta di una regola allow non lo abilita), quindi controllare un livello precedente, ad esempio il firewall nel pannello di controllo del provider. Se restituisce Status: active, eseguire sudo ufw status verbose per visualizzare la policy predefinita sul traffico in ingresso e le regole più generiche; se il traffico in ingresso è negato e 10000 non è elencata, aprirla con sudo ufw allow 10000/tcp oppure, meglio, lasciarla chiusa e usare il tunnel SSH dell'Opzione B. La distinzione è importante: un timeout indica che un firewall sta scartando silenziosamente i pacchetti, mentre ERR_CONNECTION_REFUSED indica che la porta è raggiungibile ma Webmin non è in esecuzione; controllare sudo systemctl status webmin.

"Accesso negato per <your IP>." È stato configurato IP Access Control nell'Opzione A, ma l'indirizzo corrente non è incluso nell'elenco consentito. Potrebbe trattarsi di un IP dinamico cambiato oppure di un errore di digitazione. Non esiste un percorso di ripristino tramite browser. Risolvere dalla console: modificare la riga allow= in /etc/webmin/miniserv.conf, correggerla o eliminarla, quindi eseguire sudo systemctl restart webmin.

"Accesso non riuscito. Riprovare." con credenziali sicuramente corrette. L'account non dispone di una password Unix, una situazione standard nelle immagini cloud che usano esclusivamente chiavi. Webmin esegue l'autenticazione tramite PAM usando la password Unix, ma per l'utente la password non esiste. Soluzione: eseguire sudo passwd youruser sul server, quindi accedere. Se /var/webmin/miniserv.log mostra Non-existent login as ..., è stato inserito un nome utente che non corrisponde ad alcun account Unix.

Per più di un paio di server, l'automazione è più scalabile rispetto all'installazione di un pannello di controllo su ogni macchina: il primo playbook Ansible è il punto di partenza.

FAQ

Webmin è sicuro da esporre su Internet?

Considera Webmin esposto a Internet come una shell root con una pagina di accesso, perché è esattamente questo. È sufficientemente sicuro solo se protetto su più livelli: un certificato valido, l'autenticazione a due fattori, Fail2ban e una whitelist IP restrittiva o, meglio ancora, nessuna esposizione pubblica. La configurazione a rischio più basso associa Webmin a 127.0.0.1 e consente di raggiungerlo tramite un tunnel SSH, così la porta 10000 non risponde a nessuno su Internet.

Come posso eliminare l'avviso relativo al certificato di Webmin?

L'avviso (NET::ERR_CERT_AUTHORITY_INVALID) compare perché Webmin include un certificato autofirmato. Emetti un certificato valido da Webmin, Webmin Configuration, SSL Encryption, Let's Encrypt. Usa un nome DNS che punti al server oppure l'indirizzo IP pubblico del server se è installato Certbot 5.3 o versione successiva. La porta 80 deve essere raggiungibile per la challenge, gestita da un web server esistente oppure dal server standalone di Certbot. Se raggiungi Webmin esclusivamente tramite un tunnel SSH verso localhost, l'avviso non è un problema: SSH cifra e autentica già la connessione e puoi accettare senza rischi il certificato autofirmato.

Come posso limitare Webmin al solo mio indirizzo IP?

Vai in Webmin, Webmin Configuration, IP Access Control, seleziona "Only allow from listed addresses" e inserisci il tuo IP pubblico indicato da curl ifconfig.me. Webmin memorizza questa impostazione nella riga allow= di /etc/webmin/miniserv.conf. Presta attenzione agli indirizzi 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 è più affidabile.

Perché l'accesso non riesce anche se la password è corretta?

Webmin esegue l'autenticazione tramite PAM usando la password Unix. Le immagini cloud sono in genere configurate per usare esclusivamente le chiavi e l'account predefinito non ha una password impostata. PAM non trova quindi una 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 solo SSH?

Webmin offre un'interfaccia per individuare più facilmente le funzioni e svolgere le attività amministrative. È utile per consultare i file di log, gestire utenti e cron, modificare le regole del firewall e verificare lo stato dei dischi e dei servizi senza dover ricordare ogni comando. È particolarmente pratico per amministratori occasionali o team con competenze diverse. Il solo SSH è più rapido, può essere usato negli script ed espone una superficie di attacco molto più ridotta per le attività ordinarie. Molti amministratori usano entrambi: SSH per l'amministrazione quotidiana e Webmin associato a localhost e raggiunto tramite un tunnel per le attività occasionali eseguite con l'interfaccia grafica. Se la domanda riguarda quale pannello scegliere, anziché il confronto tra pannello e shell, conviene valutare prima Cockpit rispetto a Webmin, perché i due strumenti differiscono sia per la quantità di componenti del sistema che possono modificare sia per il metodo di autenticazione.