Linux

postfix - 飛節 - 從已處理的電子郵件中提取資訊

  • December 25, 2014

設置

Linux,Debian Wheezy,用作大約 1000 個使用者的郵件伺服器。Courier 和 Postfix 安裝在這個盒子裡。

關於伺服器的資訊

這是一個後綴設置,可以將電子郵件放到下面的郵箱中/home/vmail/$domain/$user- 這部分正在工作。

我打算做什麼:

我想實現,當通過伺服器發送電子郵件時,/home/vmail/mail_logger.sh會觸發腳本 (),以便我可以記錄並採取行動。為什麼?如果某個帳戶被黑客入侵並且有人開始通過系統發送垃圾郵件,我想對帳戶實施減速/禁用操作。

現在我正在輪換日誌文件並提取哪個使用者在一段時間內發送了多少封電子郵件,如果他們每小時發送超過 x 封電子郵件(可配置),則鎖定該帳戶。這種日誌輪換實現並不好,所以我認為每次通過 smtps 發送電子郵件時觸發一個飛節可能會很好(現在只允許使用者使用 smtps - 沒有 smtp)。

我找到了這本手冊,它給了我一些想法,如何為不同的傳遞方式(smtp、smtpd、pickup)實現“hocks”

在 main.cf 我添加了以下幾行

hooksmtp   unix  -       n       n       -       -       pipe  flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} smtp
hooksmtps  unix  -       n       n       -       -       pipe  flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} smtps
hookpickup unix  -       n       n       -       -       pipe  flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} pickup`

並在 main.cf 中更改了以下幾行

smtp       inet  n       -       -       -       -       smtpd -o content_filter=hooksmtp:dummy
smtps     inet  n       -       -       -       -       smtpd -o content_filter=hooksmtps:dummy  -o syslog_name=postfix/smtps  -o smtpd_tls_wrappermode=yes   -o smtpd_sasl_auth_enable=yes  -o smt
pickup    fifo  n       -       -       60      1       pickup -o content_filter=hookpickup:dummy

就具體行動打電話。

現在觸發的腳本看起來像這樣,我稍後會改進它……

cat /home/vmail/mail_logger.sh
#!/bin/bash
echo $(date +%Y.%m.%d_%H:%M:%S) $@ >> /home/vmail/mail_logger.log

我現在有一個問題,現在所有的電子郵件都由“鉤子”處理(這很好),但沒有傳遞到原始目的地(這很糟糕)。

我查看了 postfix 手冊,發現我可以實現對於所有電子郵件,將密件抄送發送到本地電子郵件而不是得到處理,但我認為應該有另一種處理方法。

所以問題是如何更改這些行,以使“hocks”得到通知,並且郵件仍然像以前一樣得到處理,而不需要進行密件抄送,而不是處理密件抄送。

也歡迎處理上述問題的其他想法。但請注意,我不想在那個盒子上執行垃圾郵件掃描器,因為垃圾郵件掃描由伺服器前面的 4 個 MX 節點處理(執行 debian 和 sa-exim)。

更新1:我在評論後的第一個發現是

我已關注評論並進行了這些更改

在 main.cf 我添加了以下幾行

local_transport = hookpickup
always_bcc = extract@localhost

在 master.cf 中,我確保掛鉤已到位

hookpickup unix  -       n       n       -       -       pipe  flags=F user=vmail
   argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} pickup

我做了一些測試並發現,

  • 如果我通過 SMTP 發送郵件,則會向 extract@localhost 發送密件抄送,然後“掛鉤”將其拾取,腳本會處理內容。- 好的
  • 如果我在本地向 root 發送一封電子郵件,“鉤子”會拾取它並且腳本處理了內容,但電子郵件沒有到達它的目的地 - 不好。

我現在需要設置 local_transport = hookpickup 如果電子郵件來自郵箱 extract@localhost 只會被“觸發”

更新 2:我在回答之後的下一個發現是

我已按照第一個答案進行了這些更改

transport_maps = hash:/etc/postfix/map_mytransport
always_bcc = extract@localhost
# removed: local_transport = hookpickup

文件 /etc/postfix/map_mytransport 有內容

extract@localhost hookpickup:

每次您更改 /etc/postfix/map_mytransport 的內容時,您都必須執行postmap /etc/postfix/map_mytransport這將生成 postfix 實際使用的文件 /etc/postfix/map_mytransport.db。

請確保您之前transport_maps沒有定義,否則您將使用此設置覆蓋它,您可能會導致意外行為。我按照本手冊 設置伺服器的 70% 並沒有設置,但我知道其他人有。

在 master.cf 中,我更改了 hookpickup 並添加了更多用於調試的值

hookpickup unix  -       n       n       -       -       pipe  flags=F user=vmail
   argv=/home/vmail/mail_logger.sh client_address=${client_address} client_hostname=${client_hostname} client_port=${client_port} client_protocol=${client_protocol} domain=${domain} extension=${extension}mailbox=${mailbox} nexthop=${nexthop} original_recipient=${original_recipient} recipient=${recipient} sasl_method=${sasl_method}  sasl_sender=${sasl_sender} sasl_username=${sasl_username} sender=${sender} size=${size}

參數的完整描述可以在這裡找到。

為了使解決方案正常工作,我將使用者提取添加到系統並重新啟動了 postfix。

該腳本/home/vmail/mail_logger.sh現在“實時”獲取我需要鎖定帳戶的資訊,如果它發送到許多電子郵件(根據數據庫中配置的門檻值定義)。

而不是覆蓋local_transport與您的掛鉤,您可以設置transport_maps

#main.cf
transport_maps = hash:/etc/postfix/mytransport

#/etc/postfix/mytransport
extract@localhost hookpickup:

在這種模式下,只需發送到 extract@localhost 的電子郵件就會被傳遞到 hookpickup

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