SSD Nodes Learn
Guide Matt ConnorDi Matt Connor · Aggiornato 2026-07-24

Installare Webmin su Ubuntu 24.04 e securizzarlo

Guida all'installazione di Webmin su Ubuntu 24.04. Impara a configurare Let's Encrypt, SSH tunnel, 2FA e Fail2ban sulla porta 10000 per proteggere il server.

Cosa stai configurando

Webmin è un pannello di controllo web che fornisce un'interfaccia tramite browser per l'intero server Linux — utenti, pacchetti, cron job, firewall, Apache, BIND, dischi e altri cento moduli — accessibile via HTTPS sulla porta 10000. L'installazione richiede tre comandi e circa un minuto. Questa guida si concentra principalmente sulla seconda metà perché Webmin effettua il login come root e può eseguire qualsiasi operazione consentita all'utente root. Un Webmin aperto o senza autenticazione non è "un rischio da gestire"; è un compromesso totale del server con una pagina di login davanti. Installa il software in dieci minuti, poi dedica il resto dell'ora a garantire che solo tu possa accedervi.

Prerequisiti e un avvertimento importante

Un VPS Ubuntu 24.04 KVM appena installato con un utente root o sudo. Webmin è scritto in Perl ed è leggero: 1 GB di RAM sono sufficienti e l'occupazione di memoria in idle è inferiore a un quarto di gigabyte. Webmin ascolta sulla porta TCP 10000 tramite il proprio web server integrato (miniserv.pl), non tramite Apache o nginx; pertanto non è necessario installare altri software preventivamente.

È necessario decidere due aspetti prima di iniziare. Primo, l'account per il login: Webmin autentica gli utenti Unix tramite PAM, quindi l'accesso avviene come root o come utente nel gruppo sudo utilizzando la password Unix di tale account. Le immagini cloud utilizzano solitamente solo chiavi SSH e l'utente predefinito non ha una password impostata; Webmin non può effettuare il login su un account senza password. Imposta una password con sudo passwd youruser prima di procedere, altrimenti il login fallirà indipendentemente da ciò che viene digitato.

Secondo, e questo è l'avvertimento: non limitarti ad aprire la porta 10000 su internet. Decidi subito se accedere a Webmin tramite un tunnel SSH (scelta consigliata, nessuna porta esposta) o se limitare l'accesso al proprio IP. Questa decisione influenzerà ogni passaggio successivo; leggi entrambe le opzioni prima di configurare il firewall.

Install Webmin from the official repository

Webmin pubblica un repository apt firmato. Lo script di installazione aggiunge il repository e la relativa chiave di firma GPG. In questo modo, le future esecuzioni di apt upgrade scaricheranno Webmin come qualsiasi altro pacchetto. Riceverai aggiornamenti autenticati invece di un .deb scaricato che non si aggiorna automaticamente.

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 visualizza le operazioni che eseguirà e chiede Setup repository? (y/N) — rispondi y. Al termine, installa il pacchetto. Il flag --install-recommends scarica le dipendenze comuni dei moduli Perl e SSL per evitare errori di libreria mancante durante l'uso dei singoli moduli.

sudo apt-get install --install-recommends webmin

Webmin ha cambiato il nome di questo script in passato — le guide datate fanno riferimento a setup-repos.sh — quindi, se l'URL restituisce un errore 404, copia il comando diretto da webmin.com/download invece di usare un nome fisso. 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 attivo, la configurazione si trova in /etc/webmin, i log delle richieste sono in /var/webmin/miniserv.log e i tentativi di login falliti vengono inviati al syslog — su Ubuntu 24.04, al journal di systemd.

Verifica che il servizio sia attivo e in ascolto prima di aprire il browser:

sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000

È necessario uno stato active (running) e una riga che mostri miniserv.pl associato a 0.0.0.0:10000 — l'indirizzo cambierà in 127.0.0.1:10000 dopo aver attivato il tunnel descritto sotto. Se ss non mostra nulla sulla porta 10000, Webmin non è partito; consulta journalctl -u webmin -n 50 prima di procedere.

