10 Pratiche Essenziali per Rafforzare la Sicurezza del Tuo Server SSH
Rafforza il tuo server SSH con autenticazione più sicura, accesso con privilegi minimi, regole firewall, limitazione del traffico, aggiornamenti e controlli dei log.
10 Pratiche Essenziali per Rafforzare la Sicurezza del Tuo Server SSH
Secure Shell (SSH) è solitamente la porta d'ingresso del tuo server. Se quella porta accetta password deboli, accessi root diretti o traffico da tutto internet, gli attaccanti la troveranno rapidamente.
Questa guida ti fornisce 10 passaggi pratici per rafforzare la sicurezza del server SSH che puoi applicare a OpenSSH sulle distribuzioni Linux comuni. Mantieni una sessione di lavoro aperta mentre testi ogni modifica in modo da poter recuperare se una regola del firewall o una modifica alla configurazione blocca nuovi accessi.
1. Cambia la Porta SSH Predefinita
La porta SSH predefinita è 22. È universalmente conosciuta e costantemente scansionata da bot automatizzati alla ricerca di server vulnerabili. Cambiare la porta predefinita fornisce un semplice ma efficace strato di oscurità. Sebbene non sia una misura di sicurezza di per sé, riduce significativamente il rumore delle scansioni automatizzate e aiuta a evitare molti attacchi opportunistici.
Per cambiare la porta, modifica il file sshd_config, tipicamente situato in /etc/ssh/sshd_config.
sudo nano /etc/ssh/sshd_config
Trova la riga Port 22 (o aggiungila se non esiste) e cambia 22 con un numero di porta non standard e non assegnato (ad esempio, 2222, 49152-65535 sono porte utente/dinamiche).
#Port 22
Port 2222
Prima di riavviare SSH, consenti la nuova porta nel firewall. Poi testa un nuovo accesso sulla nuova porta prima di rimuovere l'accesso alla porta 22.
# Per UFW (Uncomplicated Firewall):
sudo ufw allow 2222/tcp
sudo ufw reload
# Per Firewalld:
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo sshd -t
sudo systemctl restart sshd
Consiglio: Mantieni sempre almeno una sessione SSH aperta mentre testi le modifiche alla configurazione. Se vieni bloccato, puoi annullare le modifiche nella sessione attiva.
2. Disabilita l'Accesso Root
L'accesso root diretto tramite SSH è fortemente sconsigliato. L'utente root ha privilegi illimitati, rendendolo un bersaglio primario per gli attaccanti. Se un attaccante ottiene l'accesso root, ha il controllo completo del tuo sistema. Invece, accedi come utente normale e non privilegiato e poi usa sudo per eseguire compiti amministrativi.
In sshd_config, trova la direttiva PermitRootLogin e impostala su no.
PermitRootLogin no
Salva e riavvia il servizio SSH:
sudo systemctl restart sshd
3. Usa l'Autenticazione Basata su Chiave
L'autenticazione basata su password è suscettibile ad attacchi di forza bruta e attacchi dizionario, specialmente se gli utenti scelgono password deboli. L'autenticazione basata su chiave SSH è un'alternativa molto più sicura. Utilizza una coppia di chiavi crittografiche: una chiave pubblica memorizzata sul server e una chiave privata conservata sulla tua macchina locale. Solo i client con la chiave privata corrispondente possono autenticarsi.
Passaggi per implementare l'autenticazione basata su chiave (brevemente):
Genera una coppia di chiavi sulla tua macchina locale:
ssh-keygen -t ed25519 -C "[email protected]"ed25519è un algoritmo moderno e sicuro con una dimensione fissa della chiave.rsaè anche comune; se usi RSA, genera una chiave grande comessh-keygen -t rsa -b 4096.
Copia la chiave pubblica sul tuo server:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your_server_ipIn alternativa, aggiungi manualmente il contenuto di
~/.ssh/id_ed25519.puba~/.ssh/authorized_keyssul server per l'utente con cui desideri accedere.Assicurati che i permessi siano corretti sul server:
- Directory
~/.ssh:700(rwx solo per il proprietario) - File
~/.ssh/authorized_keys:600(rw solo per il proprietario)
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys- Directory
4. Disabilita l'Autenticazione tramite Password
Una volta che hai configurato e testato con successo l'autenticazione basata su chiave per tutti gli utenti necessari, dovresti disabilitare completamente l'autenticazione tramite password. Questo rimuove l'anello più debole nella sicurezza SSH rendendo impossibili gli attacchi di forza bruta sulle password.
In sshd_config, imposta PasswordAuthentication su no.
PasswordAuthentication no
KbdInteractiveAuthentication no
Su alcune distribuzioni, PAM o l'autenticazione interattiva da tastiera possono ancora richiedere password a meno che non le disabiliti anche tu. Testa con un terminale nuovo prima di chiudere la sessione esistente.
Salva e riavvia il servizio SSH:
sudo systemctl restart sshd
Attenzione: Non disabilitare mai l'autenticazione tramite password prima di aver verificato che l'autenticazione basata su chiave funzioni correttamente per tutti gli utenti che necessitano di accesso. Altrimenti, rischi di bloccarti fuori dal server.
5. Limita l'Accesso degli Utenti
Per impostazione predefinita, qualsiasi account utente sul server può tentare di accedere tramite SSH. Puoi limitare l'accesso SSH solo a utenti o gruppi specifici, minimizzando la superficie di attacco.
Usa le direttive AllowUsers o AllowGroups in sshd_config.
Per consentire solo utenti specifici (ad esempio, adminuser, devuser):
AllowUsers adminuser devuser
Per consentire solo membri di un gruppo specifico (ad esempio, sshusers):
AllowGroups sshusers
Consiglio: È generalmente meglio usare AllowGroups se hai più utenti. Crea un gruppo dedicato per l'accesso SSH e aggiungi gli utenti autorizzati.
sudo groupadd sshusers
sudo usermod -aG sshusers adminuser
sudo usermod -aG sshusers devuser
Dopo aver apportato le modifiche, salva e riavvia SSH.
6. Usa Frase di Passaggio Forti per le Chiavi SSH
Sebbene l'autenticazione basata su chiave sia robusta, la tua chiave privata è comunque un asset critico. Se un attaccante ottiene accesso alla tua macchina locale, potrebbe rubare la tua chiave privata. Una frase di passaggio forte crittografa la tua chiave privata, richiedendo la frase di passaggio per sbloccarla prima dell'uso. Questo aggiunge un ulteriore livello di sicurezza, proteggendo la tua chiave anche se cade nelle mani sbagliate.
Quando generi la tua chiave SSH (come nel passaggio 3), ti verrà chiesta una frase di passaggio. Scegli una frase di passaggio lunga, complessa e memorabile, diversa da qualsiasi altra password che usi.
7. Implementa la Limitazione della Velocità di Connessione (Fail2Ban)
Anche con l'autenticazione basata su chiave, un server SSH è ancora soggetto a tentativi di connessione. Strumenti come Fail2Ban possono monitorare attivamente i log SSH per tentativi di accesso falliti ripetuti dallo stesso indirizzo IP e bloccare automaticamente quell'indirizzo IP utilizzando regole del firewall per un periodo di tempo prestabilito.
Installazione (esempio per Debian/Ubuntu):
sudo apt update
sudo apt install fail2ban
Fail2Ban funziona subito con le regole SSH predefinite, ma puoi personalizzare la sua configurazione copiando jail.conf in jail.local e modificandolo.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
All'interno di jail.local, puoi regolare bantime, findtime e maxretry per la sezione [sshd].
[sshd]
enabled = true
port = 2222 # La tua nuova porta SSH
logpath = %(sshd_log)s
maxretry = 3
bantime = 1h
findtime = 10m
Riavvia Fail2Ban dopo le modifiche alla configurazione:
sudo systemctl restart fail2ban
8. Mantieni Aggiornato il Software del Tuo Server SSH
Le vulnerabilità del software vengono costantemente scoperte e corrette. Eseguire un software demone SSH obsoleto (OpenSSH) significa che potresti essere esposto a exploit noti. Aggiornare regolarmente il software del tuo server, incluso il pacchetto del server OpenSSH, è cruciale per correggere le vulnerabilità di sicurezza.
# Per Debian/Ubuntu:
sudo apt update && sudo apt upgrade
# Per CentOS/RHEL:
sudo yum update
# oppure
sudo dnf update
Configura il tuo sistema per applicare automaticamente gli aggiornamenti di sicurezza dove appropriato, o stabilisci una routine per gli aggiornamenti manuali.
9. Monitora i Log SSH per Attività Sospette
Anche con misure preventive robuste, la vigilanza è fondamentale. Controlla regolarmente i log di autenticazione SSH per rilevare schemi insoliti, tentativi di accesso falliti o tentativi di accesso non autorizzati. Questo ti aiuta a identificare potenziali violazioni o attacchi in corso.
I log SSH si trovano tipicamente in:
/var/log/auth.log(Debian/Ubuntu)/var/log/secure(CentOS/RHEL)- Usando
journalctl(sistemi systemd):sudo journalctl -u sshd -f
Cerca tentativi di autenticazione falliti ripetuti, accessi da indirizzi IP insoliti o accessi riusciti da utenti sconosciuti. Strumenti come Logwatch o Elastic Stack (ELK) possono automatizzare l'analisi dei log e l'invio di avvisi per ambienti più grandi.
10. Configura Regole del Firewall per Limitare l'Accesso
Un firewall è la tua prima linea di difesa. Per impostazione predefinita, dovrebbe bloccare tutto il traffico in entrata tranne i servizi che devi esplicitamente esporre. Per SSH, questo significa consentire connessioni solo sulla porta scelta (ad esempio, 2222) e, idealmente, solo da specifici indirizzi IP o reti fidati.
Esempio usando UFW (Uncomplicated Firewall):
Consenti SSH da un indirizzo IP specifico 192.168.1.100 sulla porta 2222:
sudo ufw allow from 192.168.1.100 to any port 2222
Consenti SSH da una sottorete specifica 192.168.1.0/24:
sudo ufw allow from 192.168.1.0/24 to any port 2222
Esempio usando Firewalld (CentOS/RHEL):
Consenti SSH da un indirizzo IP specifico 192.168.1.100 sulla porta 2222:
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port=2222 protocol="tcp" accept'
sudo firewall-cmd --reload
Attenzione: Se stai gestendo un server da un indirizzo IP dinamico, fai attenzione con regole del firewall rigide. Potresti dover consentire l'accesso da un intervallo più ampio o usare una VPN.
Consigli Aggiuntivi per il Rafforzamento
Oltre ai 10 essenziali, considera queste direttive per una sicurezza ancora maggiore:
MaxAuthTries: Limita il numero di tentativi di autenticazione per connessione. Il valore predefinito è 6. Abbassarlo (ad esempio,3) riduce le possibilità di forza bruta. Imposta insshd_config.MaxAuthTries 3LoginGraceTime: Limita il tempo consentito per l'autenticazione di un utente. Il valore predefinito è 2 minuti. Abbassarlo (ad esempio,30s) riduce la finestra per attacchi lenti.LoginGraceTime 30sClientAliveIntervaleClientAliveCountMax: Impediscono alle sessioni SSH inattive di rimanere aperte indefinitamente.ClientAliveIntervalinvia un messaggio keepalive ogni X secondi. SeClientAliveCountMaxrisposte vengono perse, la connessione viene terminata.ClientAliveInterval 300 ClientAliveCountMax 2Banner: Mostra un messaggio di avviso prima dell'autenticazione. Questo serve come avviso legale per potenziali utenti non autorizzati.
Crea il fileBanner /etc/issue.net/etc/issue.netcon il tuo messaggio di avviso desiderato.
Conclusione Pratica
Inizia con le modifiche che rimuovono il rischio maggiore: disabilita l'accesso root, richiedi chiavi SSH, limita chi può connettersi e limita le reti di origine quando possibile. Testa ogni modifica con sshd -t e una nuova sessione di accesso prima di chiudere quella corrente.