↓Salta al contenuto principale
Alemasone

Installare e configurare SSH su Ubuntu in sicurezza

Come installare OpenSSH su Ubuntu, generare chiavi Ed25519, disattivare l'accesso root e le password, e proteggere il server dagli attacchi automatici.

6 min di lettura Aggiornato il
Terminale con una connessione SSH attiva verso un server Ubuntu
In questa pagina
Un server SSH raggiungibile da internet riceve tentativi di accesso automatici pochi minuti dopo l’accensione. Due impostazioni tolgono quasi tutto il rischio: accesso solo con chiavi e login di root disattivato. Ci vogliono cinque minuti, e vanno fatte prima di qualsiasi altra cosa.

SSH è il canale cifrato con cui si amministra un computer Linux a distanza: terminale, trasferimento di file, tunnel per altri servizi. Su Ubuntu Desktop il server SSH non è installato di serie, mentre sulle immagini per server di solito c’è già. In questa guida lo installi, lo colleghi dal tuo computer con una chiave e lo metti in sicurezza.

Installazione #

sudo apt update
sudo apt install openssh-server

Il servizio parte da solo. Controlla lo stato:

sudo systemctl status ssh

Terminale Ubuntu con l’esito di systemctl status ssh e il servizio contrassegnato come active running
La riga da controllare è quella con active (running)

Su Ubuntu 24.04 non spaventarti se, prima del primo collegamento, lo stato risulta inactive con la riga TriggeredBy: ssh.socket: da Ubuntu 22.10 SSH viene avviato dal socket al primo tentativo di connessione, e sudo systemctl status ssh.socket deve risultare attivo. Per spegnere del tutto l’accesso remoto, per esempio durante una manutenzione, usa sudo systemctl disable --now ssh.socket ssh.

Se il firewall UFW è attivo, autorizza SSH prima di chiudere la sessione in cui stai lavorando:

sudo ufw allow OpenSSH
sudo ufw enable
Non attivare UFW prima di aver consentito OpenSSH. La connessione in corso si chiude e resti chiuso fuori. Su un server remoto a cui non puoi mettere mano fisicamente, è l’errore che costa di più.

Da un altro computer ti colleghi con:

ssh nomeutente@indirizzo-ip

Il comando funziona allo stesso modo da Linux, da macOS e da Windows 10 e 11, che hanno il client SSH già installato: basta aprire il Terminale di Windows o PowerShell. Al primo collegamento ti viene chiesto di confermare l’impronta del server: scrivi yes.

Le chiavi: come funzionano #

Una coppia di chiavi ha una parte privata, che resta sul tuo computer e non va data a nessuno, e una parte pubblica, che copi sul server. Quando ti colleghi il server verifica che tu abbia la chiave privata giusta, senza che nulla di segreto passi sulla rete.

È più sicuro di una password perché una chiave non si indovina: gli attacchi a forza bruta, che provano milioni di combinazioni, non servono a niente.

Generare la coppia di chiavi #

Sul tuo computer, non sul server:

ssh-keygen -t ed25519 -C "il-mio-portatile"

Terminale con ssh-keygen -t ed25519: frase di accesso, percorso dei due file e impronta della chiave
Il comando crea due file: la chiave privata e quella pubblica con estensione .pub

Ed25519 è l’algoritmo consigliato oggi: chiavi corte, verifica veloce, sicurezza alta. RSA usalo solo se devi collegarti a sistemi vecchi che non conoscono Ed25519, e in quel caso con almeno 4096 bit.

Quando ti chiede una frase di accesso (passphrase), mettila: protegge la chiave se qualcuno mette le mani sul tuo computer. Per non doverla scrivere ogni volta ci pensa l’agente SSH, che la ricorda fino alla fine della sessione.

Copiare la chiave pubblica sul server #

ssh-copy-id nomeutente@indirizzo-ip

Ti chiede la password una volta sola e imposta i permessi giusti. Su Windows ssh-copy-id non c’è: apri il file C:\Users\<nome>\.ssh\id_ed25519.pub, copiane il contenuto e incollalo in fondo al file ~/.ssh/authorized_keys sul server.

Prova subito il collegamento con la chiave da una seconda finestra, tenendo aperta la prima. Solo quando funziona passi a bloccare le password.

Mettere in sicurezza la configurazione #

Le impostazioni del server stanno in /etc/ssh/sshd_config. Sulle versioni recenti di Ubuntu è meglio non toccare quel file e creare invece un file tuo dentro /etc/ssh/sshd_config.d/, che viene letto in aggiunta:

