Vai al contenuto
Home » 🧭 Howto – Guide Tecniche per Tor, Privacy e Sicurezza » 🛡️ Accesso SSH via Tor – Hidden Service su Debian » 🛡️ Parte 3 – Protezioni avanzate: UFW, Fail2Ban, Watchdog

🛡️ Parte 3 – Protezioni avanzate: UFW, Fail2Ban, Watchdog

Hardening del servizio SSH via Tor su sistemi Debian-like

🎯 Obiettivo

In questa terza parte della guida, implementeremo protezioni avanzate per blindare ulteriormente il nostro servizio SSH accessibile via Tor. Dopo aver eliminato l’accesso root e la password, ora configureremo:

  • Firewall UFW per limitare l’accesso alla sola porta .onion
  • Fail2Ban per prevenire attacchi brute-force anche su reti Tor
  • Watchdog per Tor per garantire l’autoricupero in caso di crash

Questi strumenti forniranno una solida base di difesa in profondità, incrementando la resilienza del server a tentativi di intrusione.

⚡️ Richiede accesso root o sudo.

✅ Requisiti

  • Parte 1 completata con successo.
  • Parte 2 completata con successo.

🔒 1. Configurare il firewall UFW (Server)

⚠️ Importante: è consigliabile mantenere due sessioni SSH contemporanee durante questa configurazione: una attiva con privilegi root per eventuali correzioni, e l’altra per testare i nuovi accessi. Un errore nel firewall potrebbe bloccare l’accesso al sistema, anche via Tor.

Accesso attuale

In questa fase il server è accessibile tramite:

  • IP (es. ssh -i ~/.ssh/id_ed25519_stealth-ssh netsec@IP -p 2222) – IP usato come esempio per comodità (es. 172.16.35.110)
  • .onion (es. torsocks ssh -i ~/.ssh/id_ed25519_stealth-ssh -p 2222 netsec@fjiswfc5qssgycfnt4g4zrwt4k7rdi7ze4v5gxvdfwvk75dselqvezad.onion) – indirizzo .onion di esempio utilizzato nella guida

Installazione

sudo apt install ufw -y

Politica predefinita (tutto bloccato)

sudo ufw default deny incoming
sudo ufw default allow outgoing

Consenti connessioni Tor locali (localhost)

sudo ufw allow from 127.0.0.1 to any port 2222 proto tcp

Abilita UFW

sudo ufw enable
sudo ufw status verbose

Dovresti vedere un output simile a questo:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
2222/tcp                   ALLOW IN    127.0.0.1

⚠️ Attenzione: Non aprire porte pubbliche! L’SSH deve rimanere accessibile solo da localhost (via Tor).

✅ Test di accesso consigliato

Dopo aver abilitato UFW, è fondamentale verificare che:

  • L’accesso via IP venga bloccato:ssh -i ~/.ssh/id_ed25519_stealth-ssh netsec@IP -p 2222Dovrebbe restituire un errore di timeout o connessione rifiutata.
  • L’accesso via Tor .onion funzioni correttamente:torsocks ssh -i ~/.ssh/id_ed25519_stealth-ssh -p 2222 netsec@fjiswfc5qssgycfnt4g4zrwt4k7rdi7ze4v5gxvdfwvk75dselqvezad.onion

Se entrambi i test hanno l’esito atteso, la configurazione è corretta.

🔐 2. Fail2Ban per SSH via .onion

Anche se l’accesso SSH è limitato a .onion, eventuali attacchi automatizzati o tentativi brute-force dall’interno della rete Tor sono ancora possibili. Fail2Ban monitora i log del demone sshd, anche se configurato su porta 2222, e può bloccare temporaneamente i client .onion dopo tentativi falliti.

Installazione

sudo apt install -y fail2ban

⚠️ Su Debian 12 imposta manualmente il backend a systemd per evitare errori:

Modifica /etc/fail2ban/jail.conf:

sudo nano /etc/fail2ban/jail.conf

Trova la voce backend = auto e cambiala in:

backend = systemd

