OSSEC / Warnung bei bestimmter Anzahl ausgehender Mails

Wie kann ich mit OSSEC die Anzahl ausgehender Mails überwachen und bei Erreichen einer bestimmten Anzahl pro Zeiteinheit einen Alert versenden?

In unserem Fall hatten wir qmail als MTA installiert. Die folgende Anleitung lässt sich aber auch auf andere Programme umlegen.

Zuerst brauchen wir einen qmail Decoder. Die lokalen Decoder habe ich im etc/local_decoder.xml der OSSEC Installation (/var/ossec) abgelegt.

Der qmail Decoder sieht in dem Fall so aus:

<decoder name="qmail-delivery">
  <program_name>qmail</program_name>
  <regex>\S+ starting delivery \S+: msg \S+ to remote (\S+)</regex>
  <order>user</order>
</decoder>

Wir fragen also mit einem regulären Ausdruck nach einem String, der dem Log Eintrag „starting delivery“ entspricht. So eine Zeile könnte z.B. so aussehen:

Mar 29 15:38:41 myserver qmail: 1332028322.543447 starting ↵
delivery 339: msg 37290026 to remote ossec@plan2.net

nach dem remote wird die Empfängeradresse angeführt. Die habe ich vom OSSEC Decoder in dem Fall als „user“ Feld herausfiltern lassen, da wir diese später noch verwenden werden, um z.B. für E-Mails an bestimmte Empfänger keinen Alert auszulösen.
Das funktioniert über die Klammer im regulären Ausdruck und danach mit der Angabe der gewünschten Felder im <order> Tag.

OSSEC hat bei der Installation schon eine Datei rules/local_rules.xml im OSSEC Verzeichnis angelegt. Diese können wir gleich für unsere neuen Rules verwenden.

<group name="local,syslog,">

<!-- see etc/local_decoder.xml for qmail-delivery decoder -->
  <rule id="100120" level="2">
    <decoded_as>qmail-delivery</decoded_as>
    <match>starting delivery</match>
    <description>qmail starting mail delivery</description>
  </rule>
<!-- ignore mails to admin recipients (level 0) -->
  <rule id="100121" level="0">
   <if_sid>100120</if_sid>
   <user>wk@plan2.net</user>
   <description>qmail outgoing mails ignored</description>
  </rule>
<!-- check for 10 outgoing mails in 1 hour -->
  <rule id="100140" level="10" frequency="10" timeframe="3600">
    <if_matched_sid>100120</if_matched_sid>
    <description>10 outgoing mails in 1 hour</description>
  </rule>

</group>

Die Rules bekommen eine eigene Gruppe local,syslog.

Zuerst definieren wir eine Rule (100120), die jedesmal aktiv wird, wenn ein E-Mail über qmail versandt wird (mit decoded_as geben wir an, dass die Regel von einem bestimmten Decoder abhängig ist). Eigene Rules sollten eine ID zwischen 100000 und 119999 bekommen, da man sonst Gefahr läuft mit einer bereits verwendeten ID in Konflikt zu kommen. Mit dem niedrigen Level 2 (von 15) für die Rule gehört die Meldung folglich zu der Gruppe,  die keine sicherheitsrelevanten Informationen enthalten.

Mit der nächsten Rule (100121) definieren wir eine, die erstens erst aktiv wird, wenn die vorherige (100120) aktiv wurde und zweitens für alle Mails an den User „wk@plan2.net“ das Level auf 0 setzt und damit einen Alert unterdrückt.

Und mit der letzten Rule erfüllen wir unsere eigentliche Aufgabe. Mit den Attributen frequency und timeframe ist es möglich, Log Einträge über einen gewissen Zeitraum zu beobachten und danach einen Alert auszulösen.