Postfix

Postfix 2.9 或 sendmail,防止外發垃圾郵件(檢查發件人是否存在)

  • September 16, 2015
  • 作業系統:Linux Ubuntu 12.04 TLS
  • 上下文:Plesk 11.5
  • 實用程序:Postfix 2.9.6(受 Plesk 11.5 發行版限制的更新)

我希望 Postfix 檢查每個傳出smtp 郵件的“發件人”欄位(在發送之前),以便發件人匹配伺服器中託管的任何域的任何有效創建的帳戶(郵件使用者)(作為條件批准發送)。

原因是每當一個域被垃圾郵件發件人腳本感染時,它通常使用類似**‘random-name'@infected-domain.tld的模式,因此通過應用sender-user-exist 過濾器**,它可以減少對伺服器聲譽的影響,從而防止像現在一樣快地被列入黑名單(每當託管域之一被惡意腳本感染時)。

所以在這裡,我不是要求特定的域限制,而是在通過 Postfix 發送之前(而不是在接收傳入郵件時)對“郵件發件人:”欄位的特定使用者進行限制。

編輯 1

最後我猜到這裡的問題是 /usr/sbin/sendmail 可以使用 Postfix 發送,無需身份驗證,不是嗎?或者,它是否在我不知道的情況下配置在其他地方?

請至少,您能幫我提供一些有用且易於理解的 sendmail 文件嗎?我找不到任何真正有用的東西來理解它是如何工作的,而且對於 Plesk 11.5 等多使用者環境來說更少。

這就是為什麼我想直接從 Postfix 過濾,因為它是依賴或發送電子郵件的中心點。

編輯 2

最後搜尋我已經放棄了 Postfix 2.4+ authorized_submit_users => http://www.postfix.org/postconf.5.html#authorized_submit_users的指令

它只檢查 /usr/sbin/sendmail 程序的 UID,它是受感染域的使用者。

添加:

authorized_submit_users = !unknown, static:all

不能解決問題。

編輯 3

#/etc/postfix/main.cf
header_checks = regexp:/etc/postfix/header_checks

和正則表達式過濾選項,使用負前瞻

#/etc/postfix/header_checks
/^From: ".*(?!user1|user2|user3).*@infected-domain.tld/ REJECT

任何的想法?我可以打開另一個執行緒嗎?

解決了!

我通過在下面自己回答這個具體案例提供了一個定制的解決方案。感謝大家的資訊、合作和支持!

最後,我找到了一種使用 header_checks 過濾外發垃圾郵件的解決方案,儘管我不知道它的有效性和效率如何。

警告

  • 這種緩解技術解決方案不能清除感染。
  • 它僅在攻擊使用真實域名和偽造的使用者名或電子郵件帳戶作為發件人發送垃圾郵件時有用(From:)。
  • 當感染使用其他域名作為發件人(From:)時,此正則表達式無法生效。

鑑於/usr/sbin/sendmail受感染腳本使用它來發送垃圾郵件,只要它使用隨機不存在的郵件帳戶(即 fake1@my-domain.tld)而不是真實帳戶作為發件人(即 user1@my-domain.tld),郵件標頭就可以使用 postfix 內置內容檢查進行檢查header_checks,如下所示:

#/etc/postfix/main.cf
# add it for example before TLS paramaters
# Anti-SPAM options
header_checks = pcre:/etc/postfix/header_checks

header_checks 文件中的正則表達式應排除域的任何真實使用者(即 user1、user2、…):

#/etc/postfix/header_checks
/^From:((?![^@]*?user1|[^@]*?user2|[^@]*?user3|[^@]*?webmaster)[^@]*?)@my-domain\.tld/ REJECT invalid sender

正則表達式的解釋(對於任何更改都可以使用這個正則表達式測試器):

  • [^@]任何字元,除了@
  • [^@]*?任何字元,除了@,零次或多次,惰性非貪婪 ( *?)。
  • (?!user1|user2|etc)替代方案的負前瞻:丟棄域的真實使用者。
  • (?![^@]*?user1|[^@]*?user2|etc)允許在每個使用者的電子郵件地址之前使用字元。

在進行任何更改之前,可以通過以下方式對其進行測試(第一個通過,第二個被拒絕):

$ postmap -q "From: user1@my-domain.tld" pcre:/etc/postfix/header_checks
$ postmap -q "From: fake@my-domain.tld" pcre:/etc/postfix/header_checks
REJECT invalid sender
$

甚至可以使用在感染期間擷取的帶有消息頭的文件進行測試(注意:破折號在這裡很重要):

$ postmap -q - pcre:/etc/postfix/check_headers < captured_headers.txt
From: "fake1@my-domain.tld      REJECT invalid sender
From: "fake2@my-domain.tld      REJECT invalid sender
$

經過測試,如果符合預期的結果,只需重啟 Postfix:

# service postfix restart
* Stopping Postfix Mail Transport Agent postfix                [ OK ]
* Starting Postfix Mail Transport Agent postfix                [ OK ]

要檢查它是如何進行的,一個可能的命令:

# tail -n 10000 /var/log/mail.log | grep reject
or
# tail -n 10000 /var/log/mail.log | grep 'invalid sender'

希望這對其他人有幫助。

編輯

正則表達式的一些更正:

#/etc/postfix/header_checks
/^From:(?![^@]*?user1@|[^@]*?user2@|[^@]*?user3@|[^@]*?webmaster@)([^@]*?@my-domain\.tld)/
REJECT invalid sender $1

postmap 檢查效果很好,但 postfix 沒有過濾域的偽造電子郵件使用者(上次感​​染它沒有過濾)。我不知道為什麼。

這個圖,郵件可以進入postfix、sendmail(通過pickup)、smtpd和qmqpd三個*獨立的入口。*最後一個入口在這裡很少使用。

當電子郵件通過smtpd發送時,則電子郵件來源可能來自外部(從 127.0.0.1 連接時例外)。外部電子郵件顯然被認為是不受信任的。因此,postfix 具有阻止它的標準功能,例如 RBL 檢查器、開放中繼檢查器、黑名單/白名單等。請參閱Postfix SMTP 中繼和訪問控制

預設情況下,伺服器的 IP 地址和 127.0.0.1 被認為是受信任的,因為任何可以從該主機連接的人都可能會在垃圾郵件之外造成進一步的破壞。例如:如果一個腳本已經上傳到網路伺服器,那麼他們可能會導致可能採取刪除網路根、植入後門等行為。

另一個受信任的郵件入口是通過sendmail/mail程序。基本上,當 php 呼叫郵件函式或從終端呼叫郵件時,您會指示 sendmail 將電子郵件放在後綴隊列中。除非某些人可以訪問您的郵箱(例如上傳的腳本),否則無法呼叫 Sendmail。


現在,我們準備回答您的主要問題:如何根據數據庫檢查發件人?

對於 smtpd 連接,您可以使用 postfix 功能Postfix SMTP 中繼和訪問控制check_sender_access 來檢查您的使用者數據庫。由於我從未使用過 Plesk,因此我無法向您提供詳細資訊。對於 sendmail/mail 命令,您需要後綴內容檢查(milter 或隊列內容過濾器之後),因為上述過濾器不受電子郵件來源的影響。

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