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