Greetings all A question or two if I may regarding authenticated relay and accountability.
I have managed to add a "X-authenticatedID: $authenticated_id" header after much ado about nothing. What I want to do now is change the sender email address (From: email_addie) to the $authenticated_id which in my case is also the senders email address in order to stop sender address spoofing. I may want to change the "Reply-To:" as well if it is set. Basically what I am wanting to do is change : "From: John Doe <[EMAIL PROTECTED]>" to "From: John Doe <[EMAIL PROTECTED]>" where "[EMAIL PROTECTED]" is the spoofed address and "[EMAIL PROTECTED]" is the true email address which is also the $authenticated_id. I also need to account for situations where the name is not given but only the email addie; eg "From: <[EMAIL PROTECTED]>". Maybe I should add the spoofed address as an X-header for tracking? Any assistance in getting this working with the config included below would be greatly appreciated by a mere exim n00b like me. Many thanx for lending me your ears.... or at least your experience and expertise. Regards Michael L Griffin ---------- Forwarded message ---------- Date: 10-Jul-2007 21:13 Subject: exim config To: [EMAIL PROTECTED] ###################################################################### # Environment Variables # ###################################################################### SERVER_IP = 207.210.77.223 hide mysql_servers = localhost::(/var/run/mysqld/mysqld.sock)/DB_NAME/DB_NAME/DB_PASS primary_hostname = mx1.creatronic.com VIRTUAL_DOMAINS = SELECT DISTINCT domain FROM domains \ WHERE type = 'local' AND enabled = '1' \ AND domain = '${quote_mysql:$domain}' RELAY_DOMAINS = SELECT DISTINCT domain FROM domains \ WHERE type = 'relay' \ AND domain = '${quote_mysql:$domain}' ALIAS_DOMAINS = SELECT DISTINCT alias FROM domainalias \ WHERE alias = '${quote_mysql:$domain}' hostlist listen_ip = SERVER_IP domainlist local_domains = @ : \ ${lookup mysql{VIRTUAL_DOMAINS}} : \ ${lookup mysql{ALIAS_DOMAINS}} domainlist relay_to_domains = ${lookup mysql{RELAY_DOMAINS}} hostlist relay_from_hosts = localhost : 207.210.77.223 ###################################################################### # MAIN CONFIGURATION SETTINGS # ###################################################################### #smtp_banner = "FULL_HOSTINFO ESMTP Exim $version_number+ppsw+$compile_number $tod_full" smtp_banner = "Creatronic CC SMTP Server" acl_smtp_helo = acl_check_helo acl_smtp_rcpt = acl_check_rcpt #acl_smtp_auth = acl_check_auth #acl_smtp_mime = acl_check_mime acl_smtp_data = acl_check_data receive_timeout = 15m exim_group = mail exim_user = mail never_users = root trusted_users = mail:michael trusted_groups = mail # Do a name lookup of the calling host - good for logging and problem solving host_lookup = * : !/etc/exim4/ip-allow rfc1413_hosts = * rfc1413_query_timeout = 0s # RFC 822 domain literal format is not a good idea # spammers are the only ones who really use this allow_domain_literals = false helo_allow_chars = _ # If a error message has been frozen it gets removed after 48h ignore_bounce_errors_after = 2d auto_thaw = 2h timeout_frozen_after = 5d # limits the number of simultaneously open files for single-key lookups # that use regular files (that is, lsearch, dbm, and cdb) lookup_open_max = 100 message_size_limit = 15M # If a message is frozen tell the mailmaster (Could result in a flood of email) # freeze_tell_mailmaster = true # Ensure there is enough space otherwise do not accept # mail till space has been made check_log_space = 100M check_spool_space = 100M # Delay warnings delay_warning = 4h:12h:24h # Delay warnings delay_warning_condition = "${if match{$h_precedence:}{(?i)bulk|list|junk}{no}{yes}}" # Abandon queue runs if the load reaches this deliver_queue_load_max = 15 # Check to see if a domain has any illegal characters # & reject if it does as it is then not legitimate dns_check_names_pattern = (?i)^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$ # Retry of DNS lookups dns_retrans = 0s # If people reply to error messages rather reply to Postmaster errors_reply_to = [EMAIL PROTECTED] bounce_return_message = false # Set maximum number of incoming connections smtp_accept_max = 500 # checks that there is enough space in the spool directory.s # partition to accept a message smtp_check_spool_space = false # Reserve SMTP connections for local domain (as in smtp_reserve_hosts). # Good idea for companies with branches or when using multiple servers smtp_reserve_hosts = 127.0.0.1 : *.creatronic.com # Set maximum number of incoming connections from a specific host smtp_accept_max_per_host = 60 #smtp_accept_max_nonmail = 10 # maximum number of waiting SMTP connections. smtp_connect_backlog = 50 # Message Filter - a file which is used to all messages system_filter = /etc/exim4/exim-mail_filter # Accept incoming connections from reserved hosts if load is above this # (See smtp_reseve_hosts above) smtp_load_reserve = 20 # system load average is higher than this value, incoming messages from all # sources are queued, and no automatic deliveries are started. # This also affect smtp_reserve_hosts queue_only_load = 25 # Maximum number of queue-running processes that an Exim # daemon will run simultaneously. queue_run_max = 20 # Controls parallel delivery of one message to a number of remote hosts. # If the value is less than 2, parallel delivery is disabled, and Exim does # all the remote deliveries for a message one by one. Otherwise, if a single # message has to be delivered to more than one remote host, or if several copies # have to be sent to the same remote host, up to remote_ max_parallel # deliveries are done simultaneously. remote_max_parallel = 200 # Maximum number of received headers allowed for mail loop detection received_headers_max = 80 # If this option is set greater than zero, it specifies the maximum number of # original recipients for any message. Additional recipients that are generated # by aliasing or forwarding do not count. SMTP messages get a 452 response for # all recipients over the limit; earlier recipients are delivered as normal. # Non-SMTP messages with too many recipients are failed, and no deliveries are done. # Note: The RFCs specify that an SMTP server should accept at least 100 RCPT # commands in a single message. # Maximum number of recipients recipients_max = 40 # When there are a number of remote deliveries for a message, they are sorted by # domain into the order given and delivered in priority per the list # The order of the domains denotes their priority remote_sort_domains = *.creatronic.com : *.co.za : *.org.za : *.za.net : *.za : * # Timeout value for SMTP reception smtp_receive_timeout = 2m # Split the spool directory into 62 subdirectories. # Greatly improves performance . especially on busy systems split_spool_directory = true # Maximum message size when a message is bounced # This option is an obsolete synonym for bounce_return_size_limit. # return_size_limit = 20k # Limit in bytes on the size of messages that are returned to senders as # part of bounce messages (Default 100K) bounce_return_size_limit = 20k # Redundant pairs of angle brackets round .route-addr. items in addresses are # stripped. For example, <<[EMAIL PROTECTED]>> is treated as <[EMAIL PROTECTED]>. # If this is in the envelope and the message is passed on to another MTA, # the excess angle brackets are not passed on. If this option is # not set, multiple pairs of angle brackets cause a syntax error. strip_excess_angle_brackets = true # The trailing dot at the end of a domain in an address is ignored. # If this is in the envelope and the message is passed on to another MTA, # the dot is not passed on. If this option is not set, a dot at the end # of a domain causes a syntax error. However, addresses in header lines are # checked only when an ACL requests header syntax checking. strip_trailing_dot = true # Used to suppress the advertisement of the SMTP PIPELINING extension to # specific hosts. When PIPELINING is not advertised and smtp_enforce_sync # is true, an Exim server enforces strict synchronization for each SMTP # command and response. When PIPELINING is advertised, Exim assumes that # clients will use it; .out of order. commands that are .expected. do not # count as protocol errors (see smtp_max_synprot_errors). pipelining_advertise_hosts = : # From Exim 4.53, this option is obsolete but kept for backward compatibility # helo_try_verify_hosts = * # By default, Exim uses bland messages such as .Administrative prohibition. # when it rejects SMTP commands for policy reasons. Many sysadmins like # this because it gives away little information to spammers. However, some # other syadmins who are applying strict checking policies want to give out # much fuller information about failures. # Setting smtp_ return_ error_ details true causes Exim to be more forthcoming. # (Good for debugging but not recommended for live sites) smtp_return_error_details = false # Used to reduce or increase the number of things written to the log files. # Its arguments are made up of names preceded by plus or minus characters. #log_selector = +all log_selector = +all_parents \ +smtp_confirmation \ +smtp_syntax_error \ +deliver_time \ +queue_run ################################################################################ # ACL CONFIGURATION # # Specifies access control lists for incoming SMTP mail # ################################################################################ begin acl #-<HELO ACL>---------------------------------------------------------------------- acl_check_helo: accept hosts = : accept hosts = SERVER_IP : +relay_from_hosts drop condition = ${if match{$sender_helo_name}{SERVER_IP}{yes}{no} } log_message = Rejected - Spammer pretending to be us message = "Dropped spammer pretending to be us" delay = 5m deny condition = ${if isip {$sender_helo_name}{true}{false}} log_message = IP Address $sender_helo_name in HELO greeting message = "IP address in HELO greeting" delay = 3m accept #-</HELO ACL>--------------------------------------------------------------------- #-<RCPT ACL>---------------------------------------------------------------------- acl_check_rcpt: accept hosts = : deny message = Restricted characters in email address local_parts = ^[.] : [EMAIL PROTECTED]/|] : ^.*/\\.\\./ log_message = DENY : Restricted characters in email address domains = +local_domains delay = 30s drop hosts = net-iplsearch;/etc/exim4/exim-reject-hosts message = Connection Denied for $sender_host_address - blacklisted host log_message = Denied $sender_host_address - blacklisted host delay = 20s require verify = sender accept domains = +local_domains local_parts = postmaster deny message = Connection denied for $sender_address - blacklisted sender log_message = Denied $sender_address - blacklisted sender senders = lsearch;/etc/exim4/exim-bouncelist delay = 30s # RBL Checking deny message = DNSBL listed at $dnslist_domain\n$dnslist_text dnslists = sbl-xbl.spamhaus.org : \ list.dsbl.org : \ bl.spamcop.net : \ dnsbl.ahbl.org : \ cn-kr.blackholes.us : \ dynablock.njabl.org delay = 3m !sender_domains = lsearch;/etc/exim4/exim-domain_whitelist # Legitimate bounces are never sent to more than one recipient deny condition = $recipients_count message = Legitimate bounces are never sent to more than one recipient. log_message = DENY : Legitimate bounces are never sent to more than one recipient. senders = : [EMAIL PROTECTED] # Anti-dictionary attack. See http://www.configserver.com/free/eximdeny.html # for a more intelligent method # If more than 4 unkown recipients are received within a single connection # It is more than like spammers fishing by trying a dictionary of localparts deny condition = ${if >{$rcpt_fail_count}{3} {1}{0}} domains = +local_domains message = Multiple unknown users - Suspected dictionary attack. log_message = DENY : Multiple unknown users ($rcpt_fail_count) - Suspected dictionary attack. !verify = recipient delay = ${eval:30*$rcpt_fail_count}s accept authenticated = * # add_header = X-Authenticated: $authenticated_sender add_header = X-AuthenticatedID: $authenticated_id accept domains = +local_domains endpass message = unknown user verify = recipient set acl_m0 = [EMAIL PROTECTED] accept domains = +relay_to_domains endpass message = unrouteable address verify = recipient # set acl_m1 = $domain accept hosts = +relay_from_hosts deny message = authentication required - relay not permitted log_message = DENY : authentication required - relay not permitted #-</RCPT ACL>--------------------------------------------------------------------- #-<AUTH ACL>-------------------------------------------------------------------- acl_check_auth: # Have nothing to put here - maybe the rewrite? accept #-</AUTH ACL>-------------------------------------------------------------------- #-<MIME ACL>---------------------------------------------------------------------- ## Causes temp failure - fix it! : ## 2007-03-24 21:25:45 1HVBs0-0007AS-Ur H=ug-out-1314.google.com [66.249.92.175] F=<[EMAIL PROTECTED]> temporarily rejected during MIME ACL checks: cannot check header contents in ACL for MIME (only possible in ACL for DATA) #acl_check_mime: # warn !verify = header_syntax # warn !verify = header_sender # # deny message = This message contains a MIME error ($demime_reason) # log_message = DENY : MIME error ($demime_reason) # condition = ${if <{$message_size}{32k}{1}{0}} # demime = * # condition = ${if >{$demime_errorlevel}{2}{1}{0}} # # deny message = File type unacceptable (filename: $mime_filename) # condition = ${lookup{${lc:${sg{$mime_filename}{^.+\\.([a-zA-Z0-9]+)\$}{\$1}}}} \ # lsearch{/etc/exim4/exim-rejected_file_type}{yes}{no}} # #accept #-</MIME ACL>--------------------------------------------------------------------- #-<DATA ACL>---------------------------------------------------------------------- acl_check_data: # Hosts and authenticated clients listed here will not be scanned by SA & ClamAV accept hosts = +relay_from_hosts : SERVER_IP accept authenticated = * #-</DATA ACL>--------------------------------------------------------------------- accept ############################################################################### # ROUTERS CONFIGURATION # # Specifies how addresses are handled # ################################################################################# # THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT! # # An address is passed to each router in turn until it isaccepted. # ################################################################################# begin routers #--------------------------------------------------------------------------------- dnslookup: driver = dnslookup domains = ! +local_domains transport = remote_smtp ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 no_more #--------------------------------------------------------------------------------- mailman_router: driver = accept require_files = MAILMAN_HOME/lists/$local_part/config.pck local_part_suffix_optional local_part_suffix = -bounces : -bounces+* : \ -confirm+* : -join : -leave : \ -owner : -request : -admin transport = mailman_transport #--------------------------------------------------------------------------------- mysql_vacation: driver = accept condition = ${if and { {!match {$h_precedence:}{(?i)junk|bulk|list}} \ {eq {${lookup mysql{select users.on_vacation \ from users,domains \ where localpart = '${quote_mysql:$local_part}' \ and domain = '${quote_mysql:$domain}' \ and users.on_vacation = '1' \ and users.domain_id=domains.domain_id}}}{1} }} {yes}{no} } no_verify no_expn unseen transport = virtual_vacation_delivery #--------------------------------------------------------------------------------- mysql_forward: driver = redirect check_ancestor data = ${lookup mysql{select forward from users,domains \ where localpart='${quote_mysql:$local_part}' \ and domain='${quote_mysql:$domain}' \ and users.domain_id=domains.domain_id \ and on_forward = '1'}} # We explicitly make this condition NOT forward mailing list mail! condition = ${if and { {!match {$h_precedence:}{(?i)junk|bulk|list}} \ {eq {${lookup mysql{select users.on_forward \ from users,domains \ where localpart = '${quote_mysql:$local_part}' \ and domain = '${quote_mysql:$domain}' \ and users.on_forward = '1' \ and users.domain_id=domains.domain_id}}}{1} }} {yes}{no} } #--------------------------------------------------------------------------------- mysql_aliases: driver = redirect allow_fail allow_defer data = ${lookup mysql{select smtp from users,domains \ where localpart='${quote_mysql:$local_part}' \ and domain='${quote_mysql:$domain}' \ and users.domain_id=domains.domain_id \ and users.type='alias'}} #--------------------------------------------------------------------------------- mysql_user: driver = accept condition = ${if eq{} {${lookup mysql {SELECT concat(pop,'/',smtp) \ FROM users,domains \ WHERE username = \ '${quote_mysql:[EMAIL PROTECTED]:$domain}'}}}{no}{yes}} retry_use_local_part transport = virtual_delivery #--------------------------------------------------------------------------------- mysql_catchall: driver = redirect allow_fail #MLG data = ${lookup mysql{select smtp from users,domains where localpart = '*' \ data = ${lookup mysql{select smtp from users,domains where localpart = '*' \ and domain = '${quote_mysql:$domain}' \ and users.domain_id = domains.domain_id}} retry_use_local_part file_transport = virtual_delivery reply_transport = address_reply #--------------------------------------------------------------------------------- virtual_domain_alias: driver = redirect allow_fail data = ${lookup mysql{select concat('${quote_mysql:$local_part}@', domain) \ from domains,domainalias \ where domainalias.alias = '${quote_mysql:$domain}' \ and domainalias.domain_id = domains.domain_id}} retry_use_local_part #--------------------------------------------------------------------------------- ########################################################################### # TRANSPORTS CONFIGURATION # ########################################################################### # ORDER DOES NOT MATTER # # Only one appropriate transport is called for each delivery. # ##################################################################### begin transports #--------------------------------------------------------------------------------- remote_smtp: driver = smtp #--------------------------------------------------------------------------------- virtual_delivery: driver = appendfile maildir_format = true create_directory = true directory = ${lookup mysql{select concat(pop,'/',smtp) from users,domains \ where localpart = '${quote_mysql:$local_part}' \ and domain = '${quote_mysql:$domain}' \ and users.domain_id = domains.domain_id}} user = 8 group = 12 quota = ${lookup mysql{select users.quota from users,domains \ where localpart = '${quote_mysql:$local_part}' \ and domain = '${quote_mysql:$domain}' \ and users.domain_id = domains.domain_id}{${value}M}} quota_is_inclusive = false quota_size_regex = ,S=(\d+): quota_warn_threshold = 75% maildir_use_size_file = false quota_warn_message = "To: [EMAIL PROTECTED] Subject: Your mailbox has reached a warning threshold \ This message was automatically generated by the mail delivery software\n\ and is sent from an unmonitored address - please do not reply!\n\n\ You are now using over 75% or ${extract{quota}{${address_data}}} of your allocated mail storage quota.\n\n\ If your mailbox fills completely, further incoming messages sent to [EMAIL PROTECTED] will be automatically\n returned to their senders.\n\n\ WARNING : Exceeding your quota will result in a loss of email!!\n\n\ Please take note of this and remove unwanted mail from your mailbox.\n" #--------------------------------------------------------------------------------- virtual_vacation_delivery: driver = autoreply log = /var/spool/exim4/exim_vacation.log once =/var/spool/exim4/db/vacation.db once_repeat = 1d from = "[EMAIL PROTECTED]" to = ${sender_address} subject = "Autoreply from [EMAIL PROTECTED]" text = ${lookup mysql{select vacation from users,domains \ where domain='${quote_mysql:$domain}' \ and localpart='${quote_mysql:$local_part}' \ and users.domain_id=domains.domain_id}} #--------------------------------------------------------------------------------- address_file: driver = appendfile delivery_date_add envelope_to_add return_path_add #--------------------------------------------------------------------------------- address_reply: driver = autoreply ################################################################################# # RETRY CONFIGURATION # ################################################################################# begin retry # Domain Error Retries # ------ ----- ------- * quota * * F,2h,15m; G,16h,1h,1.5; F,4d,6h ################################################################################# # REWRITE CONFIGURATION # ################################################################################# begin rewrite ################################################################################# # AUTHENTICATION CONFIGURATION # ################################################################################# begin authenticators plain_login: driver = plaintext public_name = PLAIN server_condition = ${lookup mysql{SELECT '1' FROM users \ WHERE username = '${quote_mysql:$2}' \ AND clear = '${quote_mysql:$3}'} {yes}{no}} server_set_id = $2 fixed_login: driver = plaintext public_name = LOGIN server_prompts = "Username:: : Password::" server_condition = ${lookup mysql{SELECT '1' FROM users \ WHERE username = '${quote_mysql:$1}' \ AND clear = '${quote_mysql:$2}'} {yes}{no}} server_set_id = $1 fixed_cram: driver = cram_md5 public_name = CRAM-MD5 server_secret = ${lookup mysql{SELECT clear FROM users \ WHERE username = '${quote_mysql:$1}'}{$value}fail} server_set_id = $1 # End of Exim configuration -- ## List details at http://www.exim.org/mailman/listinfo/exim-users ## Exim details at http://www.exim.org/ ## Please use the Wiki with this list - http://www.exim.org/eximwiki/