sudo nano /etc/ssh/sshd_config.d/99-sicurezza.conf

Contenuto consigliato:

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
X11Forwarding no
MaxAuthTries 3

Cosa fa ogni riga:

ImpostazioneEffetto
PermitRootLogin noNessuno può entrare direttamente come root: entri con il tuo utente e usi sudo
PasswordAuthentication noSi entra solo con le chiavi, le password vengono rifiutate
KbdInteractiveAuthentication noChiude un’altra strada che riaprirebbe l’accesso con password
MaxAuthTries 3Limita i tentativi per ogni connessione
X11Forwarding noDisattiva l’inoltro della grafica, che non usa quasi nessuno

Prima di applicare controlla che la sintassi sia giusta:

sudo sshd -t

Se non stampa niente è tutto a posto, e puoi ricaricare il servizio:

sudo systemctl reload ssh
Tieni aperta la sessione attuale mentre applichi le modifiche, e prova il nuovo accesso da un’altra finestra. Se hai sbagliato qualcosa, hai ancora una connessione viva da cui rimediare.

Difendersi dagli attacchi automatici #

Cambiare la porta da 22 a un numero alto non rende il server più sicuro, però riduce moltissimo il rumore nei log, perché quasi tutte le scansioni automatiche provano solo la porta standard. Si imposta con Port 2222 nel tuo file di configurazione, ricordandoti di aprire la nuova porta sul firewall (sudo ufw allow 2222/tcp). Da Ubuntu 22.10 in poi, 24.04 compresa, dopo la modifica servono anche sudo systemctl daemon-reload e sudo systemctl restart ssh.socket, altrimenti il server continua ad ascoltare sulla 22.

Fail2ban blocca per un po’ gli indirizzi che sbagliano più volte di fila:

sudo apt install fail2ban

Con la configurazione predefinita protegge già SSH. Gli indirizzi bloccati li vedi con sudo fail2ban-client status sshd.

Limitare gli utenti che possono entrare è semplice ed efficace: con AllowUsers nomeutente nella configurazione nessun altro account può collegarsi, nemmeno con credenziali valide.

Il file di configurazione del client #

Sul computer da cui ti colleghi, il file ~/.ssh/config ti evita di ricordare indirizzi e porte:

Host server-casa
    HostName 192.168.1.50
    User alessandro
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Da quel momento basta ssh server-casa. Il nome funziona anche con scp e rsync.

Trasferire file #

scp documento.pdf server-casa:/home/alessandro/

Per cartelle intere e copie che ripeti spesso usa rsync, che trasferisce solo quello che è cambiato:

rsync -avz --progress cartella/ server-casa:/percorso/di/destinazione/

Se preferisci un programma con le finestre, FileZilla e WinSCP si collegano in SFTP usando le stesse credenziali e la stessa chiave.

Domande frequenti #

Se disattivo le password e perdo la chiave privata, resto fuori? #

Sì, ed è il rischio da gestire prima. Due precauzioni: aggiungi sul server le chiavi pubbliche di tutti i dispositivi da cui ti collegherai, e tieni una copia della chiave privata in un posto sicuro, per esempio nel tuo gestore di password. Se il server è una macchina virtuale presso un provider, di solito c’è anche una console di emergenza nel pannello web.

Ed25519 o RSA? #

Ed25519 quando puoi: è più moderno, le chiavi sono più corte e la verifica più veloce. RSA a 4096 bit solo con sistemi vecchi che non supportano Ed25519.

Cambiare porta serve a qualcosa? #

Non aumenta la sicurezza, perché una scansione mirata trova il servizio comunque. Però riduce di molto i tentativi automatici e rende i log leggibili: quando compare un tentativo, sai che merita attenzione.

Come mi collego se l’indirizzo IP di casa cambia? #

Con un servizio di DNS dinamico, che associa un nome fisso al tuo indirizzo e lo aggiorna da solo quando cambia. Molti router lo supportano già dalle impostazioni. In alternativa una VPN come Tailscale ti fa raggiungere il server senza aprire porte sul router.

Cosa vuol dire l’avviso sulla chiave dell’host cambiata? #

Che l’identità del server non corrisponde a quella salvata al primo collegamento. Può essere normale, se hai reinstallato il sistema o cambiato macchina, oppure il segnale di qualcuno che cerca di intercettare la connessione. Prima di andare avanti capisci il motivo; solo dopo rimuovi la vecchia voce con ssh-keygen -R indirizzo-ip.

Da leggere anche