====== 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. 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 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.