Linux

Exim:為本地域的使用者強制電子郵件身份驗證

  • October 31, 2019

我正在使用 dovecot 和 postgresql 為虛擬使用者配置 exim4,我遇到了一個我無法解決的問題,情況是這樣的:

我需要當“本地域”使用者嘗試向另一個“本地域”使用者或外國使用者發送電子郵件時,需要進行身份驗證,否則拒絕該操作。

實際上,我試圖避免任何類型的 smtp 開放中繼。

實際上 smtp 工作正常,只需要設置該要求,我找不到正確配置 exim 以獲得此行為的正確方法(是 acl 還是路由或傳輸規則?)

我怎麼能定義這個配置?

範例 1

220 我的伺服器 ESMTP Exim 4.84 2016 年 3 月 31 日星期四 22:26:28 +0000
ehlo 本地主機
250-我的伺服器你好本地主機 [192.168.1.X]
250 尺寸 52428800
250-8BITMIME
250-流水線
250-AUTH 普通登錄
250 幫助
郵件來自:a@my-server.com
250 好
rcpt 至:b@my-server.com
250 接受
數據
354 輸入資訊,以“.”結尾 單獨在一條線上
這一定不能發生,使用者 'a@my-server.com' 未經過身份驗證,
在使用之前,他必須不能發送任何消息
'auth login' 或 'auth plain' 因為是本地域的使用者。
.
250 確定 id=1all3Q-0004l2-V4

範例 2

220 我的伺服器 ESMTP Exim 4.84 2016 年 3 月 31 日星期四 22:58:56 +0000
ehlo 本地主機
250-我的伺服器你好本地主機 [192.168.1.X]
250 尺寸 52428800
250-8BITMIME
250-流水線
250-AUTH 普通登錄
250 幫助
郵件來自:a@anotherserver.com
250 好
rcpt 至:user@my-server.com
250 接受
數據
354 輸入資訊,以“.”結尾 單獨在一條線上
這已經有效。
.
250 OK id=1allZR-00050E-Sq

ACL RCPT-TO 配置文件

acl_check_rcpt:
接受
主機=:
控制 = dkim_disable_verify

.ifdef CHECK_RCPT_LOCAL_LOCALPARTS
否定
域 = +local_domains
local_parts = CHECK_RCPT_LOCAL_LOCALPARTS
消息 = 地址中的受限字元
。萬一

否定
域 = !+local_domains
local_parts = CHECK_RCPT_REMOTE_LOCALPARTS
消息 = 地址中的受限字元
。萬一

接受
.ifndef CHECK_RCPT_POSTMASTER
local_parts = 郵政局長
。別的
local_parts = CHECK_RCPT_POSTMASTER
。萬一
域 = +local_domains : +relay_to_domains

.ifdef CHECK_RCPT_VERIFY_SENDER
否定
消息 = 失敗!
!acl = acl_local_deny_exceptions
!verify = 發件人
。萬一

否定
!acl = acl_local_deny_exceptions
發件人 = ${如果存在{CONFDIR/local_sender_callout}\
{CONFDIR/local_sender_callout}\
{}}
!verify = 發件人/標註

接受
主機 = +relay_from_hosts
控制=送出/sender_retain
控制 = dkim_disable_verify

接受
認證 = *
控制=送出/sender_retain
控制 = dkim_disable_verify

要求
消息 = 中繼被拒絕!
域 = +local_domains : +relay_to_domains

要求
驗證 = 收件人

否定
!acl = acl_local_deny_exceptions
收件人 = ${如果存在{CONFDIR/local_rcpt_callout}\
{CONFDIR/local_rcpt_callout}\
{}}
!verify = 收件人/標註

否定
message = 發件人信封地址 $sender_address 在這裡被列入本地黑名單。如果您認為這是錯誤的,請與 postmaster 聯繫
!acl = acl_local_deny_exceptions
發件人 = ${如果存在{CONFDIR/local_sender_blacklist}\
{CONFDIR/local_sender_blacklist}\
{}}

否定
message = 發件人 IP 地址 $sender_host_address 在這裡被列入本地黑名單。如果您認為這是錯誤的,請與 postmaster 聯繫
!acl = acl_local_deny_exceptions
主機 = ${如果存在{CONFDIR/local_host_blacklist}\
{CONFDIR/local_host_blacklist}\
{}}

接受
域 = +relay_to_domains
結束通道
驗證 = 收件人

接受

最後我自己解決了這個問題,我只需要將下一條語句添加到我的 acl 配置文件中:

接受
消息 = 必須授權
域 = +local_domains : +relay_to_domains
發件人=:正則表達式

這也可以通過條件語句和 perl 腳本來解決。

謝謝您的幫助。

只需確保 local_domains 不包含您想要要求身份驗證的任何主機。這將防止這些伺服器出現開放中繼情況。

但是,伺服器通過 MX 將電子郵件發送到 Internet 是很常見的。通常,在這種情況下您不希望要求身份驗證。

確保 relay_to_domains 為空,或僅包含您希望允許中繼到的域。(您是此列表中任何域的開放中繼。)

確保在接受 AUTH 請求之前需要 STARTTLS。否則,您的密碼將很容易被嗅探。

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