====== policyd-rate-limit ======
:!: **ATTENZIONE**: Su versioni Debian più datate (da Debian 6 Squeeze a Debian 9 Stretch) è probabile che venga installato il pacchetto **[[postfix-policyd]]** invece del più nuovo **policyd-rate-limit**.
Si installa il pacchetto **policyd-rate-limit**:
* Viene creato un utente **policyd-rate-limit**.
* Il file di configurazione è **/etc/policyd-rate-limit.yaml**.
* Risulta in esecuzione il processo **/usr/bin/python3 /usr/bin/policyd-rate-limit** a nome dell'utente creato.
* Viene creato il servizio systemd **policyd-rate-limit.service**.
* Viene creato il socket **/var/spool/postfix/ratelimit/policy** per collegare Postfix al processo.
* Viene creato un database SQLite in **/var/lib/policyd-rate-limit/db.sqlite3**.
==== Configurazione ====
Nel file di configurazione **/etc/policyd-rate-limit.yaml** il parametro più importante è **limits**:
limits:
- [10, 60] # limit to 10 mails by minutes
- [150, 86400] # limits to 150 mails by days
Oltre all **login sasl**, è possibile tenere traccia e limitare anche il **sender** e l'**indirizzo IP**. Queste opzioni sono disabilitate per impostazione predefinita.
È possibile specificare delle **eccezioni** (in eccesso o in difetto) per un particolare identificativo.
==== Collegamento con Postfix ====
Per aggiungerlo ai filtri utilizzati da Postfix è sufficiente ad esempio aggiungerlo alla catena dei filtri **smtpd_relay_restrictions**:
check_policy_service { unix:ratelimit/policy, default_action=DUNNO }
==== Database ====
Nel database esiste una tabella **mail_count** con un record per ogni mail inviata, nella riga compare il nome di login e il timestamp dell'invio:
sqlite3 /var/lib/policyd-rate-limit/db.sqlite3
sqlite> SELECT * FROM mail_count;
username@example.org|1612865208
username@example.org|1612865556
Il database può (deve) essere svuotato regolarmente eseguendo **%%policyd-rate-limit --clean%%** ad esempio con un cronjob:
0 0 * * * policyd-rate-limit /usr/local/bin/policyd-rate-limit --clean >/dev/null
Vengono automaticamente rimossi tutti i record che hanno un **timestamp più vecchio del doppio del limite temporale maggiore**.
Se nella configurazione sono abilitati i **report**, nel database viene creata anche la tabella **limit_report**, anch'essa viene svuotata regolarmente dall'opzione **%%--clean%%**.
==== Debug ====
Il processo logga in **/var/log/syslog** con il tag **policyd-rate-limit**. Nel file di configurazione c'è l'opzione predefinita **debug: True**, sembra che non ci sia la possibilità di modificare la quantità di informazioni registrate (tante!).
==== Limite raggiunto con destinatari multipli ====
Il limite viene giustamente applicato al **numero dei destinatari**, se una mail contiene **destinatari multipli** e il totale eccede il limite disponibile, **alcuni destinatari vengono scartati**. Nei log di Postfix si trova segnalato il rifiuto:
postfix/smtpd[23150]: 5DBFB7DA5B: reject: RCPT from unknown[10.11.12.13]:
450 4.7.1 :
Recipient address rejected: Rate limit reach, retry later;
from=
to= proto=ESMTP helo=
Cioè l'azione predefinita è **DEFER_IF_PERMIT** (vedere [[http://www.postfix.org/access.5.html|Postfix Access]]) con relativo messaggio **SMTP 4.7.1**.
Un client di posta dovrebbe segnalare l'errore e considerare il **messaggio non inviato**, ma in generale **non è possibile capire quali destinatari sono stati accettati e quali rifiutati**. Ad esempio Thunderbird mostra un pop-up con il seguente messaggio:
An error occurred while sending mail. The mail server responded:
4.7.1 : Recipient address rejected: Rate limit reach, retry later.
Please check the message recipient "recipient@example2.org" and try again.