Un VPS appena creato è raggiungibile da tutta Internet già dal primo minuto, e i tentativi automatici di accesso SSH arrivano molto prima di quanto si pensi. Questa guida mette in sicurezza un server Ubuntu 26.04 LTS (o Debian 13) in circa un quarto d’ora: utente amministrativo, chiavi SSH, password disattivate, firewall, aggiornamenti automatici e qualche ritocco utile, con un controllo concreto dopo ogni passo.
In breve
- Tempo: 15–25 minuti.
- Difficoltà: facile, ma richiede attenzione nei passi su SSH.
- Cosa serve: un VPS con Ubuntu 26.04 LTS o Debian 13, l’indirizzo IP e le credenziali iniziali del provider, un PC con Windows 11, macOS o Linux e il client OpenSSH (già incluso in tutti e tre).
Versioni di riferimento: Ubuntu 26.04 LTS (OpenSSH 10.2, UFW 0.36.2, unattended-upgrades 2.12), Debian 13 “trixie” per le differenze segnalate. Procedura verificata sulla documentazione ufficiale al 4 novembre 2026.
Prima di cominciare: la regola della seconda sessione
L’unico modo per rovinare questa procedura è chiudersi fuori dal server. Per questo vale una regola semplice: ogni volta che toccate SSH o il firewall, lasciate aperta la sessione attuale e provate l’accesso da una seconda finestra del terminale. Chiudete la prima solo quando la seconda funziona.
Come rete di sicurezza, individuate subito nel pannello del provider la console web (spesso chiamata VNC, KVM o “console”): permette di entrare anche quando SSH non risponde. Sapere dov’è prima di averne bisogno fa risparmiare molto tempo. Se il VPS ospita già dati, fate uno snapshot dal pannello prima di iniziare.
Attenzione: i provider consegnano il server in modi diversi. Alcuni danno accesso come root con password inviata via email, altri creano un utente (per esempio ubuntu) e chiedono già una chiave pubblica in fase di ordine. Adattate il passo 1 a quello che avete ricevuto: se esiste già un utente con sudo e una chiave funzionante, potete saltare ai passi successivi.
Passo 1: aggiornare il sistema
Collegatevi con le credenziali ricevute (sostituite IP_VPS con l’indirizzo del server) e aggiornate tutto prima di qualsiasi altra cosa:
ssh root@IP_VPS
apt update
apt full-upgradeSe l’aggiornamento ha installato un nuovo kernel, riavviate con reboot e ricollegatevi dopo un minuto.
Passo 2: creare un utente amministrativo
Lavorare sempre come root è scomodo da proteggere e rischioso negli errori di battitura. Create un utente vostro (al posto di NOMEUTENTE) e aggiungetelo al gruppo sudo:
adduser NOMEUTENTE
usermod -aG sudo NOMEUTENTEadduser chiede una password: sceglietene una robusta, servirà per sudo anche quando l’accesso SSH sarà solo a chiave.
Verifica: il comando groups NOMEUTENTE deve elencare anche sudo. Su Debian 13, se in installazione avete impostato una password di root, il pacchetto sudo potrebbe mancare: installatelo con apt install sudo prima di proseguire.
Passo 3: generare la chiave SSH sul vostro PC
La chiave si crea sul computer da cui vi collegate, non sul server. La documentazione di Ubuntu consiglia l’algoritmo Ed25519, che è anche quello predefinito delle versioni recenti di ssh-keygen. Il comando è identico su Linux, macOS e Windows (in PowerShell o nel Prompt dei comandi):
ssh-keygen -t ed25519 -C "NOMEUTENTE@pc-di-casa"Accettate il percorso proposto e impostate una passphrase: se qualcuno vi ruba il file della chiave privata, senza passphrase ha in mano il server. Il risultato sono due file in .ssh nella vostra cartella utente: id_ed25519 (privata, non va mai copiata altrove) e id_ed25519.pub (pubblica, va sul server).
Passo 4: copiare la chiave pubblica sul server
Da Linux e macOS
ssh-copy-id -i ~/.ssh/id_ed25519.pub NOMEUTENTE@IP_VPSDa Windows
Windows non include ssh-copy-id. Il metodo più semplice è mostrare la chiave pubblica in PowerShell e incollarla a mano:
Get-Content $env:USERPROFILE.sshid_ed25519.pubCopiate la riga che compare (inizia con ssh-ed25519), entrate nel server come NOMEUTENTE con la password e create il file delle chiavi autorizzate:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keysNell’editor incollate la riga su una sola linea, salvate con Ctrl+O e uscite con Ctrl+X.
Verifica: da una nuova finestra del terminale lanciate ssh NOMEUTENTE@IP_VPS. Deve chiedervi la passphrase della chiave, non la password dell’utente. Poi provate sudo whoami: la risposta deve essere root. Non proseguite finché questo non funziona.
Passo 5: disattivare password e accesso di root
Ora che la chiave funziona, togliamo di mezzo le password via SSH, il bersaglio di quasi tutti gli attacchi automatici. Su Ubuntu il file principale /etc/ssh/sshd_config include all’inizio tutti i file /etc/ssh/sshd_config.d/*.conf, e per la maggior parte delle direttive OpenSSH usa il primo valore che incontra. I file inclusi vengono letti in ordine alfabetico: per essere sicuri che le vostre impostazioni vincano, date al file un nome che venga per primo.
sudo nano /etc/ssh/sshd_config.d/00-hardwarfare.confContenuto del file:
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin noPrima di riavviare, controllate la sintassi (la documentazione di Ubuntu lo raccomanda espressamente, perché una configurazione sbagliata può impedire a SSH di ripartire) e poi applicate:
sudo sshd -t
sudo systemctl restart ssh.serviceVerifica: sudo sshd -T | grep -E 'passwordauthentication|permitrootlogin' mostra la configurazione realmente in uso: devono comparire passwordauthentication no e permitrootlogin no. Dal PC, in una nuova finestra, ssh -o PubkeyAuthentication=no NOMEUTENTE@IP_VPS deve fallire con Permission denied (publickey).: è la prova che la password non è più accettata.
Se sshd -T mostra ancora passwordauthentication yes, nella cartella sshd_config.d c’è un altro file che lo imposta prima del vostro (alcune immagini cloud lo aggiungono in fase di creazione): elencate i file con ls /etc/ssh/sshd_config.d/ e correggete il nome o il contenuto.
Passo 6: attivare il firewall UFW
UFW è il frontend per il firewall incluso in Ubuntu. Di default blocca tutto il traffico in entrata e consente quello in uscita. Prima di attivarlo bisogna permettere SSH, altrimenti la sessione cade. Il pacchetto di OpenSSH registra un profilo applicativo chiamato OpenSSH (porta 22/tcp):
sudo ufw allow OpenSSH
sudo ufw enableUFW avvisa con Command may disrupt existing ssh connections. Proceed with operation (y|n)?: rispondete y, la regola appena aggiunta mantiene viva la sessione. Su Debian 13 UFW non è preinstallato: sudo apt install ufw.
Verifica: sudo ufw status verbose deve riportare Status: active, la policy deny (incoming) e la regola 22/tcp (OpenSSH) ALLOW IN, sia per IPv4 sia per IPv6. Aprite una seconda sessione SSH per conferma.
Le altre porte si aprono solo quando servono: per un sito con Nginx sarà sudo ufw allow 'Nginx Full' (80 e 443). Molti provider offrono anche un firewall nel pannello, a monte del server: è un livello in più, ma ricordate di aprire lì le stesse porte.
Passo 7: aggiornamenti di sicurezza automatici
Su Ubuntu gli aggiornamenti di sicurezza non presidiati sono gestiti da unattended-upgrades. Assicuratevi che sia installato (se lo è già, il comando non fa nulla) e controllate che sia attivo:
sudo apt install unattended-upgrades
cat /etc/apt/apt.conf.d/20auto-upgradesIl file deve contenere entrambe le righe con valore "1":
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";Su Debian 13 la wiki ufficiale suggerisce di attivarlo con sudo dpkg-reconfigure unattended-upgrades.
Verifica: sudo unattended-upgrade -v --dry-run simula un giro senza installare nulla e mostra quali origini sono abilitate. I log reali finiscono in /var/log/unattended-upgrades/.
Di default il sistema non si riavvia da solo quando un aggiornamento (tipicamente il kernel) lo richiederebbe. Se il server può permettersi qualche minuto di fermo notturno, in /etc/apt/apt.conf.d/50unattended-upgrades potete togliere il commento e impostare Unattended-Upgrade::Automatic-Reboot "true"; e Unattended-Upgrade::Automatic-Reboot-Time "04:00";. L’orario segue il fuso del sistema: per questo il passo successivo conta.
Passo 8: fuso orario, nome host e swap
Molti VPS arrivano con fuso UTC. Per log e cron leggibili in ora italiana:
sudo timedatectl set-timezone Europe/Rome
timedatectlUn nome host riconoscibile evita di lanciare comandi sul server sbagliato:
sudo hostnamectl set-hostname NOME-SERVERI VPS più economici hanno 1–2 GB di RAM e spesso nessuna swap: un picco di memoria (un aggiornamento, un’importazione di database) può far intervenire il killer dei processi. Una swap su file da 2 GB fa da cuscinetto. Prima controllate con swapon --show che non ne esista già una: se l’elenco non è vuoto, saltate questo passo. Con util-linux recente (2.41 su Ubuntu 26.04), mkswap crea direttamente il file con i permessi corretti:
sudo mkswap --size 2G --file /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabVerifica: swapon --show deve elencare /swapfile con dimensione 2G, e free -h la riga Swap valorizzata. Dopo un riavvio la swap deve comparire ancora: se manca, controllate la riga aggiunta a /etc/fstab.
La checklist dei primi 15 minuti
| Controllo | Comando | Esito atteso |
|---|---|---|
| Accesso a chiave | ssh NOMEUTENTE@IP_VPS | chiede la passphrase, non la password |
| Password SSH spente | sudo sshd -T | grep passwordauthentication | passwordauthentication no |
| Root non ammesso | sudo sshd -T | grep permitrootlogin | permitrootlogin no |
| Firewall attivo | sudo ufw status verbose | active, deny incoming, 22/tcp aperta |
| Aggiornamenti automatici | cat /etc/apt/apt.conf.d/20auto-upgrades | due righe a “1” |
| Ora corretta | timedatectl | Time zone: Europe/Rome |
| Swap | swapon --show | /swapfile presente |
Se qualcosa va storto
Permission denied (publickey).con la chiave giusta: quasi sempre sono i permessi. La documentazione di Ubuntu indica che solo l’utente deve poter scrivere suauthorized_keys: dalla console web lanciatechmod 700 ~/.sshechmod 600 ~/.ssh/authorized_keys, e verificate che il file appartenga all’utente giusto. Per vedere il motivo dal lato server,sudo journalctl -fu ssh.servicementre ritentate l’accesso.- La chiave ha una riga spezzata: se incollando da Windows la chiave finisce su più righe, OpenSSH non la riconosce. Riapritela con
nanoe riportatela su una sola linea. sshd -trestituisce un errore: indica file e riga. Correggete prima di riavviare; se avete già riavviato e SSH non risponde, entrate dalla console web e rinominate il vostro file in.conf.bak.- La connessione si blocca dopo
ufw enable: avete attivato il firewall senza la regola per SSH, oppure il server ascolta su una porta diversa dalla 22. Dalla console web:sudo ufw allow OpenSSH(o la porta reale), poisudo ufw status. sudo: unable to resolve hostdopo il cambio di nome: aggiungete il nuovo nome host alla riga127.0.1.1in/etc/hosts.
Come tornare indietro
Ogni modifica è reversibile senza reinstallare. Per riattivare le password SSH basta cancellare il file aggiunto e riavviare il servizio: sudo rm /etc/ssh/sshd_config.d/00-hardwarfare.conf, sudo sshd -t, sudo systemctl restart ssh.service. Il firewall si spegne con sudo ufw disable (le regole restano salvate). La swap si toglie con sudo swapoff /swapfile, cancellando la riga da /etc/fstab e poi il file. Se tutto il resto fallisce, lo snapshot fatto all’inizio riporta il VPS allo stato di partenza.
La nostra lettura
Questi otto passi non rendono un server inattaccabile, ma eliminano i due rischi più comuni: password indovinate da bot e servizi esposti per sbaglio. Il passo successivo è il rinforzo vero e proprio, con fail2ban e un controllo delle porte in ascolto, che trovate nella guida su https://hardwarfare.it/guide-tecniche/guide-server-self-hosting/proteggere-server-linux-ssh-fail2ban-ufw/. Da qui potete passare allo stack web con https://hardwarfare.it/ai-software/linux/installare-nginx-php-fpm-mariadb-ubuntu-lemp/ oppure ai container con https://hardwarfare.it/ai-software/linux/installare-docker-compose-ubuntu-debian/.
Fonti
- Ubuntu Server docs, OpenSSH
- Ubuntu Server docs, firewall
- Ubuntu Server docs, aggiornamenti automatici
- OpenBSD, ssh-keygen(1)
- OpenBSD, sshd_config(5)
- Microsoft Learn, chiavi OpenSSH
- Ubuntu Community, UFW
Immagine di copertina: Technician with laptop working on server rack at NERSC.jpg di Derrick Coetzee from Berkeley, CA, USA, licenza CC0, via Wikimedia Commons; elaborazione grafica HardWarfare.
Articolo redatto con il supporto di strumenti di intelligenza artificiale e verificato dalla redazione. Come usiamo l'AI · Come lavoriamo