Poi crea il file:

sudo nano /etc/fail2ban/jail.local

Inserisci:

[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
maxretry = 3
findtime = 3600
bantime = 86400
banaction = ufw

Riavvia Fail2Ban

sudo systemctl restart fail2ban

Verifica lo stato di Fail2Ban

sudo systemctl status fail2ban.service
sudo fail2ban-client status
sudo fail2ban-client status sshd

Visualizza gli IP attualmente bannati

sudo fail2ban-client get sshd banned

Per sbloccare manualmente un IP

sudo fail2ban-client set sshd unbanip IP_DA_SBLOCCARE

🔄 Watchdog per Tor (obbligatorio)

Il servizio Tor è l’unico canale di accesso al server. Se si arresta inaspettatamente e non viene riavviato, perderai il controllo completo della macchina (salvo accesso diretto tramite console VPS o hypervisor). Per questo motivo, un watchdog è obbligatorio.

Creare uno script di monitoraggio

sudo nano /usr/local/bin/check-tor.sh

Contenuto:

#!/bin/bash
if ! systemctl is-active --quiet [email protected]; then
    logger "Tor non è attivo, eseguo riavvio"
    systemctl restart [email protected]
fi

Rendi lo script eseguibile:

sudo chmod +x /usr/local/bin/check-tor.sh

Servizio systemd

sudo nano /etc/systemd/system/check-tor.service

Contenuto:

[Unit]
Description=Controlla se Tor è attivo e lo riavvia se necessario

[Service]
Type=oneshot
ExecStart=/usr/local/bin/check-tor.sh

Timer systemd

sudo nano /etc/systemd/system/check-tor.timer

Contenuto:

[Unit]
Description=Controllo periodico del servizio Tor

[Timer]
OnBootSec=5min
OnUnitActiveSec=10min
Persistent=true

[Install]
WantedBy=timers.target

Attivazione

sudo systemctl daemon-reexec
sudo systemctl enable --now check-tor.timer

✅ Test del watchdog Tor

Per verificare il corretto funzionamento del watchdog:

Esegui da una sessione SSH via Tor:

sudo systemctl stop [email protected]

La connessione SSH verrà interrotta con un messaggio come:

client_loop: send disconnect: Broken pipe

Se provi a riconnetterti prima che il timer esegua il controllo:

Host unreachable (in socks5_recv_connect_reply() at socks5.c:539)
fjiswfc5qssgycfnt4g4zrwt4k7rdi7ze4v5gxvdfwvk75dselqvezad.onion [127.42.42.0] 2222 (?) : No route to host
kex_exchange_identification: Connection closed by remote host
Connection closed by UNKNOWN port 65535

Dopo l’intervallo previsto, se il watchdog è attivo, sarai nuovamente in grado di accedere:

torsocks ssh -i ~/.ssh/id_ed25519_stealth-ssh -p 2222 netsec@fjiswfc5qssgycfnt4g4zrwt4k7rdi7ze4v5gxvdfwvk75dselqvezad.onion

📁 Configurazione SSH client (opzionale)

Per evitare di dover specificare ogni volta la porta e la chiave con -p e -i, puoi configurare il file ~/.ssh/config sul tuo client SSH.

🐧 Esempio per Linux/WSL (con torsocks)

Host tor-stealth
    HostName fjiswfc5qssgycfnt4g4zrwt4k7rdi7ze4v5gxvdfwvk75dselqvezad.onion
    Port 2222
    User netsec
    IdentityFile ~/.ssh/id_ed25519_stealth-ssh
    ProxyCommand torsocks nc %h %p

Dopo la configurazione, potrai collegarti semplicemente con il comando:

ssh tor-stealth

🔧 Conclusione

Con queste configurazioni:

  • Solo connessioni Tor potranno accedere a sshd
  • Tentativi di accesso non autorizzati saranno bannati
  • Il servizio Tor sarà monitorato e riavviato automaticamente in caso di problemi

La tua macchina ora è un bastion host stealth, invisibile e inattaccabile dalla rete pubblica.