Joram.IT logo

Divisione ES - Enterprise Services

Migliorare la sicurezza di SSH

Questa guida raccoglie le pratiche migliori per mettere in sicurezza un server SSH, testate su Debian 12 (Bookworm) e successive. C'è anche qualche buona indicazione per la configurazione dei client.

1. Prerequisiti

Prima di procedere, assicurati di:

# Aggiorna il sistema
apt update && apt upgrade -y

# Verifica la versione di OpenSSH installata
sshd -V

Queste configurazioni richiedono almeno OpenSSH 8.5. Client più vecchi potrebbero non riuscire a connettersi. Mantieni OpenSSH sempre aggiornato per beneficiare delle ultime patch di sicurezza.

2. Rigenerazione delle chiavi host

Le chiavi host predefinite potrebbero essere deboli. Rigeneriamo solo chiavi Ed25519 e RSA a 4096 bit.

# Esegui come root

# Rimuovi tutte le chiavi host esistenti
rm /etc/ssh/ssh_host_*

# Genera nuova chiave RSA a 4096 bit
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""

# Genera nuova chiave Ed25519 (raccomandata)
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""

Dopo la rigenerazione, i client riceveranno un avviso di cambio chiave host. Dovranno rimuovere la vecchia entry da ~/.ssh/known_hosts.

3. Filtro dei moduli DH

# Filtra i moduli mantenendo solo quelli >= 3072 bit
awk '$5 >= 3071' /etc/ssh/moduli > /etc/ssh/moduli.safe
mv /etc/ssh/moduli.safe /etc/ssh/moduli

Sebbene siano spesso sottovalutati, i moduli Diffie-Hellman (DH) sono dei parametri matematici fondamentali e, in SSH, permettono a due computer di stabilire una chiave segreta condivisa su una connessione non sicura. In pratica fanno sì che il tuo computer e il server si mettano d'accordo su una "password temporanea" per criptare i dati, impedendo ad un eventuale attaccante di intercettarla.

4. Configurazione degli algoritmi crittografici

Disabilita le chiavi host DSA e ECDSA

Modifica /etc/ssh/sshd_config per commentare le chiavi DSA e ECDSA:

sed -i 's/^HostKey \/etc\/ssh\/ssh_host_\(dsa\|ecdsa\)_key$/\#HostKey \/etc\/ssh\/ssh_host_\1_key/g' /etc/ssh/sshd_config

Permetti solo algoritmi sicuri

Crea un file di configurazione drop-in per gli algoritmi crittografici:

cat > /etc/ssh/sshd_config.d/hardening.conf << 'EOF'
# Configurazione hardening SSH basata su ssh-audit.com
# Per Debian 12+ / OpenSSH 9.x

# Algoritmi di scambio chiavi (Key Exchange)
KexAlgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha256

# Cifrari (Ciphers)
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr

# Algoritmi MAC (Message Authentication Code)
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com

# Algoritmi chiavi host
HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,sk-ssh-ed25519@openssh.com,rsa-sha2-512,rsa-sha2-256

# Dimensione minima RSA
RequiredRSASize 3072

# Algoritmi per firme CA
CASignatureAlgorithms ssh-ed25519,sk-ssh-ed25519@openssh.com,rsa-sha2-512,rsa-sha2-256
EOF

5. Configurazioni di sicurezza aggiuntive

Crea o modifica il file di configurazione per le impostazioni di sicurezza:

cat > /etc/ssh/sshd_config.d/security.conf << 'EOF'
# Disabilita login root diretto
PermitRootLogin no

# Consenti solo autenticazione con chiave pubblica
PasswordAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey

# Disabilita autenticazione challenge-response
KbdInteractiveAuthentication no

# Disabilita autenticazione host-based
HostbasedAuthentication no

# Ignora file .rhosts
IgnoreRhosts yes

# Numero massimo tentativi di autenticazione
MaxAuthTries 3

# Numero massimo sessioni simultanee per connessione
MaxSessions 2

# Timeout per autenticazione (secondi)
LoginGraceTime 30

# Timeout inattività client (secondi)
ClientAliveInterval 300
ClientAliveCountMax 2

# Disabilita forwarding X11
X11Forwarding no

# Disabilita forwarding agent
AllowAgentForwarding no

# Disabilita tunnel
PermitTunnel no

# Mostra ultimo login
PrintLastLog yes

# Usa PAM
UsePAM yes

# Nascondi versione sistema operativo (Debian-specific)
DebianBanner no

# Log level verboso per audit
LogLevel VERBOSE
EOF

Limita gli utenti SSH (raccomandato)

# Aggiungi alla configurazione
echo "AllowUsers tuoutente" >> /etc/ssh/sshd_config.d/security.conf

# Oppure usa un gruppo
# AllowGroups ssh-users

Verifica e applica la configurazione