Primo login e avviso del certificato

Indirizza il browser su https://YOUR_SERVER_IP:10000. Su un sistema appena installato si verificano due situazioni.

Se ufw è attivo — l'immagine server standard di Ubuntu lo include disattivato, ma molti provider lo pre-abilitano — la pagina non si caricherà affatto; questo problema è descritto nei casi di errore riportati di seguito. Se la porta è aperta, il browser bloccherà l'intera pagina: "Your connection is not private" con il codice NET::ERR_CERT_AUTHORITY_INVALID su Chrome, oppure SEC_ERROR_UNKNOWN_ISSUER / "Warning: Potential Security Risk Ahead" su Firefox. Questo comportamento è previsto e non indica un attacco. Webmin ha generato un certificato self-signed durante l'installazione (/etc/webmin/miniserv.pem) e, poiché nessuna autorità di certificazione lo convalida, il browser non si fida del certificato. La connessione è comunque criptata; non è semplicemente convalidata. Per ora procedi cliccando su (Advanced, poi Proceed) — sostituiremo questo certificato correttamente più avanti.

Effettua il login con root o con il tuo utente sudo e la relativa password Unix per accedere alla dashboard System Information. Un errore comune consiste nel digitare http:// invece di https://. miniserv risponde in HTTP semplice su quella porta con il seguente testo: "This web server is running in SSL mode. Try the URL https://..." — la soluzione consiste nel cambiare http in https nella barra degli indirizzi.

La decisione sulla sicurezza: come accederai a Webmin?

Arriviamo alla parte fondamentale. Un pannello con privilegi di root non deve essere esposto su internet aperto per rispondere ai tentativi di login di ogni scanner presente sul pianeta. Esistono due opzioni valide, elencate in ordine di preferenza.

L'opzione B con tunnel SSH è la migliore, poiché non espone alcun servizio. L'opzione A con allowlist IP è accettabile solo se l'indirizzo IP è statico. Non implementare nessuna delle due è l'errore che questa guida mira a prevenire. Se preferisci accedere a Webmin tramite una rete privata, posiziona il server dietro un VPN WireGuard self-hosted e configura Webmin per rispondere sull'indirizzo del tunnel invece di quello pubblico.

Opzione A: limitare l'accesso di Webmin al proprio IP

Nel pannello, aprire Webmin, quindi Webmin Configuration, quindi IP Access Control. Selezionare "Only allow from listed addresses" e inserire il proprio IP pubblico, che è possibile trovare eseguendo curl ifconfig.me sul proprio laptop. Salvare. Webmin scrive questa impostazione sulla riga allow= in /etc/webmin/miniserv.conf e si riavvia.

Il rischio: se l'IP di casa è dinamico e cambia, o se si inserisce un indirizzo errato, si perde l'accesso al sistema. Il browser mostrerà l'errore "Access denied for <your IP>" senza mostrare il modulo di login; non è possibile tornare all'interfaccia tramite browser. È necessario risolvere il problema dalla console del server tramite SSH o tramite il 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

Eliminare la riga allow= ripristina l'accesso libero. Utilizzare questa procedura solo per il recupero e impostare immediatamente un valore corretto.

L'opzione migliore rispetto a qualsiasi allowlist consiste nel non ascoltare affatto sull'interfaccia pubblica. Configura miniserv per ascoltare solo su loopback, quindi connettiti tramite un tunnel SSH criptato già autorizzato.

Modifica /etc/webmin/miniserv.conf e aggiungi, o modifica, questa riga:

bind=127.0.0.1

Riavvia con sudo systemctl restart webmin. Webmin non è più raggiungibile da internet: una scansione delle porte sulla 10000 non restituisce risultati e il controllo ss effettuato in precedenza mostra che il servizio è vincolato a 127.0.0.1:10000. Dal tuo laptop, apri un tunnel:

ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IP

