
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.
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.
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.
# 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.
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
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
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
# Aggiungi alla configurazione
echo "AllowUsers tuoutente" >> /etc/ssh/sshd_config.d/security.conf
# Oppure usa un gruppo
# AllowGroups ssh-users
# 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!
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
# Installa i pacchetti per la persistenza
DEBIAN_FRONTEND=noninteractive apt install -q -y netfilter-persistent iptables-persistent
# Salva le regole
service netfilter-persistent save
È 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
# 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
# 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
Un server correttamente configurato dovrebbe mostrare solo voci verdi.
Esegui ssh-audit periodicamente per verificare la sicurezza della configurazione.
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
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
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.
# 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.
# 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"
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
# 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
Guida aggiornata a Gennaio 2026, la versione precedente è ancora raggiungibile facendo click qui.