Postfix, ausgehende Mails nach Inhalt filtern?

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
HansGraefe
Beiträge: 24
Registriert: 06.05.2022 15:04:32

Postfix, ausgehende Mails nach Inhalt filtern?

Beitrag von HansGraefe » 16.04.2024 17:51:17

Hallo,

gibt es eine Möglichkeit, mit Postfix ausgehende Mails nach Inhalt zu filtern? Sowas in der Art alle Mails die im Body "XYZ" stehen haben, sollen gelöscht werden?

Es geht dabei um ein Web-Programm welches viele Mails verschickt, bei dem man aber nicht einstellen kann, wofür es Mails verschicken soll und wofür nicht.

Benutzeravatar
heisenberg
Beiträge: 3582
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Postfix, ausgehende Mails nach Inhalt filtern?

Beitrag von heisenberg » 16.04.2024 18:07:53

Ich würde sagen: Das geht ganz bestimmt. Aber so 100% tief drin in Postfix bin ich auch nicht, dass ich so etwas ohne intensive Konsultation der Dokumentation sagen kann. Jedenfalls ist postfix sehr flexibel. Da kann man sehr umfangreiche Konstrukte mit umsetzen, wenn man das denn möchte.

Ich würde es mir wahrscheinlich einfacher machen: Ich würde einen zweiten Postfix (mit anderem Port auf dem gleichen System -> master.cf) aufsetzen und den als Relay für den ersten einsetzen. Der hat dann entsprechende Header- bzw. Body-Checks drin und wenn die greifen, dann wird die Mail abgelehnt und geht mit einem entsprechenden Hinweistext (z. B. "Mail blocked because of Spam") zurück zum Absender (oder alternativ an den postmaster?). Letzteres würde ich als besonders wichtig sehen, dass man da eine Rückmeldung darüber hat, wenn da etwas nicht rausgeht. Falls die Header/Body_checks nichts finden, sendet der 2. Postfix dann die Mails dann weiter ins Internet. Der Mailempfang kann weiterhin über den ersten Postfix laufen.

Ist halt die Frage, was Du damit genau bezwecken möchtest.
Zuletzt geändert von heisenberg am 16.04.2024 22:56:18, insgesamt 1-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
GregorS
Beiträge: 2637
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Postfix, ausgehende Mails nach Inhalt filtern?

Beitrag von GregorS » 16.04.2024 22:52:26

heisenberg hat geschrieben: ↑ zum Beitrag ↑
16.04.2024 18:07:53
Ist halt die Frage, was Du damit genau bezwecken möchtest.
Das sehe ich genauso. Etwas mehr Info dazu wäre hilfreich.

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

HansGraefe
Beiträge: 24
Registriert: 06.05.2022 15:04:32

Re: Postfix, ausgehende Mails nach Inhalt filtern?

Beitrag von HansGraefe » 17.04.2024 07:00:59

Sehr gerne. Die Web-Application liefert alle Mails über:

Code: Alles auswählen

spring.mail.host=localhost
spring.mail.port=25
ab. Postfix ist fast so belassen wie es im Standard konfiguriert wurde:

Code: Alles auswählen

root@example:~$ postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
compatibility_level = 2
inet_interfaces = all
inet_protocols = all
mailbox_size_limit = 0
mydestination = $myhostname, example.example.de, localhost.example.de, , localhost
myhostname = example.example.de
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = /etc/mailname
readme_directory = no
recipient_delimiter = +
relayhost = [smtp-mail.outlook.com]:587
sender_canonical_maps = hash:/etc/postfix/sender_canonical
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/smtp_auth
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
root@example:~$
Die master.cf ist auch Standard:

Code: Alles auswählen

root@example:~$ cat /etc/postfix/master.cf|grep -v "#"
smtp      inet  n       -       y       -       -       smtpd
pickup    unix  n       -       y       60      1       pickup
cleanup   unix  n       -       y       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       y       1000?   1       tlsmgr
rewrite   unix  -       -       y       -       -       trivial-rewrite
bounce    unix  -       -       y       -       0       bounce
defer     unix  -       -       y       -       0       bounce
trace     unix  -       -       y       -       0       bounce
verify    unix  -       -       y       -       1       verify
flush     unix  n       -       y       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       y       -       -       smtp
relay     unix  -       -       y       -       -       smtp
        -o syslog_name=postfix/$service_name
showq     unix  n       -       y       -       -       showq
error     unix  -       -       y       -       -       error
retry     unix  -       -       y       -       -       error
discard   unix  -       -       y       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       y       -       -       lmtp
anvil     unix  -       -       y       -       1       anvil
scache    unix  -       -       y       -       1       scache
postlog   unix-dgram n  -       n       -       1       postlogd
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}

root@example:~$
Diese Application verschickt Benachrichtigungs-Mails, einige sollen verschickt werden, andere nicht. Wonach ich filtern könnte ist mir schon klar, ich weiß nur nicht wie ich das im Postfix einrichte. Vielleicht kann man auch procmail (Erinnerung aus grauer Vorzeit) als Filter in den Mailverkehr einbauen? Aber das war, soweit ich mich erinnere und was ich so in google finde, eher für ankommende eMails.

Benutzeravatar
HZB
Beiträge: 490
Registriert: 22.10.2003 11:52:15
Wohnort: Wien

Re: Postfix, ausgehende Mails nach Inhalt filtern?

Beitrag von HZB » 24.04.2024 06:47:37

Servus,

ich bin mir nicht zu 100% sicher ob das überhaupt funktionieren kann. Das Problem ist, dass die Mail lokal erzeugt wird. Ein möglicher Ansatz wäre die Kontrolle beim versendenden Daemon einzurichten.

