Categories: Linux

Mit RSPAMD Spam und Anhänge aussortieren

Mein altes Setup hatte Amavis/Spamassassin im Einsatz und über Jahre gute Dienste in Sachen Spamfilter geleistet, ich fand es allerdings an der Zeit mal etwas Neues auszuprobieren!

Also Manuals gelesen und mich ans Werk mit rspamd gemacht, bisher hatte ich mein Mail Setup so gestaltet dass Spam Mails an ein eigenes Postfach gingen in dem sich diese Sammelten und das zentral abgearbeitet wurde. Ebenso handhabe ich unerwünschte Anhänge (EXE-Dateien, VB-Scripte, Srceensaver,…) – diese gingen ebenfalls in ein eigens Postfach, wurden manuell geprüft und gegebenenfalls per Umleitung zugestellt (Thunderbird Plugin – Mail Redirect).

Beim rspamd gibt es keine direkten Ziele die man definieren kann wenn ein Anhang als „BAD_ATTACHMENT“ gekennzeichnet wurde, ebenso sieht es beim X-SPAM-Flag aus.

Für das Aussortieren der Spam Mails wird gewöhnlich sieve genutzt, ich habe mich damit ein wenig gespielt und bin zu folgender sieve-Regel gekommen:

require [„mailbox“, „fileinto“, „envelope“, „copy“];
if allof (header :contains „X-Spamd-Result“ [„FILENAME_BLACKLISTED“, „MIME_BAD_ATTACHMENT“],
not envelope „To“ „banned@example.com“) {
redirect :copy „banned@example.com“;
discard;
stop;
}
if allof (header :contains „X-Spam-Flag“ „YES“,
not envelope „To“ „spam@example.com“) {
redirect :copy „spam@example.com“;
discard;
stop;
}
if allof (header :contains „X-Spam“ „Yes“,
not envelope „To“ „spam@example.com“) {
redirect :copy „spam@example.com“;
discard;
stop;
}

Damit werden entsprechende Mails in die Postfächer von banned@example.com und spam@example.com ausgefiltert.

Die sieve Regel wird im Dovecot als „sieve_before“ Regel ausgeführt, obiges Beispiel setzt natürlich eine funktionsfähige dovecot/sieve Integration voraus!

Manfred

