Dies ist die archivierte Version des Blogs vom 05.01.2017. Aktuelle Beiträge findest du unter thomas-leister.de
 

Mit dem Standard-Mailserver-Setup nach meiner Anleitung können Benutzer des Mailservers E-Mails über einen falschen Namen verschicken. Das lässt sich z.B. über Mozilla Thunderbird und die „Identitäten“-Funktion in der Kontenverwaltung realisieren. Ein Benutzer user1@domain.de ist also in der Lage, eine E-Mail zu verschicken, die nicht seinen eigenen Benutzernamen als Absenderadresse trägt, sondern beispielsweise user2@domain.de. Dass dieses „Feature“ von den Benutzern missbraucht werden kann, ist selbstverständlich. Solcher Missbrauch kann dann nur doch eine entsprechende Analyse des Logfiles aufgeklärt werden. Der Empfänger der E-Mail hat aber selbst keine Möglichkeit, die Fälschung zu enttarnen.

Besser ist es, dem Missbrauch vorzubeugen und festzulegen, dass ein Benutzer als Absenderadresse nur seine eigene Mailadresse (oder ausgewählte andere Adressen) verwenden darf.

In der Postfix Hauptkonfiguration werden dazu folgende neue Einstellungen festgelegt:

smtpd_sender_login_maps = mysql:/etc/postfix/virtual/sender-login-maps.cf
smtpd_sender_restrictions = permit_mynetworks, reject_non_fqdn_sender, reject_sender_login_mismatch, permit_sasl_authenticated

Durch die erste Zeile wird der Pfad zu einer SQL-Datei angegeben, die SQL-Anweisungen enthält. Durch diese Anweisungen kann der SQL Server gefragt werden, welche Mailadressen der aktuelle Benutzer als Absenderadresse verwenden darf. In Normalfall ist das nur die eigene Mailadresse. Es können jedoch auch weitere Mailadressen definiert werden, die verwendet werden dürfen.

Die Datei „/etc/postfix/virtual/sender-login-maps.cf“ muss neu angelegt werden und enthält folgenden Inhalt (DB Zugang anpassen!):

user = [db benutzername]
password = [passwort]
hosts = 127.0.0.1
dbname = [db name]
query = SELECT concat(username, '@', domain) FROM users WHERE username='%u' AND domain='%d'

Update um 19:57: Noch effizienter funktioniert die Abfrage so:

query = SELECT '%u@%d' AS mailaddress

… weil man der DB hierbei die „WHERE“-Suche erspart. ;)

Die Anfrage „query“ ist hierbei auf mein eigenes Datenbanklayout angepasst: Ich verwende je eine Spalte für Benutzernamen und Domain. Ggf. muss die Anfrage ebenfalls angepasst werden. Wichtig ist hierbei nur: Dem SQL Server wird die aktuelle Mailadresse (oder jeweils beide Teile davon) des Benutzers mitgeteilt, und das Ergebnis muss eine oder mehrere vollständige Mailadresse[n] sein. Die Beispielabfrage führt immer dazu, dass die eigene Mailadresse des aktuellen Benutzer als einzige Absenderadresse zugelassen wird. Das sollte in der Regel eine vernünftige Einstellung sein.

Wollte man weitere Mailadressen zulassen, würde sich eine eigene Tabelle dafür in der Datenbank eignen, die die „Besitzverhältnisse“ enthält.

Die zweite Zeile in der Postfix Konfiguration aktiviert letztendlich diese Beschränkung: Benutzer dürfen von nun an nur noch die Mailadressen als Absenderadressen verwenden, die vom SQL Server zurückgegeben wurden. Hier im Beispiel ist das nur die eine Adresse, die dem Benutzer ohnehin gehört.

Nach diesen Änderungen muss der Postfix Mailserver mit

service postfix restart

neu gestartet werden. Wenn ihr die neuen Einstellungen testen wollt, könnt ihr das sehr bequem mit Mozilla Thunderbird machen. Einfach in die Konteneinstellungen wechseln, eine neue Identität mit einer falschen E-Mail Adresse (die einem nicht gehört) anlegen und versuchen, über diese eine E-Mail zu verschicken. Der Vorgang sollte mit der Fehlermeldung „Sender address rejected: not owned by user“ abgebrochen werden.


Post published on 9. November 2014 | Last updated on 10. Januar 2015
Tags:               

Diesen Blog unterstützen

Wenn Dir der Beitrag gefallen hat, freue ich mich über einen kleinen Obolus :-) Bitcoin QR Code

PayPal-Seite: https://www.paypal.me/ThomasLeister
Meine Bitcoin-Adresse: 15z8 QkNi dHsx q9WW d8nx W9XU hsdf Qe5B 4s

Siehe auch: Unterstützung

