#!/usr/bin/env bash
# fix_dominanostra_auth_spray.sh
# DA ESEGUIRE SU DOMINANOSTRA (217.182.171.171) come utente con sudo.
# Obiettivo: bloccare i tentativi di login (auth spray) su domini NON locali
# come newsletter@cocinalia.net, senza toccare la posta legittima di dominanostra.it.
# READ-ONLY per Hermes: preparato da Hermes, eseguito da Stefano.
set -e

echo "===== FASE 1: INDAGINE (solo lettura) ====="
echo "-- Backend auth dovecot --"
sudo grep -rnE "auth_mechanisms|userdb|passdb|username_format|auth_domain" /etc/dovecot/ 2>/dev/null | grep -v "^#" | head -20
echo "-- Domini locali exim --"
sudo cat /etc/exim4/domains 2>/dev/null
echo "-- Account dovecot (se file) --"
sudo ls -la /etc/dovecot/users 2>/dev/null || echo "no file users (backend SQL/TinyCP)"

echo "===== FASE 2: BLOCCO AUTH SU DOMINI NON LOCALI ====="
# In dovecot, se NON e' gia vincolato, forziamo auth_username_format a %Lu e
# aggiungiamo un controllo dominio. Se il backend e' SQL (TinyCP), il dominio
# e' gia filtrato dalla query; in tal caso questa parte e' gia sicura.
# In exim, il blocco e' gia presente (domains = !+local_domains) ma lo rafforziamo
# scartando a monte gli auth su domini non in /etc/exim4/domains.

echo "-- Verifica se dovecot accetta domini arbitrari (auth_username_format) --"
AUTHF=$(sudo grep -rE "^auth_username_format" /etc/dovecot/ 2>/dev/null | head -1)
echo "  attuale: ${AUTHF:-<non impostato, default %u>}"

# Se vuoi rifiutare esplicitamente i domini non locali a livello dovecot,
# decommenta e adatta la riga seguente DOPO aver visto il backend in FASE 1:
# echo 'auth_username_format = %Lu' | sudo tee -a /etc/dovecot/dovecot.conf

echo "===== FASE 3: RAFFORZA FAIL2BAN (ban piu aggressivo sugli auth spray) ====="
JAIL="/etc/fail2ban/jail.d/dovecot-spray.local"
sudo tee "$JAIL" >/dev/null <<'EOF'
[dovecot]
enabled  = true
port     = smtp,imap,imaps,pop3,pop3s,submission,465,587,110,143,993,995
filter   = dovecot
logpath  = /var/log/auth.log
maxretry = 3
findtime = 5m
bantime  = 24h
backend  = auto
EOF
sudo chmod 0644 "$JAIL"

echo "===== FASE 4: RICARICA ====="
sudo systemctl restart fail2ban
sudo systemctl restart dovecot 2>/dev/null || echo "(dovecot restart saltato se non usato come auth diretto)"
sudo systemctl restart exim4 2>/dev/null || echo "(exim4 restart saltato)"

echo "===== FASE 5: VERIFICA ====="
sudo fail2ban-client status dovecot 2>&1 | head -8
echo "FATTO. Gli auth spray su domini non locali verranno bannati dopo 3 fail (24h)."
echo "Se in FASE 1 vedi un backend SQL TinyCP, la posta legittima NON e' toccata."
