Exim

Exim - 限制使用者可以發送的地址

  • April 9, 2020

預設情況下,exim 允許任何使用者使用他們希望的任何“發件人:”地址發送電子郵件,這可能導致使用者相互欺騙。如何限制每個系統使用者可以發送的地址?例如,使用者james應該能夠從 james@localhost 發送,但也可以從 me@my-domain.comjames@other-domain.com 發送。

我希望所有系統使用者都能夠從他們的 SYSTEM_USER@HOSTNAME 發送電子郵件,但是如果他們嘗試從另一個地址發送,我想在文本文件中查找該地址以查看是否允許。

我目前有一個列表,但它是系統使用者將從哪些地址收到的。但它仍然可以工作。給定範例me@my-domain.com,數據儲存在/etc/exim4/virtual/my-domain.com內容如下所示的文件中:

me : james@localhost

如果我們可以重用現有的文件,那就太好了。但任何建議都會有所幫助。先感謝您。

Exim4已經對信封發送者From:Sender:本地送出的消息(參見受信任的使用者)進行了一些標準檢查。由於您想擴展此驗證,您應該:

  • 對於通過sendmail(ie exim4 -bm)送出的消息,在主配置部分添加:
# allow untrusted users to set an envelope sender
untrusted_set_sender = *
# don't delete the Sender: header
local_sender_retain = true
# don't add Sender: header
local_from_check = false
  • 對於通過您送出的消息,SMTP您需要添加control = submission/sender_retain修飾符。例如 Debian 在MAILacl 中有一個規則:
accept
 authenticated = *
 control = submission/sender_retain
 control = dkim_disable_verify

要配置您的支票,您需要ACL在郵件處理的不同階段添加一些規則。由於這些規則需要應用於不同的消息送出方式,您可以創建一個新的命名ACL(我假設您的所有/etc/exim4/virtual/<domain>文件都username@localhost作為值返回):

# Requires system user id in $acl_arg1
acl_check_sender:

 # Users with default domain
 accept
   condition = ${if eq{$sender_address}{$acl_arg1@$qualify_domain}}
   condition = ${if eq{${address:$h_from:}}{$acl_arg1@$qualify_domain}}
   condition = ${if match_address{${address:$h_sender:}}{:$acl_arg1@$qualify_domain}}

 deny
   ! condition = ${if and{\
       {exists{/etc/exim4/virtual/${domain:${address:$h_from:}}}}\
       {eq {${acl_arg1}@localhost}\
         {${lookup {${local_part:${address:$h_from:}}}\
           lsearch{/etc/exim4/virtual/${domain:${address:$h_from:}}}\
         }}\
       }\
     }}
   message = Spoofed From: header.

 # Most messages don't have a Sender: header, but if it is not empty, check it.
 deny
   ! condition = ${if or{\
       {eq {$h_sender:}{}}\
       {and{\
         {exists{/etc/exim4/virtual/${domain:${address:$h_sender:}}}}\
         {eq {${acl_arg1}@localhost}\
             {${lookup {${local_part:${address:$h_sender:}}}\
               lsearch{/etc/exim4/virtual/${domain:${address:$h_sender:}}}\
             }}\ 
         }\
       }}\
     }}
   message = Spoofed Sender: header.

 deny
   ! condition = ${if and{\
       {exists{/etc/exim4/virtual/$sender_address_domain}}\
       {eq {${acl_arg1}@localhost}\
         {${lookup {$sender_address_local_part}\
           lsearch{/etc/exim4/virtual/$sender_address_domain}\
         }}\
       }\
     }}
   message = Spoofed envelope sender.

 accept

有關字元串擴展的語法(充滿大括號),請查看Exim 文件的第 11 章。您可以使用它們來測試它們(信封發件人像mbox格式exim4 -bem <message> <expansion_string>一樣在消息中傳遞)。

您可以將其應用於不同的情況:

  • 對於通過 送出的消息,將以下規則exim4 -bm添加到ACL:acl_not_smtp
deny
 ! acl = acl_check_sender ${sender_ident}
  • 對於經過身份驗證的使用者通過SMTP添加到acl_smtp_dataACL 送出的消息,例如:
deny
 authenticated = *
 ! acl = acl_check_sender ${authenticated_id}
  • 一些程序使用未經身份驗證的SMTP連接來送出消息localhost(或exim -bs)。對於他們,您可以添加到acl_smtp_dataACL:
deny
 hosts = : localhost
 ! acl = acl_check_sender ${sender_ident}

並在伺服器上安裝一些identd

引用自:https://serverfault.com/questions/1010837