User Tools

Site Tools


doc:appunti:linux:sa:policyd-rate-limit

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@example2.org>:
    Recipient address rejected: Rate limit reach, retry later;
    from=<sender@example.org>
    to=<recipient@example2.org> proto=ESMTP helo=<mail.example.org>

Cioè l'azione predefinita è DEFER_IF_PERMIT (vedere 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@example2.org>: Recipient address rejected: Rate limit reach, retry later.
Please check the message recipient "recipient@example2.org" and try again.
doc/appunti/linux/sa/policyd-rate-limit.txt · Last modified: 2021/02/09 12:48 by niccolo