Secure Shell Daemon & Crypto
Il server OpenSSH è uno strumento fondamentale per garantire comunicazioni sicure su reti non affidabili. Il protocollo SSH permette agli amministratori di gestire server e macchine da remoto attraverso un terminale bash, utilizzando una connessione completamente protetta.
La corretta configurazione e messa in sicurezza di OpenSSH è cruciale: un server SSH mal configurato può diventare la porta d’ingresso per attaccanti. In questo articolo vedremo come configurare OpenSSH per ottenere il massimo livello di sicurezza, escludendo algoritmi obsoleti e utilizzando solo crittografia moderna e robusta.
Principi di Sicurezza SSH
Prima di entrare nei dettagli tecnici, è importante comprendere i principi base della sicurezza SSH:
- Utilizzo esclusivo del Protocol 2: Il Protocol 1 è obsoleto e vulnerabile
- Chiavi forti: Solo RSA (4096 bit) ed Ed25519
- Esclusione di algoritmi deboli: Niente DSA, ECDSA con curve NIST, SHA1 o MD5
- Perfect Forward Secrecy: Protezione delle comunicazioni passate anche se una chiave viene compromessa
1. Preparazione del Server: Rimozione delle Chiavi di Default
Il primo passo fondamentale è rimuovere tutte le chiavi di default generate durante l’installazione di OpenSSH. Queste chiavi potrebbero essere deboli o basate su algoritmi obsoleti.
Eseguiamo questi comandi per eliminare le vecchie chiavi e generarne di nuove, sicure:
# Spostiamoci nella directory SSH
cd /etc/ssh
# Rimuoviamo TUTTE le chiavi esistenti
rm ssh_host_*key*
# Generiamo una nuova chiave Ed25519 (la più sicura)
ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N "" < /dev/null
# Generiamo una chiave RSA robusta (4096 bit)
ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key -N "" < /dev/null
Nota importante: Dopo questa operazione, i client che si erano già connessi al server riceveranno un avviso di cambio chiave. Questo è normale e atteso.
2. Configurazione del Protocollo e delle Chiavi Host
Nel file /etc/ssh/sshd_config, impostiamo l’uso esclusivo del Protocol 2 e specifichiamo quali chiavi utilizzare:
# Usa solo il protocollo sicuro
Protocol 2
# Specifica solo le chiavi sicure
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
3. Algoritmi di Scambio Chiavi (Key Exchange)
Lo scambio di chiavi è il momento più critico della connessione SSH. Durante questa fase, client e server si accordano su una chiave segreta condivisa che verrà usata per cifrare tutta la comunicazione.
Utilizziamo solo algoritmi che garantiscono Perfect Forward Secrecy e che non sono sospettati di contenere backdoor:
# In /etc/ssh/sshd_config
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Perché queste scelte?
- curve25519-sha256: Curva ellittica moderna, non compromessa dal NIST
- diffie-hellman-group-exchange-sha256: Versione sicura del classico Diffie-Hellman con SHA256
- Escluse le curve NIST: Sospettate di contenere backdoor NSA
4. Algoritmi di Autenticazione: Perché Evitare DSA ed ECDSA
Problemi con DSA
Le chiavi DSA sono limitate a 1024 bit, una dimensione considerata insufficiente dal 2010. Sono vulnerabili a:
- Attacchi di fattorizzazione con hardware moderno
- Vulnerabilità nella generazione di numeri casuali
Problemi con ECDSA
ECDSA presenta due criticità principali:
- Dipendenza dalla qualità dei numeri casuali: Se il generatore di numeri casuali è debole, la chiave privata può essere recuperata
- Curve NIST sospette: OpenSSH supporta solo curve NIST per ECDSA, fortemente sospettate di contenere backdoor
Le Alternative Sicure: Ed25519 e RSA
Ed25519 è l’evoluzione sicura di ECDSA:
- Usa la curva Curve25519, non compromessa
- Prestazioni eccellenti
- Resistente agli attacchi side-channel
RSA con chiavi di 4096 bit rimane sicuro se:
- Si usano chiavi di almeno 4096 bit
- Si evita RSA-SHA1 per le nuove implementazioni
5. Configurazione dell’Autenticazione Client
Generazione delle Chiavi Client
Sul client, generiamo entrambi i tipi di chiavi sicure:
# Chiave Ed25519 (raccomandata)
ssh-keygen -t ed25519
# Chiave RSA di backup
ssh-keygen -t rsa -b 4096
Importante: Proteggere sempre le chiavi private con una passphrase robusta!
Invio della Chiave Pubblica al Server
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname
Disabilitazione dell’Autenticazione con Password
Una volta configurata l’autenticazione con chiave, disabilitiamo immediatamente le password:
# In /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
6. Cifrari per la Protezione dei Dati
Dopo l’autenticazione, i dati vengono cifrati. Utilizziamo solo cifrari moderni e sicuri:
# In /etc/ssh/sshd_config
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
Perché questi cifrari?
- chacha20-poly1305: Cifrario stream moderno, veloce e sicuro
- aes-gcm: Modalità autenticata di AES, combina cifratura e autenticazione
- aes-ctr: Modalità counter di AES, sicura e parallelizzabile
7. MACs per l’Integrità dei Dati
I Message Authentication Codes (MACs) garantiscono che i dati non vengano modificati durante il transito:
# In /etc/ssh/sshd_config
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
Note importanti sui MACs:
- Usiamo solo SHA2-256 e SHA2-512 (SHA1 e MD5 sono vulnerabili agli attacchi di collisione)
- Le versioni “etm” (Encrypt-then-MAC) sono preferibili per sicurezza
- Dimensione minima: 128 bit per chiavi e tag
8. Configurazione Client
Nel file ~/.ssh/config del client, replichiamo le impostazioni di sicurezza:
Host *
# Protocollo e autenticazione
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
# Algoritmi di autenticazione host
HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-ed25519,ssh-rsa
# Scambio chiavi
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
# Cifrari
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
# MACs
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
9. Verifica della Configurazione
Dopo aver applicato tutte le modifiche:
# Test della configurazione
sshd -t
# Restart del servizio
systemctl restart sshd
# Verifica degli algoritmi attivi
ssh -Q kex
ssh -Q cipher
ssh -Q mac
10. Misure di Sicurezza Aggiuntive
Limitare gli Accessi
# Permettere solo utenti specifici
AllowUsers admin developer
# O permettere solo gruppi specifici
AllowGroups ssh-users
# Disabilitare il login root
PermitRootLogin no
Protezione contro Attacchi Brute Force
# Numero massimo di tentativi
MaxAuthTries 3
# Tempo massimo per autenticarsi
LoginGraceTime 20
# Numero massimo di sessioni
MaxSessions 2
11. Protezione Extra: Custom Chain Iptables Anti-Bruteforce
Come ulteriore protezione, configuriamo una catena iptables personalizzata per limitare i tentativi di bruteforce su SSH. Utilizziamo la porta 22222 invece della standard 22.
Prima modifichiamo la porta in /etc/ssh/sshd_config:
Port 22222
Poi creiamo la custom chain con iptables:
# Creiamo una nuova catena chiamata SSH_BRUTEFORCE
iptables -N SSH_BRUTEFORCE
# Nella catena, tracciamo le nuove connessioni con il modulo recent
# Ogni IP viene memorizzato nella lista "sshbrute"
iptables -A SSH_BRUTEFORCE -m recent --name sshbrute --set
# Se un IP tenta più di 3 connessioni in 60 secondi, viene droppato
iptables -A SSH_BRUTEFORCE -m recent --name sshbrute --update --seconds 60 --hitcount 3 -j DROP
# Se l'IP rispetta il rate limit, accettiamo la connessione
iptables -A SSH_BRUTEFORCE -j ACCEPT
# Redirigiamo il traffico TCP sulla porta 22222 alla nostra custom chain
iptables -A INPUT -p tcp --dport 22222 -m state --state NEW -j SSH_BRUTEFORCE
Come funziona:
- Il modulo
recenttiene traccia degli IP che tentano di connettersi - Ogni nuovo tentativo di connessione viene registrato con
--set --hitcount 3conta i tentativi: al terzo in 60 secondi, l’IP viene bloccato- Dopo 60 secondi il contatore si resetta automaticamente
Per rendere le regole persistenti al riavvio:
# Su sistemi Debian/Ubuntu
iptables-save > /etc/iptables/rules.v4
# Su sistemi RedHat/CentOS
service iptables save
Questa semplice configurazione blocca efficacemente gli attacchi bruteforce automatizzati, permettendo massimo 2 tentativi di login al minuto per ogni IP.
Conclusioni
Questa configurazione di OpenSSH offre il massimo livello di sicurezza attualmente disponibile, escludendo tutti gli algoritmi deboli o sospetti. Ricordate di:
- Mantenere sempre OpenSSH aggiornato
- Monitorare i log di sistema per attività sospette
- Rivedere periodicamente la configurazione alla luce di nuove vulnerabilità
- Utilizzare sempre passphrase forti per le chiavi private
La sicurezza non è un prodotto ma un processo: questa configurazione è un ottimo punto di partenza, ma richiede manutenzione e aggiornamento costanti.