Exim und Greylisting. Position richtig in der ACL?

gammla

Member
Hallo!

Ich benutze Exim auf einem Suse 10.2 System.

Um Spam zu verringen, möchte ich Greylisting einsetzen.
Dazu habe ich den Deamon "greylistd" über Yast installiert und testweise mit einem von Google gefundenen "Konfigurationscode" in meiner exim.conf eingerichtet.
Das ganze funktionierte gut und auch zuverlässig.

Leider habe ich nach ein paar Stunden festestellen müssen, dass intern keinen Mails mehr versendet werden konnte.

Nun gut! Das ganze hat mich nochmals dazu bewogen dieses ganze Greylisting und die Implementierung in Exim zu überdenken.

An dieser Stelle möchte ich die Konfiguration zur Diskussion stellen und um Hilfe bitte um am Schluss kein "offenes Relay" zu sein.

Mein ACL Bereich in der Exim.conf sieht wie folgt aus:

Code:
######################################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
######################################################################

begin acl

# This access control list is used for every RCPT command in an incoming
# SMTP message. The tests are run in order until the address is either
# accepted or denied.

acl_check_rcpt:

  # Accept if the source is local SMTP (i.e. not over TCP/IP). We do this by
  # testing for an empty sending host field.

  accept  hosts = :

  # local via smtp on 127.0.0.1
  accept  hosts = 127.0.0.1

  #############################################################################
  # The following section of the ACL is concerned with local parts that contain
  # @ or % or ! or / or | or dots in unusual places.

  deny    message       = Restricted characters in address
          domains       = +local_domains
          local_parts   = ^[.] : ^.*[@%!/|]

  deny    message       = Restricted characters in address
          domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
  #############################################################################


  # Deny unless the sender address can be verified.

  require verify        = sender

  #############################################################################
  # There are no checks on DNS "black" lists because the domains that contain
  # these lists are changing all the time. However, here are two examples of
  # how you could get Exim to perform a DNS black list lookup at this point.
  # The first one denies, while the second just warns.
  #
  # deny    message       = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text
  #         dnslists      = black.list.example
  #
  # warn    message       = X-Warning: $sender_host_address is in a black list at $dnslist_domain
  #         log_message   = found in $dnslist_domain
  #         dnslists      = black.list.example
  #############################################################################
  

#
#    Hier würde ich Greylisting beginnen lassen!
#
           
  # Accept if the address is in a local domain, but only if the recipient can
  # be verified. Otherwise deny. The "endpass" line is the border between
  # passing on to the next ACL statement (if tests above it fail) or denying
  # access (if tests below it fail).

  accept  domains       = +local_domains
          endpass
          message       = Empfaenger unbekannt / unknown user
          verify        = recipient


  # Accept if the address is in a domain for which we are relaying, but again,
  # only if the recipient can be verified.

  accept  domains       = +relay_to_domains
          endpass
          verify        = recipient

  # If control reaches this point, the domain is neither in +local_domains
  # nor in +relay_to_domains.

  # Accept if the message comes from one of the hosts for which we are an
  # outgoing relay. Recipient verification is omitted here, because in many
  # cases the clients are dumb MUAs that don't cope well with SMTP error
  # responses. If you are actually relaying out from MTAs, you should probably
  # add recipient verification here.

  accept  hosts         = +relay_from_hosts

  # Accept if the message arrived over an authenticated connection, from
  # any host. Again, these messages are usually from MUAs, so recipient
  # verification is omitted.

  accept  authenticated = *

  # Reaching the end of the ACL causes a "deny", but we might as well give
  # an explicit message.

  deny    message       = relay not permitted


# This ACL is used after the contents of a message have been received. This
# is the ACL in which you can test a message's headers or body, and in
# particular, this is where you can invoke external virus or spam scanners.
# Some suggested ways of configuring these tests are shown below, commented
# out. Without any tests, this ACL accepts all messages. If you want to use
# such tests, you must ensure that Exim is compiled with the content-scanning
# extension (WITH_CONTENT_SCAN=yes in Local/Makefile).

acl_check_data:

  # Accept the message.

  accept

