Hi

And thank You for fast and helpful answer.


I needed to slightly modify the proposed rules bellow my fully working version (for now the action is left to write)

An "dsn=5.x.x" (x-any numeric digit) always denotes a permanent error, so the text bounced is always there i removed ", status=bounced" that actually made the regexp to fail for some reason

# etablish msgid->username mapping

type=single
ptype=regexp
pattern=postfix.*\]: (?<MSGID>\S+): .* sasl_username=(?<LOGIN>\S+)
desc=set up a context for message ID $+{MSGID}
action=create MSGID_$+{MSGID} 3600; fill MSGID_$+{MSGID} $+{LOGIN}

# generate a synthetic bounce event which contains the user  name
# (username is obtained through msgid->username mapping)

type=single
ptype=regexp
pattern=postfix\/smtp.*\]: (?<MSGID>\S+):.*dsn=5.*
context=MSGID_$+{MSGID}
desc=create a synthetic event for a bounce event with a username
action=copy MSGID_$+{MSGID} %user; event BOUNCE_FOR_USER_%{user}_MSGID_$+{MSGID}

# count and threshold synthetic events generated above

type=singlewiththreshold
ptype=regexp
pattern=BOUNCE_FOR_USER_(?<LOGIN>\S+)_MSGID_(\S+)
desc=Too many bounces for user $+{LOGIN} during 1 hour
action=write - %s
thresh=10
window=3600

I tried to add one more rule for a situation when the message is redirected to a filter in postfix (in that case MSGID changes (can in theory repeat multiple times so multiple changes of MSGID can occur - will produce a log line similar to the one bellow each time).

Jun  5 20:00:12 server1 postfix/smtp[3454]: 4E8F9804CFE: to=<somb...@somewhere.com>, relay=127.0.0.1[127.0.0.1]:10042, delay=2.2, delays=1.6/0/0/0.67, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=03546-04, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 0F7BB804D31)

as a test first I added this simple rule (MSGID is same as with Your first rule for user mappaing) MSGID2 is the new MSGID that the message will have from now on.

type=single
ptype=regexp
pattern=postfix\/smtp.*\]: (?<MSGID>\S+):.*relay=127.0.0.1.* queued as (?<MSGID2>\S+)\)
desc=test3
action=write - RELAY_$+{MSGID}_do_$+{MSGID2}_

this rule fires correctly when message passes thru postfix filter

Then i tried this to incorporate it into Your proposal as a separate rule (inserted it right after the first rule).

# create context for changed messadeid preserving login
type=single
ptype=regexp
pattern=postfix\/smtp.*\]: (?<MSGID>\S+):.*relay=127.0.0.1.* queued as (?<MSGID2>\S+)\)
context=MSGID_$+{MSGID}
desc=set up a context for message ID $+{MSGID2}
action=copy MSGID_$+{MSGID} %user;create MSGID_$+{MSGID2} 3600; fill MSGID_$+{MSGID2} %{user}

This seems to copy user data from old msgid to new msgid and make even multiple filter hops work ok.

My question are:
Is this optimal performance wise?

Should i modify the action line to be like the one bellow, to get rid of now obsolote oryginal context, or will this create a race condition?

action=copy MSGID_$+{MSGID} %user;create MSGID_$+{MSGID2} 3600; fill MSGID_$+{MSGID2} %{user};delete MSGID_$+{MSGID}


Regards
Przemyslaw Orzechowski

W dniu 12.06.2018 o 21:12, Risto Vaarandi pisze:
hi Przemysław,

for addressing this problem, you could divide it into several independent subtasks: 1) memorize the mapping from msgid to username, so that each mapping would exist for a certain amount of time 2) when a bounce event appears in the log, generate a synthetic event for the bounce, so that msgid->username mapping is used for including the user name in the synthetic event 3) count and threshold synthetic events, and generate an alarm if more than 10 events have been seen in 1 hour for the given user name

To illustrate how this could work, I've put together a small rulebase of three rules, with each rule corresponding to one of the subtasks above:

# establish msgid->username mapping

type=single
ptype=regexp
pattern=postfix.*\]: (?<MSGID>\S+): .* sasl_username=(?<LOGIN>\S+)
desc=set up a context for message ID $+{MSGID}
action=create MSGID_$+{MSGID} 3600; fill MSGID_$+{MSGID} $+{LOGIN}

