Table of Contents

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:

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.

limit_by_sasl: True
limit_by_sender: False
limit_by_ip: False

È possibile specificare delle eccezioni (in eccesso o in difetto) per un particolare identificativo.

# Limits by id is empty per default.
limits_by_id: {}

# Some examples:
# limits_by_id:
#     poweruser@domain.org: []
#     192.168.0.254:
#         - [1000, 86400] # limits to 1000 mails by days
#     2a01:240:fe3d:4:219:bbff:fe3c:4f76: []
#     otheruser@domain.org:
#        - [50, 900]

Il sistema può generare una mail di notifica giornaliera. Si deve indicare per quale limite temporale si vuole il report; se ad esempio nella impostazione dei limits si ha un limite con intervallo di tempo 900 secondi, si può chiedere che nel report vengano riportati i superamenti di tale soglia:

report: True
report_to: "admin@domain.org"
report_subject: "policyd-rate-limit report"
report_limits: [900]
report_only_if_needed: True

Se il parametro report_only_if_needed viene impostato a False, la mail verrà inviata anche se non è stato superato alcun limite.

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!).

Per ogni esecuzione viene loggato qualcosa del genere:

policyd-rate-limit[907]: request=smtpd_access_policy
policyd-rate-limit[907]: protocol_state=RCPT
policyd-rate-limit[907]: protocol_name=ESMTP
policyd-rate-limit[907]: client_address=181.136.222.243
policyd-rate-limit[907]: client_name=unknown
policyd-rate-limit[907]: client_port=55924
policyd-rate-limit[907]: reverse_client_name=243-222-136-181.customers.provider.net
policyd-rate-limit[907]: server_address=68.19.54.82
policyd-rate-limit[907]: server_port=587
policyd-rate-limit[907]: helo_name=SEGRETERIAPC
policyd-rate-limit[907]: sender=info@sender.it
policyd-rate-limit[907]: recipient=tommaso@recipient.it
policyd-rate-limit[907]: recipient_count=0
policyd-rate-limit[907]: queue_id=55C687D7ED
policyd-rate-limit[907]: instance=1547b9.66a35bd5.4b32a.0
policyd-rate-limit[907]: size=0
policyd-rate-limit[907]: etrn_domain=
policyd-rate-limit[907]: stress=
policyd-rate-limit[907]: sasl_method=LOGIN
policyd-rate-limit[907]: sasl_username=info@sender.it
policyd-rate-limit[907]: sasl_sender=
policyd-rate-limit[907]: ccert_subject=
policyd-rate-limit[907]: ccert_issuer=
policyd-rate-limit[907]: ccert_fingerprint=
policyd-rate-limit[907]: ccert_pubkey_fingerprint=
policyd-rate-limit[907]: encryption_protocol=TLSv1.2
policyd-rate-limit[907]: encryption_cipher=ECDHE-RSA-AES256-GCM-SHA384
policyd-rate-limit[907]: encryption_keysize=256
policyd-rate-limit[907]: policy_context=
policyd-rate-limit[907]: 050/050 hit since 900s
policyd-rate-limit[907]: action=defer_if_permit Rate limit reach, retry later

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.