Mantieni la sessione aperta e naviga su https://localhost:10000. Il traffico passa all'interno di SSH, che è già autenticato tramite la tua chiave e criptato; puoi quindi accettare in sicurezza il certificato self-signed — il livello SSH fornisce la protezione reale. Chiudi la sessione SSH e Webmin non sarà più accessibile. Non è necessario configurare allowlist, non ci sono servizi esposti e non ci sono servizi extra da mettere in sicurezza.

Se configuri bind=127.0.0.1 e dimentichi il tunnel, l'accesso remoto si interrompe semplicemente: si tratta del funzionamento previsto, non di un errore. Recupera l'accesso come descritto nell'Option A: dalla console, rimuovi la riga bind oppure imposta bind=0.0.0.0, quindi riavvia. Questo è lo stesso metodo di tunneling utilizzato per connettersi a una macchina di sviluppo remota che esegue Claude Code in tmux — una sola sessione SSH, tutto privato, nessun servizio aggiuntivo in ascolto sull'interfaccia pubblica.

Sostituire il certificato self-signed con uno reale

Se Webmin è esposto tramite un hostname come descritto nell'Opzione A, è possibile rimuovere l'avviso del browser utilizzando un certificato Let's Encrypt reale. È necessario 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 validazione.

Webmin include questa funzione: Webmin, poi Webmin Configuration, poi SSL Encryption, poi la tab Let's Encrypt. Inserire l'hostname, impostare la "website root directory" su un percorso servito sulla porta 80 per quel dominio e richiedere il certificato. Webmin ottiene il certificato, aggiorna le righe certfile= e keyfile= in miniserv.conf e lo rinnova automaticamente prima della scadenza. Ricaricare la pagina per rimuovere l'icona di avviso.

L'unico ostacolo: il server di Webmin utilizza la porta 10000, non la 80. Pertanto, la challenge http-01 richiede un web server reale — Apache o nginx — che risponda per panel.example.com sulla porta 80, oppure una validazione basata su DNS. Su un sistema con solo Webmin e nessun servizio sulla porta 80, la richiesta fallisce con un errore di validazione finché non si fornisce a Let's Encrypt un modo per raggiungere il file di challenge. Il funzionamento — record DNS, challenge sulla porta 80 e rinnovo — è identico all'emissione di un certificato per qualsiasi sito web. Per approfondire, la guida ai certificati TLS Let's Encrypt con Certbot e nginx descrive dettagliatamente il flusso di validazione e la configurazione DNS. Se è stato utilizzato un tunnel SSH, è possibile saltare questa sezione: il certificato self-signed è sufficiente tramite SSH, e un certificato reale emesso per panel.example.com genererebbe comunque un errore di mismatch del nome visitando https://localhost:10000.

Attivare l'autenticazione a due fattori

Una password da sola non garantisce una protezione sufficiente per il pannello root; è necessario aggiungere un secondo fattore. Apri Webmin, quindi Webmin Configuration, quindi Two-Factor Authentication. Seleziona il provider Google Authenticator — utilizza lo standard TOTP, quindi è compatibile con Authy, 1Password o qualsiasi app di autenticazione — e salva. Webmin installa il modulo Perl necessario (Authen::OATH più un generatore QR) e abilita la funzione; questo passaggio da solo non protegge ancora alcun account.

Ogni account deve quindi configurare il proprio dispositivo. Con il 2FA abilitato, apri Webmin, quindi Webmin Users, seleziona l'account, scegli Enable Two-Factor For User e Webmin mostrerà un codice QR; scansionalo con l'app e inserisci un codice generato per confermare. Da quel momento, il login richiederà il token a sei cifre dopo la password. Completa la configurazione prima di disconnetterti — se il 2FA è richiesto ma l'account non ha mai scansionato un codice, è possibile rimuovere il requisito dalla console, ma configurare il dispositivo in anticipo è molto più semplice.

Aggiungere Fail2ban per bloccare i tentativi di brute-force

