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:

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 recent tiene traccia degli IP che tentano di connettersi
  • Ogni nuovo tentativo di connessione viene registrato con --set
  • --hitcount 3 conta 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.