rspamd rate-limit mit regexp selector
Gerald Galster
list+postfixbuch at gcore.biz
Do Dez 5 12:59:09 CET 2019
Hallo Carsten,
>> hat jemand schon mal das rate-limiting von rspamd auf Teile von Headern angewendet?
>>
>> Beispiel:
>>
>> Subject = "Anfrage Kunde 123 Firma xyz"
>>
>> Das rate-limit soll als redis-key nur "Kunde 123" verwenden, nicht den ganzen Betreff.
>>
>
> Ich denke dein Problem ist, dass rspamd den Key so direkt verwendet und
> nicht mehr escaped. Damit hast du einen invaliden Redis Key. Was
> schreibt denn das Rspamd log dazu? Welche Queries kannst du mit
> redis-cli monitor beobachten?
"kunde" im Klartext hab ich im redis monitor nicht gefunden:
1575539979.506706 [0 lua] "HGET" "RLpuo1d" "l"
1575539979.506715 [0 lua] "HGET" "RLpuo1d" "dr"
1575539979.506723 [0 lua] "HSET" "RLpuo1d" "dr" "11266"
1575539979.506728 [0 lua] "HGET" "RLpuo1d" "db"
1575539979.506731 [0 lua] "HSET" "RLpuo1d" "db" "12677"
1575539979.506734 [0 lua] "HGET" "RLpuo1d" "b"
1575539979.506738 [0 lua] "HINCRBYFLOAT" "RLpuo1d" "b" "1"
1575539979.506745 [0 lua] "HSET" "RLpuo1d" "l" "1575539979506"
1575539979.506749 [0 lua] "EXPIRE" "RLpuo1d" "172800"
vermutlich ist RL das prefix für rate limit und puo1d ein Hashwert über id('kunde') <--> header('subject').lower.regexp('kunde \\d\\d\\d').id('kunde')
Dec 05 10:59:39 r1.server rspamd[24046]: <07884c>; ratelimit; ratelimit.lua:647: check limit subject_limit:kunde -> RLpuo1d (2/0.016666666666666666)
Dec 05 10:59:39 r1.server rspamd[24046]: <07884c>; ratelimit; ratelimit.lua:593: got reply for limit kunde (2 / 0.016666666666666666); 1.2718469916666 burst, 1.1155:1.2429 dyn, 0.40184028333334 leaked
Dec 05 10:59:39 r1.server rspamd[24046]: <07884c>; ratelimit; ratelimit.lua:684: updated limit subject_limit:kunde -> RLpuo1d (2/0.016666666666666666), burst: 1.2718469916666, dyn_rate: 1.126655, dyn_burst: 1.267758
>> rates {
>> subject_limit = {
>>
>> # 1) limitiert nichts, egal ob "kunde \\d\\d\\d" oder etwas anderes im Betreff vorkommt
>> # selector = "header('subject').lower.regexp('kunde \\d\\d\\d')";
hier matcht gar nichts, es gibt auch keine Einträge im redis monitor dazu
>> # 2) funktioniert wie erwartet aber liefert pauschal "kunde" als redis-key zurück
>> selector = "header('subject').lower.regexp('kunde \\d\\d\\d').id('kunde')";
erst wenn man .id(...) dranhängt funktioniert es
>> # 3) Limitiert alle E-Mails, unabhängig vom Betreff
>> # selector = "header('subject').lower:regexp('kunde \\d\\d\\d')";
>
> Hast du dir mal anzeigen lassen was er hier matcht?
Kann man sich das Ergebnis von :regexp irgendwie anzeigen lassen?
Er generiert fleissig hashes, selbst wenn regexp nicht matcht - wäre das Ergebnis von :regexp leer müsste immer der gleiche hash erzeugt werden, ist aber nicht der Fall:
Dec 05 12:02:50 r1.server rspamd[27943]: <e9b53d>; ratelimit; ratelimit.lua:647: check limit subject_limit:anfrage kontaktformular 123 firma xyz -> RLjic54y8wkf6zdnd51rkefee9 (2/0.016666666666666666)
Dec 05 12:02:50 r1.server rspamd[27943]: <e9b53d>; ratelimit; ratelimit.lua:593: got reply for limit anfrage kontaktformular 123 firma xyz (2 / 0.016666666666666666); 0 burst, 1:1 dyn, 0 leaked
Dec 05 12:03:04 r1.server rspamd[27944]: <48ccfa>; ratelimit; ratelimit.lua:647: check limit subject_limit:anfrage kontaktformular 456 firma xyz -> RLrbrgjnamiwrc1ep6rnkxff8j (2/0.016666666666666666)
Dec 05 12:03:04 r1.server rspamd[27944]: <48ccfa>; ratelimit; ratelimit.lua:593: got reply for limit anfrage kontaktformular 456 firma xyz (2 / 0.016666666666666666); 0 burst, 1:1 dyn, 0 leaked
Dec 05 12:04:43 r1.server rspamd[27944]: <4dd288>; ratelimit; ratelimit.lua:647: check limit subject_limit:something different -> RLuitwi1qtitx56e7mz8u (2/0.016666666666666666)
Dec 05 12:04:43 r1.server rspamd[27944]: <4dd288>; ratelimit; ratelimit.lua:593: got reply for limit something different (2 / 0.016666666666666666); 0 burst, 1:1 dyn, 0 leaked
Dec 05 12:06:36 r1.server rspamd[27944]: <03c59d>; ratelimit; ratelimit.lua:647: check limit subject_limit:something else -> RLce8o4quqkqifye (2/0.016666666666666666)
Dec 05 12:06:36 r1.server rspamd[27944]: <03c59d>; ratelimit; ratelimit.lua:593: got reply for limit something else (2 / 0.016666666666666666); 0 burst, 1:1 dyn, 0 leaked
Ich kenne mich mit lua nicht aus, vermute aber dass man von dem hash nicht auf den Klartext schließen kann:
https://rspamd.com/doc/lua/rspamd_cryptobox.html
/usr/share/rspamd/plugins/ratelimit.lua:
local function make_prefix(redis_key, name, bucket)
local hash_len = 24
if hash_len > #redis_key then hash_len = #redis_key end
local hash = settings.prefix ..
string.sub(rspamd_hash.create(redis_key):base32(), 1, hash_len)
Zumindest gibt es so keine invaliden redis keys.
>>
>> bucket = [
>> {
>> burst = 2;
>> rate = "1 / 1min";
>> }
>> ]
>> }
>> }
>>
>> Gibt es eine Funktion wie id() die das zurückliefert was regexp erkannt hat oder false?
>>
>> Viele Grüße
>> Gerald
>>
>
> Probier doch mal:
>
> header('subject').lower.digest('hex').regexp('kunde \\d\\d\\d')
Dec 05 12:29:19 r1.server rspamd[29424]: <dd6ab1>; proxy; lua_metric_symbol_callback: call to (RATELIMIT_CHECK) failed (2): /usr/share/rspamd/lualib/lua_selectors/transforms.lua:139: calling 'create_specific' on bad self (string expected, got table); trace: [1]:{[C]:-1 - create_specific [C]}; [2]:{/usr/share/rspamd/lualib/lua_selectors/transforms.lua:139 - process [Lua]}; [3]:{/usr/share/rspamd/lualib/lua_selectors/init.lua:173 - fun [Lua]}; [4]:{/usr/share/rspamd/lualib/fun.lua:583 - foldl_call [Lua]}; [5]:{/usr/share/rspamd/lualib/fun.lua:588 - foldl [Lua]}; [6]:{/usr/share/rspamd/lualib/lua_selectors/init.lua:176 - process_selector [Lua]}; [7]:{/usr/share/rspamd/lualib/lua_selectors/init.lua:418 - process_selectors [Lua]}; [8]:{/usr/share/rspamd/plugins/ratelimit.lua:499 - limit_to_prefixes [Lua]}; [9]:{/usr/share/rspamd/plugins/ratelimit.lua:570 - <unknown> [Lua]};
-> string expected, got table
header('subject').lower.digest('hex').first.regexp('kunde \\d\\d\\d') liefert die selbe Meldung.
Es läuft rspamd 2.2 (asan build)
Viele Grüße
Gerald
Mehr Informationen über die Mailingliste Postfixbuch-users