Die Greylisting ACL würde ich an der Stelle "Hier würde ich Greylisting beginnen lassen!
" (Siehe ACL exim.conf) beginnen lassen.

Code:
  defer
    message        = $sender_host_address is not yet authorized to deliver \
                     mail from <$sender_address> to <$local_part@$domain>. \
                     Please try later.
    log_message    = greylisted.
    !senders       = : postmaster@*
    !hosts         = : +relay_from_hosts : \
                     ${if exists {/etc/greylistd/whitelist-hosts}\
                                 {/etc/greylistd/whitelist-hosts}{}} : \
                     ${if exists {/var/lib/greylistd/whitelist-hosts}\
                                 {/var/lib/greylistd/whitelist-hosts}{}}
    !authenticated = *
    domains        = +local_domains : +relay_to_domains
    dnslists       = pbl.spamhaus.org : bl.spamcop.net : dnsbl.sorbs.net
    verify         = recipient/callout=10s,defer_ok
    condition      = ${readsocket{/var/run/greylistd/socket}\
                                 {--grey \
                                  $sender_address \
                                  $sender_address \
                                  $local_part@$domain}\
                                 {5s}{}{false}}

Quelle: E-Mail: Greylisting mit Exim und greylistd

An dieser Stelle ist mir noch etwas unklar:

zu "!hosts="

Zitat der oben genannten Quelle:
Diese Hosts werden vom Greylisting generell ausgenommen: Einlieferungen, die nicht per SMTP erfolgen, sondern durch lokalen Aufruf von Exim; Einlieferungen durch Hosts, die per SMTP relayen dürfen, und Einlieferungen durch Hosts, die auf einer der bereits zuvor genannten Whitelists stehen.

Nur auf nummer Sicher zu gehen:
Hierbei handelt es sich nur um den Empfang der E-Mails. Ich werde durch ein Whitelisting eines Hosts nicht automatisch zu einem offenen Realy?

"dnslists" und "verify" würde ich raus nehmen. Bzw. müsste ich mir über das zusätliche Verifizieren nochmals Gedanken machen.

Hebel ich mit dem oben genannten ACL Abschnitte nachfolgende "Sicherheitsmechnismen" aus?

Bzw. ist die geplante Stelle in der ACL für das Greylisting richtig?

Gruß,

Gammla
 
Last edited by a moderator:
Hi,

ich bin zwar kein Exim-Guru, aber prinzipiell bezieht sich diese Zeile von Dir auf den Empfang. Lokale Domains sowie die Domains, die Dich explizit als Mailserver verwenden dürfen sind vom Greylisting ausgenommen. Generell müssen sich die einliefernden Mailserver aber authentifizieren können, da die Verbindung sonst mit "relay not permitted" abgelehnt wird.

-W
 
Super, das hört sich ja schon mal gut an und beruhigt mich!

Danke!

Nun möchte ich noch etwas in den Raum werfen:
Code:
    !senders       = : postmaster@*

Diese Absender werden vom Greylisting generell ausgenommen; das betrifft den leeren Absender <> und den Absender postmaster. Wer hier keine Ausnahmen macht, riskiert Probleme mit der Mailauslieferung an Hosts, die durch einen Callout die Gültigkeit der Absenderadresse zu prüfen versuchen.

Quelle: E-Mail: Greylisting mit Exim und greylistd

Welcher "Absender" wird für diesen Callout verwendet?
Der der im Return-Path steht?
Wenn das so wäre, müsste ich diesen Punkt ergänzen, da der Return-Path von einer php Mail mit schuleratgeberde@hxxxx.stratosever.net angegeben wird?

Das wäre mir noch wichtig zu wissen um sicher zu gehen, dass Mails von dem Registrierungsformular ankommen!

Gruß,

Gammla
 
Hallo!
Vielen Dank für den Hinweis!

Das Problem mit dem Return-Path habe ich hier schon mal angsprochen:

So wie ich die mail() Funktion verstanden habe, müsste ich den Return-Path in meinem "Mailskript" abändern.

Für schuleratgeberde@hxxxx.stratoserver.net habe ich einen Forwarder eingerichtet, der mir Bounces an eine "existierende" E-Mail Adresse weiterleitet.