# Verifica la sintassi della configurazione
sshd -t

# Se non ci sono errori, riavvia il servizio SSH
systemctl restart sshd

# Verifica che il servizio sia attivo
systemctl status sshd

Prima di applicare le modifiche, assicurati sempre di avere un backup della configurazione e un metodo alternativo di accesso: senza chiudere la precedente, apri una nuova connessione e verifica che tutto funzioni!

6. Rate limiting con iptables

Proteggi il server da attacchi brute-force e DoS limitando le connessioni:

# Regole IPv4
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 10 --hitcount 10 -j DROP

# Regole IPv6
ip6tables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
ip6tables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 10 --hitcount 10 -j DROP

Rendi le regole persistenti

# Installa i pacchetti per la persistenza
DEBIAN_FRONTEND=noninteractive apt install -q -y netfilter-persistent iptables-persistent

# Salva le regole
service netfilter-persistent save

UFW (Uncomplicated Firewall)

È un'alternativa semplice a iptables:

# Installazione
apt install ufw

# Consenti SSH prima di abilitare!
ufw allow ssh

# Abilita il firewall
ufw enable

# Verifica stato
ufw status verbose

7. Installazione e utilizzo di ssh-audit

Installazione

# Metodo 1: Via apt (Debian 12+)
apt install ssh-audit

# Metodo 2: Via pip (versione più aggiornata)
pip install ssh-audit --break-system-packages

# Metodo 3: Via snap
snap install ssh-audit

Utilizzo

# Audit del server locale
ssh-audit localhost

# Audit di un server remoto
ssh-audit tuoserver.example.com

# Verifica contro una policy predefinita
ssh-audit -L # Lista le policy disponibili
ssh-audit -P "Hardened Debian 12 (version 2)" localhost

# Audit del client SSH
ssh-audit -c # Avvia server di test sulla porta 2222

Interpretazione dei risultati

Un server correttamente configurato dovrebbe mostrare solo voci verdi.

Esegui ssh-audit periodicamente per verificare la sicurezza della configurazione.

8. Strumenti aggiuntivi

Fail2Ban

Protegge da attacchi a forza bruta bannando taluni IP dopo un numero predefinito di tentativi falliti:

# Installazione
apt install fail2ban

# Configurazione base per SSH
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 1h
findtime = 10m
EOF

# Riavvia fail2ban
systemctl restart fail2ban

# Verifica stato
fail2ban-client status sshd

9. Configurazione del client SSH

Per migliorare la configurazione del client SSH, crea o modifica ~/.ssh/config o /etc/ssh/ssh_config.d/hardening.conf:

# Configurazione client SSH sicura
Host *
    # Algoritmi di scambio chiavi
    KexAlgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,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

    # MAC
    MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com

    # Algoritmi chiavi host
    HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-ed25519,sk-ssh-ed25519-cert-v01@openssh.com,sk-ssh-ed25519@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-256

    # Hash known hosts per privacy
    HashKnownHosts yes

    # Verifica chiave host
    StrictHostKeyChecking ask

10. Autenticazione SSH con chiave

L'autenticazione con chiave pubblica è molto più sicura dell'autenticazione con password. Si raccomanda l'uso di chiavi Ed25519 (preferite) o RSA a 4096 bit.

Genera la tua coppia di chiavi

# Metodo raccomandato: Ed25519 (più sicuro e veloce)
ssh-keygen -t ed25519 -C "tua@email.com"

# Alternativa: RSA a 4096 bit (per compatibilità con sistemi più vecchi)
ssh-keygen -t rsa -b 4096 -C "tua@email.com"

Si consiglia di usare SEMPRE la passphrase a protezione delle chiavi private generate. Una chiave senza passphrase è come lasciare la porta di casa aperta.

Copia la chiave pubblica sul server

# Metodo più semplice (se disponibile ssh-copy-id)
ssh-copy-id -i ~/.ssh/id_ed25519.pub utente@server

# Metodo manuale
cat ~/.ssh/id_ed25519.pub | ssh utente@server "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Utilizza ssh-agent

Il programma ssh-agent permette di digitare la passphrase una sola volta per sessione di terminale.

# Avvia ssh-agent
eval "$(ssh-agent -s)"

# Aggiungi la chiave (richiederà la passphrase)
ssh-add ~/.ssh/id_ed25519

# Verifica le chiavi caricate
ssh-add -l

Nota sulla sicurezza: Utilizza ssh-agent solo se necessiti di autenticazioni ripetute e chiudilo quando non è più necessario. Per terminare l'agent: ssh-agent -k

Verifica i permessi corretti per i file SSH

# Sul client
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 644 ~/.ssh/known_hosts
chmod 600 ~/.ssh/config

# Sul server
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Riferimenti

Guida aggiornata a Gennaio 2026, la versione precedente è ancora raggiungibile facendo click qui.