Anche un endpoint di login limitato deve sanzionare i tentativi falliti ripetuti. Webmin riporta i login falliti in syslog con il formato webmin[12345]: Invalid login as root from 10.0.0.9, o Non-existent login as ... per username non presenti tra gli account Unix. Su Ubuntu 24.04 queste righe finiscono nel journal di systemd, poiché l'immagine standard non include /var/log/auth.log. Fail2ban include un filtro webmin-auth predefinito che identifica esattamente queste due righe; la jail indicata di seguito imposta backend = systemd autonomamente, quindi non richiede regex o percorsi di log personalizzati.

Creare /etc/fail2ban/jail.d/webmin.local:

[webmin-auth]
enabled  = true
port     = 10000
filter   = webmin-auth
backend  = systemd
maxretry = 4
bantime  = 1h

Ricaricare con sudo systemctl restart fail2ban, quindi confermare che la jail sia attiva:

sudo fail2ban-client status webmin-auth

Inizialmente la jail apparirà nell'elenco con un contatore di ban pari a zero (con il backend journal non è presente la riga File list:). Per verificare il corretto funzionamento, forzare intenzionalmente alcuni tentativi di login falliti da un'altra rete, quindi eseguire nuovamente il comando status e osservare l'aumento di Currently banned. Se il valore non aumenta, verificare di non testare da un indirizzo incluso nella ignoreip di Fail2ban e eseguire journalctl SYSLOG_IDENTIFIER=webmin sul server per confermare che le righe Invalid login vengano effettivamente scritte. Se Fail2ban non è ancora installato su questo sistema, la guida Fail2ban su Ubuntu 24.04 per SSH copre l'installazione e la jail SSH da eseguire parallelamente a questa.

Limit l'accesso degli utenti Webmin

Non tutti gli utenti che necessitano del pannello devono avere i privilegi root. Sotto Webmin, poi Webmin Users, crea nuovi account Webmin e assegna a ciascuno solo i moduli necessari; ad esempio, un operatore per i backup che può visualizzare solo i moduli cron e filesystem. Modificando un utente, viene visualizzato un elenco di tutti i moduli; deselezionando un modulo, questo viene rimosso dal menu dell'utente e gli URL corrispondenti vengono bloccati. Questo approccio garantisce una difesa in profondità: anche una sessione Webmin rubata con privilegi limitati non può riscrivere /etc/shadow se il modulo Users non è presente nell'elenco.

Mantenere Webmin aggiornato

Poiché l'installazione è avvenuta tramite il repository apt, sudo apt update && sudo apt upgrade scarica le nuove versioni di Webmin insieme al resto del sistema. Applica le patch tempestivamente: un pannello di controllo è un bersaglio comune. Webmin può aggiornarsi autonomamente tramite Webmin, poi Webmin Configuration, poi Upgrade Webmin, ma il metodo apt è più pulito su Ubuntu perché mantiene le versioni coerenti con la gestione degli altri pacchetti. Non considerare questo passaggio come opzionale: diverse passate CVE di Webmin riguardavano bug di remote-code-execution; l'unica differenza tra un sistema "patchato" e uno "compromesso" era la velocità con cui l'amministratore eseguiva l'upgrade.

Modalità di errore e stringhe visualizzate

"Your connection is not private" / NET::ERR_CERT_AUTHORITY_INVALID. Appare al primo caricamento. Causa: il certificato self-signed generato da Webmin durante l'installazione non ha un emittente fidato. Non si tratta di un attacco; il canale è criptato, ma non è verificato. Soluzione: procedere ignorando l'avviso per ora, quindi richiedere un certificato Let's Encrypt reale, oppure accettarlo permanentemente se si accede a Webmin tramite un tunnel SSH.

"This web server is running in SSL mode. Try the URL https://..." È stato digitato http://server:10000. miniserv comunica solo tramite TLS su quella porta e lo segnala in chiaro. Soluzione: cambiare http in https nella barra degli indirizzi.

