Table of Contents

postfix-policyd

:!: ATTENZIONE! Nelle versioni più recenti di Debian (es. Debian 10 Buster) il pacchetto postfix-policyd è stato rimosso, una alternativa è policyd-rate-limit :!:

Problema: limitare il numero di mail inviate da un singolo utente (identificato da SASL) in un determinato periodo di tempo. Questo per bloccare lo spam che tramite botnet sfrutta account rubati.

Il programma policyd avrebbe tale funzione, più molte altre ({black|grey|white}listing, ecc.), peccato che non esista per Debian Wheezy. Il pacchetto postfix-policyd è stato rimosso da Debian, questa la pagina del pacchetto sorgente.

Porting to Debian 7 Wheezy

I sorgenti per Debian 6 Squeeze si riescono a compilare su Wheezy:

mkdir -p /usr/local/src/postfix-policyd
cd /usr/local/src/postfix-policyd
wget http://ftp.de.debian.org/debian/pool/main/p/postfix-policyd/postfix-policyd_1.82-2.dsc
wget http://ftp.de.debian.org/debian/pool/main/p/postfix-policyd/postfix-policyd_1.82.orig.tar.gz
wget http://ftp.de.debian.org/debian/pool/main/p/postfix-policyd/postfix-policyd_1.82-2.diff.gz
dpkg-source -x postfix-policyd_1.82-2.dsc
cd postfix-policyd-1.82/
dpkg-buildpackage -rfakeroot

Patch per l'installazione

File da modificare:

Il programma richiede un database MySQL, purtroppo lo script per crearlo (/usr/share/dbconfig-common/data/postfix-policyd/install/mysql) non è compatibile con la versione 5.5.24 e quindi durante l'installazione bisogna correggerlo sostituendo tutte le occorrenze di TYPE=MyISAM con ENGINE=MyISAM.

ATTENZIONE: L'opzione ENGINE=MyISAM è necessaria, altrimenti postfix-policyd non sarà in grado di eseguire gli statement INSERT DELAYED INTO usati per popolare le tabelle del database,

Questa una traccia per creare database e utente in MySQL:

CREATE DATABASE postfixpolicyd;
CREATE USER postfixpolicyd@localhost IDENTIFIED BY 'MySecret';
GRANT ALL ON postfixpolicyd.* TO postfixpolicyd@localhost;
FLUSH PRIVILEGES;

Anche il file di configurazione (/etc/postfix-policyd.conf) va corretto, togliendo gli spazi dalla stringa SYSLOG_FACILITY (vedere questo bug report):

SYSLOG_FACILITY="LOG_MAIL|LOG_INFO"

altrimenti si incappa nell'errore (syslog):

postfix-policyd: fatal: didn't find priority 'LOG_IFOO', exiting

Altro grave problema riguarda lo script /etc/init.d/postfix-policyd, il parametro reload non è supportato dal demone, va tolto dallo script perché altrimenti il demone muore.

Configurazione

Questi sono i parametri modificati in /etc/postfix-policyd.conf per disabilitare il greylisting e per attivare il throttling: sono consentiti al massimo 25 messaggi e 50 destinatari in 15 minuti:

DEBUG=1

GREYLISTING=0
SENDERTHROTTLE=1

SENDER_THROTTLE_SASL=1
SENDER_THROTTLE_HOST=0
SENDERMSGLIMIT=25
SENDERRCPTLIMIT=50
SENDERTIMELIMIT=15m

ATTENZIONE: Se si modificano i valori di SENDERMSGLIMIT e SENDERRCPTLIMIT nel file di configurazione bisogna aggiornare anche la tabella throttle del database utilizzato da Policyd. Ecco come verificare i valori correnti per ciascun utente:

SELECT _from, _count_max, _count_cur, _rcpt_max, _rcpt_cur, _rcpt_tot FROM throttle;

Dopo aver avviato il demone si deve dire a Postfix di fare un check sul servizio postfix-policyd per ogni messaggio:

smtpd_relay_restrictions =
    check_policy_service inet:127.0.0.1:10031,
    permit_sasl_authenticated,
    reject

Nelle vecchie versioni di Postfix si doveva includere il controllo nella direttiva smtpd_recipient_restrictions, la nuova direttiva smtpd_relay_restrictions è preferibile perché viene applicata prima.

Verifica del funzionamento

In /var/log/mail.log si legge:

postfix-policyd: rcpt=230, throttle=update(a), host=62.48.51.8, from=niccolo@example.com,
  to=niccolo@example.org, size=0/1024000000, quota=0/250000000, count=11/50(2),
  rcpt=2/3600(2), threshold=0%|20%|0%, sasl_username=niccolo

È importante vedere la stringa throttle=update(a), significa che è stata aggiornata la riga opportuna nel database per tenere aggiornati i contatori. Se invece si legge throttle=bypass significa che qualcosa non va, ad esempio che è stato impossibile eseguire la modifica nel database (vedere sopra l'opzione ENGINE=MyISAM).

Collegandosi a MySQL è possibile vedere lo stato del throttling:

SELECT _from, _count_cur FROM throttle ORDER BY _count_cur ASC;

Per resettare i contatori manualmente:

UPDATE throttle SET _count_cur = 0, _rcpt_cur = 0 WHERE _from = 'login-name';

Cleanup cronjob

Le operazioni di expire e cleanup sul database vanno eseguite da un cronjob:

/usr/lib/postfix-policyd/cleanup -c /etc/postfix-policyd.conf