Informationen zum Autor

Thomas Leister

Geb. 1995, Kurzhaar-Metaller, Geek und Blogger. Nutzt seit Anfang 2013 ausschließlich Linux auf Desktop und Servern. Student der Automobilinformatik an der Hochschule für angewandte Wissenschaften in Landshut.

33 thoughts on “Postfix: Versenden mit falschem Absender verhindern

  • Der Empfänger der E-Mail hat aber selbst keine Möglichkeit, die Fälschung zu enttarnen.

    Genau das ist aber doch mittels SPF möglich.

  • HI,

    bei der folgenden Anfrage kann ich keine Nachtricht mehr empfangen.

    > query = SELECT ‚%u@%d‘ AS mailaddress

    VG

  • Hi,

    gibt es schon eine Erklärung für die folgende Meldung :

    > www dovecot: auth-worker(20183): Error: sql(admin@……): User query failed: Unknown column ‚home‘ in ‚field list‘ (using built-in default user_query: SELECT home, uid, gid FROM users WHERE username = ‚%n‘ AND domain = ‚%d‘)

    Danke im Voraus.

    Pulsar

  • Offenbar hast du in der Datei /etc/dovecot/dovecot-sql.conf etwas auskommentiert, was du nicht auskommentieren darfst, weil es mit deinem System nicht übereinstimmt. Wenn du nach meiner Anleitung vorgegangen bist, darf dieser Block: …

    # Examples:
    # user_query = SELECT home, uid, gid FROM users WHERE userid = ‚%u‘
    # user_query = SELECT dir AS home, user AS uid, group AS gid FROM users where userid = ‚%u‘
    # user_query = SELECT home, 501 AS uid, 501 AS gid FROM users WHERE userid = ‚%u‘
    #
    #user_query = \
    # SELECT home, uid, gid \
    # FROM users WHERE username = ‚%n‘ AND domain = ‚%d‘

    … beispielsweise nicht auskommentiert werden. Stattdessen wird „userdb“ in der dovecot.conf statisch konfiguriert.

    LG Thomas

  • Hi,
    ich bekomme folgende Fehlermeldung in Thunderbird wenn ich das so umsetze wie hier beschrieben (bei jeder Art von Mail Adresse):
    „Fehler beim Senden der Nachricht: Der Mail-Server antwortete: 4.3.0 : Temporary lookup failure. Bitte überprüfen Sie die E-Mail-Adresse mail@mail.de und wiederholen Sie den Vorgang.“

  • Ok, sorry! Mein Fehler. hatte ein Tippfehler im Passwort.

    Jetzt klappts. Danke für das Tutorial :)

  • Wie man anhand der Uhrzeit unschwer erkennen kann, verzweifle ich hier grade :D
    Wie schon in einem anderen Kommentar von „Pulsar“, kann ich keine Emails mehr empfangen, sobald ich „smtpd_sender_login_maps = mysql:/etc/postfix/virtual/sender-login-maps.cf“ aktiviere. Warum?^^

    • Nachdem ich diese 2 Zeilen einfach mal weiter nach oben geschoben haben und NICHT unter
      ##### TLS settings ######
      ### outgoing connections ###
      ### incoming connections ###
      gesetzt habe, funktioniert es…. Und dafür 3 Stunden xD
      Gute Nacht Thomas :D

      • Hi,

        gut dass du eine Lösung gefunden hast. Aber eines finde ich merkwürdig: Ich kann den smtp_sender_login_maps-Block in der Konfiguration umherschieben wie ich will: Unter die TLS Settings, über die TLS Settings … macht überhaupt keinen Unterschied bei mir :-/ Sollte es ja eigentlich auch nicht.

        Vllt hast du durch die Schieberei unbewusst etwas falsches verbessert ;)

        Oder deine Konfiguration unterscheidet sich stärker von meiner.

        LG Thomas

      • Vielen Dank für den Tipp mit dem Verschieben.

        Bei mir funktionierte das Weiterleiten von Mails von einem db-username zum anderen db-username nicht.
        Fehlermeldung Thunderbird: “Fehler beim Senden der Nachricht: Der Mail-Server antwortete: 4.3.0 : Temporary lookup failure. Bitte überprüfen Sie die E-Mail-Adresse mail@mail.de und wiederholen Sie den Vorgang.”

        Nachdem ich dann die beiden Zeilen verschoben habe, läuft alles perfekt

  • Muss ich das auch Einrichten wenn ich im Einzeluser-Betrieb den Mailserver nutze?

    Bzw. ist diese Massnahme notwendig um Spammer vorzubeugen die meinen SMTP Server anonym nutzen möchten? (Offenes Mail-Relay) Oder reicht hierfür die Standard-Einrichtung von dir?

  • Hallo Thomas,

    wie immer vielen Dank für die gute Anleitung!
    Ich habe alles wie beschrieben eingerichtet. Der Mailversand über den Server funktioniert nach wie vor, allerdings akzeptiert der Server jetzt keine Emails, die an ihn gesandt werden, mehr und antwortet mit


    553 5.7.1 : Sender address rejected: not logged in

    Irgendwie scheint er jetzt auch von außen eingehende Mails zu überprüfen.

    Kannst du da weiterhelfen?

  • Hallo Thomas,

    gleiches Problem wie „Joshua Gleitze“. Versand geht noch, jedoch immer noch mit falschem Absender möglich. Selbst Adressen die nicht existieren funktionieren. Von außen nimmt er aber überhaup keine mails mehr an.

  • Die query:
    query = SELECT ‚%u@%d‘ AS mailaddress

    ist auch totaler humbug.
    das %u und %d wird vermutlich von postfix als frage an die datenbank weitergereicht.
    was die query jetzt macht ist einen String „%u@%d“ zurückzugeben (also die reingereichte addresse von postfix)
    Es wird überhaupt nicht in der datenbank nachgeschaut, ob ein solcher user existiert.

    Das könnt ihr ganz leicht ausprobieren indem ihr folgende anfrage an (irgendeine) sql datenbank stellt:

    Select ‚irgend ein lustiger text, oder eine emailaddresse die durch reignereichte parameter erzeugt wird, aber definitiv nirgendow in der Datenbank gespeichert ist‘ as lustigerText;

  • Ich habe hier was interessantes gefunden:
    http://neunzehn83.de/blog/2012/01/29/postfix-reject_sender_login_mismatch-pro-sasl-username.html

    Man kann da einfach die Informationen aus der Datenbank rausholen, und zum Beispiel mit einem Boolean an einem User das erlauben unter (allen) aliases zu senden. Denkbar wäre auch über eine weitere Alias tabelle für einen login eine menge von emailaddressen,. von denen aus gesendet werden darf zu erlauben.

    Wäre toll wenn man das in webmum integrieren könnte.

    BTW webmum. du solltest anstelle der domain als string in der usertabelle lieber einen fremdschlüssel (domain_id) ,der auf die domain aus der Domain tabelle zeigt benutzen und darüber nen einfachen inner join machen.

    Dann kannst du dir die logik beim entfernen von domains sparen (dass alle emailadressen mit der selben domain gelöscht werden) und kannst einfach über ein ON DELETE CASCADE (http://www.mysqltutorial.org/mysql-on-delete-cascade/) die betreffenden Emailadressen mit löschen.

    Ich schaumal ob ich da wenn ich Zeit habe mal etwas zusammenklöppeln kann.

  • Hallo,

    vielen Dank für die super posts zum Aufsetzen eines E-Mail Servers – das ist großartig!

    Eine Frage zum Erlauben von Aliases beim Versenden von Mails. Ich habe den Query so abgeändert:

    query = SELECT concat(username, ‚@‘, domain) FROM users
    WHERE username=’%u‘ AND domain=’%d‘
    UNION
    SELECT source FROM aliases WHERE destination=’%u@%d‘

    (alles in einer Zeile). Damit sollte es ja eigentlich gehen, nur werden weiterhin die aliase restricted. Kann mir bitte jemand sagen, wo mein Denkfehler liegt?

    Vielen Dank und Gruß aus Wien,
    Georg

    • Hi,

      auf meinem Mailserver habe ich die Query auch geändert und genauso wie du erweitert, damit man auch über Aliase versenden kann.
      … und ich habe dasselbe Problem :( Wenn ich mit dem Postmap-Kommando prüfe, werden auch Aliase als gültige Absenderadressen erkannt,
      aber Postfix verweigert das Versenden über Aliase dann trotzdem. Ich rätsle auch gerade, wo der Fehler liegt :(

      LG Thomas

      • Danke für die schnelle Antwort.

        Kann es irgendwie daran liegen, wie die Liste aufgebaut ist, also z.B. an den delimitern? Ich habe mir die anderen Querys in Deinen Posts angeschaut und da wird ja (soweit ich es richtig lese) immer nur eine Adresse zurückgegeben. Das hier ist m.E. der erste Fall, in dem eine Liste von postfix verarbeitet weden muss.

        Dank & Gruß
        Georg

        • Das ist richtig, hier wird eine Liste verarbeitet. Aber auch damit kommt Postfix laut Dokumentation zurecht, da verschiedenen Konfigurationsparametern auch Listen zugewiesen werden können – so auch dem „smtpd_sender_login_maps“

          LG Thomas

          • Das Problem ist das Postfix als %u und %d den alias übergibt. Der Korrekte Query heißt also:
            SELECT concat( username, ‚@‘, domain )
            FROM users
            WHERE username = ‚%u‘
            AND domain = ‚%d‘
            UNION SELECT source
            FROM aliases
            WHERE destination = ‚%u@%d‘
            UNION SELECT destination
            FROM aliases
            WHERE source = ‚%u@%d‘

            am besten zu testen mit: $ postmap -q user@domain.tld mysql:/etc/postfix/virtual/sender-login-maps.cf

            Gruß Marco

            • Inhalt der sender-login-maps.cf jetzt: (für copy’n’paste)


              user = [db benutzername]
              password = [passwort]
              hosts = 127.0.0.1
              dbname = [db name]
              query = SELECT concat( username, '@', domain ) FROM users WHERE username = '%u' AND domain = '%d' UNION SELECT source FROM aliases WHERE destination = '%u@%d' UNION SELECT destination FROM aliases WHERE source = '%u@%d'

            • Auch deine Querry ist nicht ganz richtig :P

              Der mittlere Teil „UNION SELECT source FROM aliases WHERE destination = ‚%u@%d‘“ ist unnötig, da Postfix sich hier nur die Alias holen würde, wenn man die original Adresse benutzt. Sinnvoll wäre es nur wenn man mehrere Aliase hat, welche aufeinander zeigen. Aber auch hier würde nur eine Verkettung gehen.

              Somit genügt folgendes:

              query = SELECT concat( username, ‚@‘, domain ) FROM users WHERE username = ‚%u‘ AND domain = ‚%d‘ UNION SELECT destination FROM aliases WHERE source = ‚%u@%d‘

  • Hallo Thomas,
    Du hast den Hut auf – und ich kann nur sagen – Hut ab!!! Wie immer ein gelungenes HowTo. Großartig! DANKE

  • Ich hatte Probleme, dass Roundcube-Nutzer, welches auf der gleichen Maschine läuft, trotzdem beliebigen Sende-Adressen nutzen können. Um das zu verhindern, ist es wichtig, dass bei der RoundCube-Configuration die Domain oder die externe IP als SMTP-Adresse angegeben wird.


    $config['smtp_server'] = 'tls://mail.DOMAIN.de';

    • Die Ursache ist permit_mynetworks ist vor reject_sender_login_mismatch. Also nicht so:
      smtpd_sender_restrictions = permit_mynetworks, reject_non_fqdn_sender, reject_sender_login_mismatch, permit_sasl_authenticated

      sondern z.B. so:
      smtpd_sender_restrictions = reject_non_fqdn_sender, reject_sender_login_mismatch, permit_mynetworks, permit_sasl_authenticated

  • habe mehrer users in jeweils 5 domains auf meinem mailserver. ich kann mich über roundcube auf jeden dieser user einloggen und mails versenden innerhalb und außerdem des servers.
    Jedoch kann ich mails von einem externen programm (sugarCRM)
    nur über domains versenden, die nicht die erste domain die ich hinzugefügt habe sind, wenn ich die beiden einstellungen
    #smtpd_sender_login_maps = …
    #smtpd_sender_restrictions = …
    herauskommentiere.

    SELECT concat(username, ‚@‘, domain) FROM users WHERE username=’%u‘ AND domain=’%d‘
    müsste doch aber alle username/domain kombinationen ansprechen, die auf dem Server sind oder?
    Für was genau steht %u und %d eigentlich?
    Grüße Lukas

    • Hi Lukas,

      Die MySQL-Query sollte alle Kombinationen von Usernames und Domains erfassen – korrekt. Dabei ist aber zu beachten, dass du _nicht_ über Adressen senden kannst, die nur ein Alias sind. Das geht nur mit „echten“ Mailboxen. Solltest du über Aliase senden wollen, müsstest du die Query so erweitern, dass auch Aliase auf ihre Existenz geprüft werden.

      %u steht für den Username, der Mailadresse, die senden will… und %d für die Domain. %u und %d werden von Postfix jeweils automatisch ersetzt und sind nur Platzhalter.

      LG Thomas

      • die Mailboxen existieren alle auf dem Server. Deswegen habe ich mich ja auch so gewundert.
        Ist das herauskommentieren von
        #smtpd_sender_login_maps = …
        #smtpd_sender_restrictions = …
        ein großes Risiko?

        • Du reißt damit zwar kein riesiges Loch in deinen Server, aber empfehlen kann ich es nicht. Wenn du diese Zeilen streichst, erlaubst du deinen Benutzern, mit beliebigen E-Mail Adressen zu senden. Das ist vor allem zum Spammen super geeignet. Sollte einer der Accounts geknackt werden z.B. durch Brute Force, kann man damit prima Spam / Phishing Mails im Namen Fremder verschicken. :-/

          LG Thomas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.