Page times out — ERR_CONNECTION_TIMED_OUT / "This site can't be reached". La richiesta non raggiunge mai Webmin. Su Ubuntu, la causa è quasi sempre ufw che scarta la porta 10000. Verificare con sudo ufw status; se la porta 10000 non è nell'elenco, aprirla con sudo ufw allow 10000/tcp o, preferibilmente, lasciarla chiusa e utilizzare il tunnel SSH dell'Opzione B. Nota la differenza: 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 — verificare sudo systemctl status webmin.

"Access denied for <your IP>." È stato configurato l'IP Access Control sotto l'Opzione A e l'indirizzo attuale non è nell'elenco consentito — un IP dinamico cambiato o un errore di battitura. Non è possibile tornare indietro tramite browser. Soluzione da console: modificare la riga allow= in /etc/webmin/miniserv.conf, correggerla o eliminarla, e eseguire sudo systemctl restart webmin.

"Login failed. Please try again." con credenziali corrette. L'account non ha una password Unix, come avviene di default nelle immagini cloud basate solo su chiavi. Webmin autentica tramite PAM utilizzando la password Unix, ma tale password non esiste per l'utente. Soluzione: eseguire sudo passwd youruser sul server, quindi effettuare il login. Se /var/webmin/miniserv.log mostra Non-existent login as ..., si sta digitando un nome utente che non è un account Unix.

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

FAQ

È sicuro esporre Webmin su internet?

Considera un'istanza di Webmin esposta su internet come una shell root con una pagina di login. La sicurezza è garantita solo tramite una strategia a più livelli: un certificato valido, l'autenticazione a due fattori, Fail2ban e una lista di IP autorizzati molto restrittiva o, preferibilmente, nessuna esposizione pubblica. La configurazione a minor rischio consiste nel vincolare Webmin a 127.0.0.1 e accedervi tramite un tunnel SSH; in questo modo la porta 10000 non risponde a nessuno su internet.

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

L'avviso (NET::ERR_CERT_AUTHORITY_INVALID) appare perché Webmin utilizza un certificato self-signed. Genera un certificato valido tramite Webmin, Webmin Configuration, SSL Encryption, Let's Encrypt, utilizzando un nome DNS che punti al server e che sia in grado di gestire la sfida port-80 per la validazione. Se accedi a Webmin esclusivamente tramite un tunnel SSH verso localhost, l'avviso non è pericoloso, poiché SSH cripta e autentica già la connessione; in questo caso è possibile accettare il certificato self-signed.

Come posso limitare l'accesso di Webmin solo al mio indirizzo IP?

Vai su Webmin, Webmin Configuration, IP Access Control, seleziona "Only allow from listed addresses" e inserisci il tuo IP pubblico ottenuto da curl ifconfig.me. Webmin salva questa impostazione nella riga allow= di /etc/webmin/miniserv.conf. Attenzione agli IP domestici dinamici: se l'indirizzo cambia, rimarrai bloccato e dovrai correggere la riga allow= dalla console del server. Per questo motivo, un indirizzo statico o l'uso del tunnel SSH sono metodi più affidabili.

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

Webmin autentica tramite PAM utilizzando la password Unix. Le immagini cloud solitamente utilizzano solo chiavi SSH e non hanno una password impostata per l'account predefinito; di conseguenza, PAM non trova corrispondenze e l'accesso viene rifiutato. Esegui sudo passwd youruser sul server per impostare una password, quindi effettua il login. Una riga Non-existent login as ... in /var/webmin/miniserv.log indica invece che lo username non è un account Unix valido.

Quali sono i vantaggi di Webmin rispetto a SSH?

Webmin è uno strato di gestione semplificata. È utile per consultare i file di log, gestire utenti e cron, modificare le regole del firewall e monitorare lo stato di dischi e servizi senza dover memorizzare ogni comando; è ideale per amministratori occasionali o team con competenze miste. SSH è più veloce, è utilizzabile tramite script e presenta una superficie di attacco molto più ridotta per le attività di routine. Molti amministratori utilizzano entrambi: SSH per l'operatività quotidiana e Webmin vincolato a localhost tramite tunnel per operazioni sporadiche tramite interfaccia grafica.