Um das angesprochene Problem "Call out von remote Host" zu lösen müsste ich die Zeile wie folgt abändern:

Code:
!senders       = : postmaster@* : schuleratgeberde@*

Ist meine Denkweise richtig?

Irgendwie habe ich das Gefühl, dass das nicht die "rguläre" Methode ist!

Wie macht man das "professioniell"?

Gruß,

Gammla
 
Code:
!senders       = : postmaster@* : schuleratgeberde@*

Ist meine Denkweise richtig?
Im Prinzip ist das im Moment deine Whitelist für das Greylisting. Das lässt sich aber eleganter lösen. Bei dieser Direktive sollte tatsächlich nur <> und postmaster aufgeführt werden.

Außerdem sollten die E-Mails "intern" (Absender 127.0.0.1) überhaupt nicht vom Greylisting betroffen sein (siehe deine acl_check_rcpt ACL).
 
Hallo!
Vielleicht solte ich dir nicht vorenthalten, dass in der whitelist-hosts folgendes steht:

Code:
127.0.0.1       # Of course we don't want to delay ourselves or local users
192.168.0.0/24  # Don't delay our private networks either
10.0.0.0/8      # Private net (class A)
172.16.0.0/12   # Another private net

Mit der 127.0.0.1 schließe ich den internen E-Mail Verkehr vom Greylisting aus! Habe ich das richtig verstanden?
Oder muss ich da eine andere Regel in der ACL ändern/hinzufügen?

Im Prinzip ist das im Moment deine Whitelist für das Greylisting. Das lässt sich aber eleganter lösen. Bei dieser Direktive sollte tatsächlich nur <> und postmaster aufgeführt werden.

Es bleibt weiterhin die Idee, die Mail-Skripte durch den -f Paramter so zu ergänzen, dass der Return-Path postmaster@hxxxxx.stratoserver.net ist und nicht schuleratgeberde@hxxxxx.stratoserver.net.

Wäre das der Ansatz für die elegante Lösung?

Wäre dir eine globale Einstellung für den Retrun-Path in Exim bekannt, sodass die Mail-Skripte nicht angepasst werden müssen?

Gruß,

Gammla
 
Ok!
Dann halten wir mal fest das der Return- Path angepasst werden muss!
Muss das tatsächlich im entsprechenden Mailskript erfolgen z.B die Benutzerregistrierung der Webseite. Oder kann man den Return Path in Exim auch global einstellen, sodass ich das "Mailskript" nicht abändern muss.

Gruß,

Gammla
 
Muss das tatsächlich im entsprechenden Mailskript erfolgen z.B die Benutzerregistrierung der Webseite.
Ja. Das geht auch "global" in der php.ini oder in der Apache-Konfiguration bzw. einer .htaccess, wenn mod_php genutzt wird (-> sendmail_path).

Oder kann man den Return Path in Exim auch global einstellen, sodass ich das "Mailskript" nicht abändern muss.
Das wäre möglich, ist aber wie man so schön sagt ein dreckiger Hack.
 
Wunderbar!
Du hast mich mit sendmail_path auf den richtigen Weg gebracht!
Danke!

Ich habe in der php.ini der Webseite den sendmail_path wie folgt angepasst:
Code:
sendmail_path = /usr/sbin/sendmail -t -i -fwebmaster@example.de

Jede Mail die jetzt über sendmail verschickt wird bekommt somit den oben angegebenen Return-Path!

Folglich kann auch bei:
Code:
!senders       = : postmaster@* : schuleratgeberde@*

Code:
: schuleratgeberde@*

entfernt werden.
Vielen vielen Dank!

Außerdem sollten die E-Mails "intern" (Absender 127.0.0.1) überhaupt nicht vom Greylisting betroffen sein (siehe deine acl_check_rcpt ACL).
Diese Problem war mit dem Eintrag in die whitelist-hosts gelöst, oder?

Code:
127.0.0.1       # Of course we don't want to delay ourselves or local users
192.168.0.0/24  # Don't delay our private networks either
10.0.0.0/8      # Private net (class A)
172.16.0.0/12   # Another private net

Gruß,

Gammla
 
Back
Top