View Comments

  • Kann das sein das du das ausschließen von exe Dateien usw. vergessen hast? Wie filterst du das mit rspamd? :S

    • Hallo Tobi,

      habe ich natürlich nicht! :-)
      Das geht auch mit Rspamd, die Variante die ich dafür gewählt habe ist mittels "badfiles.map" Datei eine Liste aller Dateiendungen die ich als böse einstufe zu erstellen (aktuell 3273 Stück) und in der multimap.conf Datei habe ich folgendes eingetragen:

      FILENAME_BLACKLISTED {
      type = "filename";
      filter = "extension";
      map = "/${LOCAL_CONFDIR}/local.d/badfiles.map";
      symbol = "FILENAME_BLACKLISTED";
      }

      Weiters habe ich eine mime_types.conf im Einsatz die wie folgt aussieht:

      extension_map = {
      html = 'text/html',
      asc = [ 'application/pgp-signature' ],
      txt = [ 'application/octet-stream','text/plain'],
      pdf = [ 'application/pdf', 'application/x-as400attachment', 'application/others', 'application/xls', 'application/xxx', 'application/download', 'application/pdf/pdf', 'application/binary', 'application/acrord32', 'image/jpeg/pdf' ],
      dat = [ 'application/ms-tnef' ], doc = [ 'application/octet-stream', 'application/msword' ],
      docx = [ 'application/octet-stream', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', ],
      xlsx = [ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/octet-stream', 'application/vnd.ms-excel', 'application/MSEXCEL', 'application/VND.OPENXMLFORMATS-OFFICEDOCUMENT.SPREADSHEETML.SHEET' ],
      xls = [ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/octet-stream', 'application/vnd.ms-excel', 'application/MSEXCEL', 'application/VND.OPENXMLFORMATS-OFFICEDOCUMENT.SPREADSHEETML.SHEET' ],
      pptx = [ 'application/vnd.openxmlformats-officedocument.presentationml.presentation' ],
      odt = [ 'application/octet-stream', 'application/vnd.oasis.opendocument.text' ],
      xml = [ 'application/xml' ],
      rels = [ 'application/xml' ],
      pkpass = 'application/vnd.apple.pkpass',
      csv = [ 'application/octet-stream', 'text/comma-separated-values' ],
      ics = [ 'application/ics', 'text/calendar', 'application/octet-stream' ],
      jpg = [ 'application/octet-stream', 'image/jpeg', 'image/jpg', 'image/pjpeg', 'image/png', 'image/gif', 'image/*' ],
      jpe = [ 'application/octet-stream', 'image/jpeg', 'image/jpg', 'image/pjpeg', 'image/png', 'image/gif' ],
      jpeg = [ 'application/octet-stream','image/jpeg', 'image/jpg' ],
      png = [ 'application/octet-stream', 'application/x-as400attachment', 'image/png', 'image/x-png', 'image/jpeg' ],
      gif = [ 'application/octet-stream', 'image/gif' ],
      tif = [ 'image/tiff' ],
      tiff = [ 'image/tiff' ],
      rtf = [ 'application/octet', 'application/rtf', 'application/msword' ],
      dwg = 'application/octet-stream',
      p7s = [ 'application/pkcs7-signature', 'application/x-pkcs7-signature', 'application/octet-stream' ],
      vcf = [ 'text/x-vcard', 'text/directory' ],
      sig = [ 'application/octet-stream' ],
      step = [ 'text/plain', 'application/octet-stream' ],
      stp = 'application/octet-stream',
      emz = 'application/octet-stream',
      ai = [ 'application/octet-stream', 'application/postscript' ],
      xps = 'application/octet-stream',
      dxf = 'application/octet-stream',
      dat = 'application/ms-tnef',
      };

      # Extensions that are treated as 'bad'
      # Number is score multiply factor
      bad_extensions = {
      scr = 4,
      lnk = 4,
      exe = 1,
      jar = 2,
      com = 2,
      bat = 2,
      ace = 4,
      arj = 4,
      cab = 3,
      };

      # Extensions that are particularly penalized for archives
      bad_archive_extensions = {
      jar = 3,
      js = 0.5,
      vbs = 4,
      };

      # Used to detect another archive in archive
      archive_extensions = {
      zip = 1,
      arj = 1,
      rar = 1,
      ace = 1,
      7z = 1,
      cab = 1,
      };

      Mit diesen Regeln werden die Mail in den Header Daten entsprechend markiert, basierend darauf haben ich dann eine Sieve Regel integriert die sie entsprechend aussortiert:

      require ["mailbox", "fileinto", "envelope", "copy", "duplicate", "comparator-i;ascii-numeric", "relational"];

      if duplicate { discard; stop;}

      # mails mit nicht erlaubten anhaengen ausfiltern in den banned account
      if allof (header :contains "X-Spamd-Result" ["FILENAME_BLACKLISTED", "MIME_BAD_ATTACHMENT"],
      not envelope "To" "banned@my.domain", not envelope "From" "banned@my.domain" ) {
      redirect :copy "banned@my.domain"; discard; stop;
      }

      # spam maskierte mails in den spam ordner
      if allof (header :contains "X-Spam-Flag" "YES",
      not envelope "To" "spam@my.domain") {
      redirect :copy "spam@my.domain"; discard; stop;
      }

      # spam maskierte mails in den spam ordner
      if allof (header :contains "X-Spam" "Yes",
      not envelope "To" "spam@my.domain") {
      redirect :copy "spam@my.domain"; discard; stop;
      }

      Wie man hier sieht haben wir einen Mail Account namens "banned" und einen "spam" im Einsatz, die jeweiligen Mails landen dort zur manuellen Kontrolle.

      Das ist nur eine Variante wir man das Bewerkstelligen kann, es gibt hier sicher noch andere.
      Die Sieve Regeln sind recht flexibel, hier kann man sich spielen!

      Schöne Grüße
      Manfred

      • Moin, ich möchte aber gewisse Dateien nicht verschieben, sondern gleich abweisen. Und zwar generell doc docx xls etc. Da habe ich leider noch nix gefunden, wie das mit rspamd geht. Hast Du ne Lösung?

        • Hallo Katharina,

          wenn du die Mails einfach nur automatisch löschen möchtest dann kannst du die "copy" Zeile weg lassen, der discard verschmeißt die Mail dann gleich.
          Aber vermutlich möchtest du sie ablehnen und zurückweisen, das würde im rspamd über einen action-Eintrag mit "reject" gehen.
          Siehe das Handbuch: https://rspamd.com/doc/modules/force_actions.html

          Schöne Grüße
          Manfred

          • Ja, ist auch schon ein paar Tage her - "die Zeit heilt alle Wissenslücken" sozusagen :-)

  • Hallo Manfred,

    vielen Dank für die Anleitung!
    Eine kleine Bitte: kannst du von der badfiles.map einen Auszug zeigen?

    Schönen Gruß
    Karl

    • Hallo Karl,

      die badfiles.map ist einfach nur eine Textdatei mit je einer Dateiendung in einer Zeile:

      zif
      zip
      zipx
      zix
      zl
      zl?
      zlib
      zls
      zmc
      zom
      zon
      zoo
      zpk
      zpl
      zst
      ztd
      zvd
      zvz

      Das wäre ein kleiner Auszug - die gesamte Datei hat bei mir 3273 Zeilen, ich habe hier einfach versucht so gut wie alle bekannten Dateiendungen rein zu packen und nur ganz wenige die wirklich benötigt werden weg zu lassen. Wenn du keine Lust hast dir eine eigene zusammen zu bauen kann ich dir auch meine zur Verfügung stellen... (anpassen musst du dann selbst) :-)

      Schöne Grüße
      Manfred

  • Hallo Manfred,

    vielen Dank erst einmal für deinen tollen Blog Beitrag. Der hat mir wirklich geholfen Anhänge in rspamd zu filtern! Gibt es eine Möglichkeit den Mailempfänger zu informieren, dass eine Mail in das "banned.my.domain" Mailkonto verschoben wurde? Es sollen nicht alle Anwender Zugriff auf das "banned.my.domain" Konto erhalten aber darüber informiert werden.
    Kann ich die Datei "badfiles.map" von dir an meine E-Mail erhalten? Vielen Dank!

    • Hallo Frank,

      freut mich dass mein Beitrag geholfen hat! Danke für die Rückmeldung. :-)
      Du könntest einen ähnlichen Ansatz verfolgen wie bei meiner Variante mit Rspamd Whitelisting: https://blog.grufo.com/2022/11/17/mail-anhaenge-mit-rspamd-per-whitelist-filtern/
      Hier habe ich ein Script im Einsatz welches die Anhänge prüft und nur jene durch lässt die auch wirklich gewollt sind.
      Wenn das auch mit einer badfiles-Liste funktionieren soll muss man einfach die Funktion umdrehen, auf solche Dateien prüfen und gegebenenfalls ein Mail losschicken.

      Badfiles.map schicke ich dir per Mail...

      Schöne Grüße
      Manfred

  • Hallo Manfred,

    danke nochmal für deine Unterstützung. Ich werde mir den Link anschauen und versuchen umzusetzen. Wünsche Dir ein schönes WE!

    Gruß Frank

Recent Posts

VM – ZFS Partition online vergrößern

Man macht es nicht jeden Tag, darum schadet es nicht sich's kurz zu notieren... Hier…

1 Jahr ago

Samba Password History für einen User löschen

Meine Suche bei Google hatte mal wieder keinen vernünftigen Treffer gelandet, das Problem - ich…

1 Jahr ago

HP Eine Firma von der ich nicht mal geschenkte Drucker nehmen würde!!!

Ich muss mal eben etwas Druck ablassen, ein Kunde von mir setzt einen Drucker von…

2 Jahren ago

IRMC Console Redirection ohne Lizenz

Wer beim Server bestellen vergessen hat die erweiterte IRMC Lizenz zu ordern, der steht vor…

2 Jahren ago

WOL im BIOS aktivieren reicht nicht immer

Ich nutze seit langer Zeit ein System für meine Backups welches in der Nacht von…

2 Jahren ago

Apache Guacamole mit TOPT – funktioniert nicht

Es scheint wohl eine noch nicht so häufig genutzte Kombination zu sein - Apache Guacamole…

2 Jahren ago