- 论坛徽章:
- 1
|
SpamAssassin的中文垃圾邮件过滤规则集
amavisd-new配合SA可以做到QP/base64 decode..因此原则上没有问题的。。至于说垃圾邮件的digest,不知道abel兄台是怎么设计的?
是每封信到达时检测看新信笺够了n封后再发digest还是。。?愿闻其详。
hzqbbc 兄,您的 pm 我就不回了,我想大家在這個串裏討論即可,也方便後
進可以看看大家的推演,只有我們兩個用 email 討論的話,大概其他人也
不會受益 ...
我們不是做 Mail Server 或 Anti-Spam 的,研究這些東西主要只是為了給
我們這種三十人的小單位使用,以練練自己技術, amavisd-new 是好東西,但
是和某些 MTA 搭配時,尤其是 sendmail 會有 "Lost input" 問題,至於 SA
,有人說吃 Resource 很凶...並不是說這些東西好或不好,但站在個人角度
或公司立場,我們是希望自己有一套方法來 anti-spam/anti-virus,而
anti-spam 是 User 自己決定做不做, anti-virus 站在公司角度來說是一定
要執行的,所以切合自己的需要是最重要的.
anti-virus 很簡單,用 procmailrc 常用的語法及公司政策就可以全部打死
政策就是:拒收所有的可執行檔,像 .com .pif .js ...都擋掉,並教育 user
觀念,因為我們人少,流動率低,所以三年來從沒有人中過什麼 email virus,
個人認為從政策面入手,再由技術面配合, anti-virus 實在不用什麼技巧
anti-spam 就不同了,我個人一天有400~500 封的信件,其中九成是 Spam,XD~
不擋怎受得了, SA 的作法符合大家的需求,所以很多人都用,但是 SA 並不能
滿足我們,尤其是 Forward 的信件或網頁或 mailing-list 常會誤判,甚至我
們請商業公司給我們適用一些產品,像 eShield 等,結果也是亂七八糟,判對
了就算了,判錯了你還給我加一堆 header 或是改 Subject: SPAM-xxxx, 造
成回信的困擾
anti-spam 最多人用的技術不外乎是 RBL,網路上隨便抄都有各種 MTA 設定的
Sample,不過講實在話,我相信 99.99% 人永遠不知道 Connection 就被 RBL
設定 Reject 的信有多少,到底是真 Spam 還是重要信件你也很難檢驗.個人的態
度則不然,既然我自己要寫符合公司使用的 anti-spam ,我就得做實驗,我用
我的 EMAIL account 做了一項測試,每封收進來的信由 procmail 來判讀,並計
數統計,做成像
http://www.sdsc.edu/~jeff/spam/Blacklists_Compared.html
的比較表,找出最符合我們特性的 RBL ,當然,不只計數如此而以,你還得看該
RBL 準確度,該 RBL 的運作機制等(例如檢舉/移除/可靠度..),最後找出三個
來使用(使用過多的 RBL 一點意義都沒有),有些 RBL 只是敵視某些國家或 ISP
等,其實這都不值得使用的.
我使用 procmail 來做上述的一些檢測,當然技術層面一定要夠了才做得了,
當然,我也可以使用 procmail 來做寄出/寄入的條件性備份(我是 sendmail 派的),
只是,講實在話,我看這裏的人大多都只重表面,不重實際,只要文檔,不要原理,只要
結果,不思過程,當然也有些非常重實際的人,像您一般.
我三年前,我學 procmail 相關的運用,可是花了整整一個星期,我看遍 manpage
相關的說明 (procmail/formail/procmailrc/procmailex/procmailsx..),
各大小相關的 procmail 網站都逛過,基本上這些都是做過不斷的實驗與實作,
所累積下來的經驗,即使我貼出來我的做法,我想以這個版的風氣,大概就是
"怎麼不行/mysql 連不到/我要怎麼自己加 Patten/CGI 不 Work/
Http 500 Internal Error" , XD~ ,這個版上也從沒有一篇有關 procmail
像樣的說明...,我看到的精華區幾篇關於 procmail 感覺都只是抄過來的而以
當然, procmail 如同 SA 一般給人的感覺都是吃資源,這是多數人的感覺,
一則以我們單位不大,二則以掌握度高,三則以 LDA 為 filter 對像,其實
在我們來看,並不會佔用太多 Mail Server Resource
我的個人觀點, anti-spam ,你就要懂 Mail Server, SPAM 原理,Mail Format/
Encoding 等相關東西,不然就用人家寫好的就好,實在沒必要自己做這種苦力
---------------------------------------------------------------------
以上只是個人一些在這版看到的一些感想,言歸正傳
amavisd-new配合SA可以做到QP/base64 decode..因此原则上没有问题的。。至于说垃圾邮件的digest,不知道abel兄台是怎么设计的?
是每封信到达时检测看新信笺够了n封后再发digest还是。。?愿闻其详。
hzqbbc 兄問得應該是我怎麼做的原理吧~我就只用 procmail 來做而以,procmail
這個東西在許多 MTA 上都是預設的 LDA,所以 postfix 應也是一樣做法,只是我專
走 sendmail 的研究,而版上諸友看來都是 Qmail.
procmail 收到信後往 local deliver 送時,自然會讀 $HOME/.procmailrc 是否存在,
所以,我只要把 .procmailrc 丟到該 USER 的 $HOME 下,過濾機制自然對他生效,
每封信進來就會判斷,儘量不要把 procmailrc 設在 /etc 下,因為那會對整個 MTA
生效,我做過實驗,你每個 USER 放一個 .procmailrc ,和放 /etc/procmailrc ,其
實對系統的 Loading 差很多,尤其是在一封信寄給很多人的情形,如果一封信寄到
一個 aliases, 裏面有 10 個 account , 在 /etc 下, procmail 會跑 100 次,
而 $HOME 下只會有十次, 最好的方式像 amavisd-new/Mail-Scanner 則只會做一次
當然,這是他們在進信的過程中所處的位置不同所造成的差異...(您應看得懂,其他
大概九成的人不懂).
所以,信件判斷,照多數人只看中文教學的人來說,大概只會做:
- #procmailrc sample1,符合 domain.net 來信的要過濾掉
- :0 H
- * ^From: .*domain.net.*
- /path/to/save
- # 進來的信件要複製轉寄一份給 other_server_email@domain
- :0c
- ! other_server_email@domain
- # 高明一點知道如何避免 Loop
- :0c
- * ! ^Have-Filter: 1
- | formail -A "Have-Filter: 1" | sendmail -oi -t email
复制代码
好了,現在我們看到,信轉走了,或丟到別的位置去了,這都是大家從別人的 sample 學來的
但是有沒有發現 可以 pipe (|) 給一隻程式處理,這裏我們只要做一些手腳,就可以那來
做很多事了(其實像上面例子的 From: 就可以是程式)
我們可以來美化一下:
- # MYSQL 變數就是你拿來存 spam info 的連接參數
- MYSQL="mysql -u username -ppassword -h hostname dbname"
- # 取出誰寄給你信
- FROM=`formail -zxFrom:| sed -e 's/.*<\(.*\)>;.*/\1/g'`
- # 取一個檔名來歸信件檔
- FILE=`echo $HOME`/procmail/mail_folder/mail-`echo $$`-`date +%Y%m%d%H%I%S`.eml
- # 將每個人的信件單獨存成一個檔案
- tmp=`formail >; $FILE`
- # 取出主旨列內容,主旨列可能是 8bit,或是有 charset, 或是有 QP 編碼及 MIME BASE64 編碼等情形
- tmp=`formail -zxSubject:`
- # 一個自己寫的簡單解碼程式,將編碼還原成 Big5
- SUBJ=`/etc/parser_subj "$tmp"|sed -e 's/ //g'`
- # flag HD 或下面的 fw 自己 manpage 吧
- # 儘量少用 小寫 h,因為會濾掉 header,不過大概沒有人看得懂這句話
- :0 HD
- * (^From:|^Received:|Return-Path:) .*(mailserver.idv.tw|mailserver.com|worldad.net|mailnews.com.tw).*
- {
- :0 fw
- | echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN ) values('$FROM','$TO','$SUBJ','$FILE',1,'$LOGNAME','發信軟體','mailserver 信商發出')" | $MYSQL
- :0
- /dev/null
- }
复制代码
好了,如此我們即可判斷出 (From 或 Reveived 或 Return-Path) 有 (mailserver.idv.tw 或 mailserver.....)
的信,要導給一個程式做處理,這個程式只是將必要資訊存入 mysql 中
最後,信件存入 /dev/null (就是殺掉了)
再來看一個我的範例:
- :0 hD
- * ! ^From: .*mydomain.net.tw.*
- {
- :0 fh
- # 取出的 $SUBJ 和資料庫中的該 USER 定義的中文字做比對
- | ( patten=`echo "select concat(PATTEN,\" \") from SPAM_PATTEN where USERNAME='$LOGNAME' and instr('$SUBJ',PATTEN)"|$MYSQL | grep -v 'PATTEN'`; \
- # 比對結果長度不為0,表示 Match
- if [ ${#patten} -ne 0 ] ; \
- # 在信件加一個表頭欄位, Spam: 符合的字串項目
- then formail -A "Spam: $patten"; \
- # 把資訊寫入 mysql 中
- echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN ) values('$FROM','$TO','$SUBJ','$FILE',1,'$LOGNAME','符合特定字串','$patten')" | $MYSQL; \
- # 把該 PATTEN 計數加一,有可能一封信符合多個 PATTEN, 每個都要加一,所以要用 for loop 處理
- for p in $patten;do \
- echo "update SPAM_PATTEN set CNT=CNT+1 where USERNAME='$LOGNAME' and PATTEN='$p'| $MYSQL; \
- done; \
- fi );
- :0
- * ^Spam: .*
- /dev/null
- }
复制代码
上述的 # 註解不應該存在那裏,只是為了方便大家看而加,不然程式為出錯
好了,大柢原則就是這樣做而以,你要怎麼 coding 看你的能力而以, 為什麼要 ; \ 懂
shell 的人一定知道,這個過程中,我們將所有資訊都存入 $FILE 及 mysql 中,
再來就只要按時 run 一個 cronjob , 把 summary 送給 user 即可,不是嗎 !?
只是這個 cronjob 送出來的是 html 的信件, user 只要在這個 summary report
上,像你看到的 http://211.72.210.251/spamcop.html 看到的例子上點主旨列
就可以取回信件,就跟網頁的做法是一樣的.
註: 取回的信件不是又進了過濾條件,怎麼取得回來呢 !? 有時間再和大家分曉吧
有興趣的人先去消化一下,沒想到這點的人你就不要關心這個主題了. |
|