In der Main

Code: Alles auswählen

smtp_body_checks = pcre:/etc/postfix/smtp_body_checks.map
und dort die Pattern definieren.

Nächste Thema wird sein, was mit den abgelehnten Mails passieren soll. Für den Test würde ich es auf REJECT setzen. In Produktion dann eher auf DISCARD

lG aus Wien

HansGraefe
Beiträge: 24
Registriert: 06.05.2022 15:04:32

Re: Postfix, ausgehende Mails nach Inhalt filtern?

Beitrag von HansGraefe » 24.04.2024 07:14:28

Guten Morgen,

danke für deine Antwort. Was müsste denn in die Datei /etc/postfix/smtp_body_checks.map rein? Welches Format hat sie?

Benutzeravatar
HZB
Beiträge: 490
Registriert: 22.10.2003 11:52:15
Wohnort: Wien

Re: Postfix, ausgehende Mails nach Inhalt filtern?

Beitrag von HZB » 24.04.2024 07:25:13

Format ist ein Einzeiler

https://www.postfix.org/header_checks.5.html

aus der Doku:

Code: Alles auswählen

/etc/postfix/body_checks:
           /^<iframe src=(3D)?cid:.* height=(3D)?0 width=(3D)?0>$/
               REJECT IFRAME vulnerability exploit
Auch hilfreich
https://regex101.com

HansGraefe
Beiträge: 24
Registriert: 06.05.2022 15:04:32

Re: Postfix, ausgehende Mails nach Inhalt filtern?

Beitrag von HansGraefe » 24.04.2024 08:27:09

Ich habe das so in die main.cf eingetragen:

smtp_body_checks = pcre:/etc/postfix/smtp_body_checks.map

postmap ausgeführt und postfix-pcre installiert. In der smtp_body_checks.map steht:

Code: Alles auswählen

/Ein Text: ein-weiterer-Text/ X REJECT
Aber die Mail kommt durch:

Code: Alles auswählen

postfix/smtp[707717]: warning: unsupported command in smtp_body_checks map: REJECT
Stößt Postfix hier an Grenzen? :cry:

Edit: auch DISCARD:

Code: Alles auswählen

postfix/smtp[708353]: warning: unsupported command in smtp_body_checks map: X DISCARD test
"This feature is not supported with smtp header/body checks." meint wohl genau das .. :(

Benutzeravatar
HZB
Beiträge: 490
Registriert: 22.10.2003 11:52:15
Wohnort: Wien

Re: Postfix, ausgehende Mails nach Inhalt filtern?

Beitrag von HZB » 24.04.2024 08:44:21

Nur zur Sicherheit. Poste bitte mal

Code: Alles auswählen

postconf -m 
was willst Du mit dem X zum Ausdruck bringen ? Das command heißt nur REJECT oder DISCARD

zusätzlich Text erst dahinter

HansGraefe
Beiträge: 24
Registriert: 06.05.2022 15:04:32

Re: Postfix, ausgehende Mails nach Inhalt filtern?

Beitrag von HansGraefe » 24.04.2024 09:24:01

Code: Alles auswählen

root@server:/etc/postfix$ postconf -m
btree
cidr
environ
fail
hash
inline
internal
memcache
nis
pcre
pipemap
proxy
randmap
regexp
socketmap
static
tcp
texthash
unionmap
unix
root@server:/etc/postfix$

Ich habe es auch nur mit:

Code: Alles auswählen

/Ein Text: ein-weiterer-Text/ REJECT
probiert, kommt trotzdem:

Code: Alles auswählen

postfix/smtp[714474]: warning: unsupported command in smtp_body_checks map: REJECT
Postfix Version 3.7.10-0+deb12u1

Benutzeravatar
HZB
Beiträge: 490
Registriert: 22.10.2003 11:52:15
Wohnort: Wien

Re: Postfix, ausgehende Mails nach Inhalt filtern?

Beitrag von HZB » 24.04.2024 09:40:35

Ok das ist etwas strange, aber probier mal folgendes

Was ist der Output von

Code: Alles auswählen

postmap -q "Ein Text: ein-weiterer-Text" pcre:/etc/postfix/smtp_body_checks.map
oder was auch immer Du beim Text eingetragen hast.

Normalerweise sollte REJECT zurückkommen.

EDIT: Nur zur Sicherheit das File heißt smtp_body_checks.map und da ist kein Abstand ? Sieht in der Fehlermeldung nämlich so aus

HansGraefe
Beiträge: 24
Registriert: 06.05.2022 15:04:32

Re: Postfix, ausgehende Mails nach Inhalt filtern?

Beitrag von HansGraefe » 24.04.2024 09:57:30

Ha, es scheint zu funktionieren. Ich habe statt smtp_body_checks nur body_checks in die main.cf gesetzt, jetzt kommt:

Code: Alles auswählen

Apr 24 09:45:24 server.example.de postfix/pickup[717394]: 477D7BF5B9: uid=0 from=<root>
Apr 24 09:45:24 server.example.de postfix/cleanup[717399]: 477D7BF5B9: message-id=<20240424074524.477D7BF5B9@server.example.de>
Apr 24 09:45:24 server.example.de postfix/cleanup[717399]: 477D7BF5B9: discard: body     Ein Text: ein-weiterer-Text      from local; from=<noreply@server.example.de>
Das wäre genau das, was ich erreichen möchte. Habe es mit "mail user@example.org" auf dem Terminal probiert, aber auch bei der Java-Application wird die Mail verworfen. Perfekt!

Vielen vielen Dank für eure Hilfe! Und wieder mal, wie geil ist Postfix...

Antworten