# generate a synthetic bounce event which contains the user  name
# (username is obtained through msgid->username mapping)

type=single
ptype=regexp
pattern=postfix\/smtp.*\]: (?<MSGID>\S+):.*dsn=5.*, status=bounced
context=MSGID_$+{MSGID}
desc=create a synthetic event for a bounce event with a username
action=copy MSGID_$+{MSGID} %user; event BOUNCE_FOR_USER_%{user}_MSGID_$+{MSGID}

# count and threshold synthetic events generated above

type=singlewiththreshold
ptype=regexp
pattern=BOUNCE_FOR_USER_(?<LOGIN>\S+)_MSGID_(\S+)
desc=Too many bounces for user $+{LOGIN} during 1 hour
action=write - %s
thresh=10
window=3600

For recording the mappings, the first rule simply uses a context for each msgid, where the message ID is used as a context name, and user name is written into context's event store with the 'fill' action. Each context exists for 1 hour, but you can increase the mapping lifetime by using a larger value instead of 3600 seconds for the 'create' action.

The second rule converts the original bounce event into a synthetic event which contains the user name. Note that the user name is taken from the context for the given msgid with the 'copy' action (if the context does not exist, the rule would not match the original bounce event due to 'context' field, and the synthetic event is not created).

Finally, the third rule implements event counting which is done on user name basis. If you would like to do it per each unique (username,msgid) tuple, you can include the msgid into the 'desc' field (the regular expression would also need to be modified for setting the $+{MSGID} variable).

Hope this helps,
risto

2018-06-12 17:55 GMT+03:00 Przemysław Orzechowski <przemek.orzechow...@makolab.com <mailto:przemek.orzechow...@makolab.com>>:

    Hi


    I have successfully created 2 rules that mach lines i want to act
    on but I'm struggling in finding a way to correlate them.

    First description what i want to get

    Generate an event for a threshold ie 10 events in 1 hour the
    problem is i don't quite get how to count them correctly

    First is a line that has username and mailid for example:

    Jun  3 06:46:13 server1 postfix/smtpd[3268]: 626C5802295:
    client=unknown[8.8.8.8], sasl_method=LOGIN,
    sasl_username=lo...@some.domain.com <mailto:lo...@some.domain.com>

    Im maching it with pattern

    pattern=postfix.*\]: (?<MSGID>\S+): .* sasl_username=(?<LOGIN>\S+)

    the threshold should be for unique LOGINS and should count events
    mached by the second rule ie lines like these:


    Jun  3 06:46:14 server1 postfix/smtp[23808]: 626C5802295:
    to=<somb...@somewhere.com <mailto:somb...@somewhere.com>>,
    relay=somewhere.com <http://somewhere.com>[9.9.9.9]:25, delay=1,
    delays=1/0.03/21/20, dsn=5.0.0, status=bounced (host somewhere.com
    <http://somewhere.com>[9.9.9.9] said: 550-The mail server could
    not deliver mail to somb...@somewhere.com
    <mailto:somb...@somewhere.com>.  550-The account or domain may not
    exist, they may be blacklisted, or missing 550 the proper dns
    entries. (in reply to RCPT TO command))

    Im maching this line with pattern

    pattern=postfix\/smtp.*\]: (?<MSGID>\S+):.*dsn=5.*

    the MSGID is identical in both lines

    Im trying to count the bounces and execute an action if there are
    too many of them for single sasl_username in a time period

    Btw MSGID can repeat themselvs in longer preiods of time but
    should be unique within the treshold period.

    I would be very thankfull for any help

    
------------------------------------------------------------------------------
    Check out the vibrant tech community on one of the world's most
    engaging tech sites, Slashdot.org! http://sdm.link/slashdot
    _______________________________________________
    Simple-evcorr-users mailing list
    Simple-evcorr-users@lists.sourceforge.net
    <mailto:Simple-evcorr-users@lists.sourceforge.net>
    https://lists.sourceforge.net/lists/listinfo/simple-evcorr-users
    <https://lists.sourceforge.net/lists/listinfo/simple-evcorr-users>



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Simple-evcorr-users mailing list
Simple-evcorr-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/simple-evcorr-users

Reply via email to