1、前言
根據統計 2004 年在網路上 Mail 流量約有 85% 以上為廣告信、病毒信,架設郵件伺服器雖然很簡單除了注意不要被當作 Mail Relay 跳板之外,但若要阻檔不請自來的廣告信、病毒信卻很困難,這也是近年來網管人員頭痛的問題許多廠商也看中這個商機紛紛推出許多阻擋廣告信及病毒信的 Box,但其實在 FreeBSD 及其他相關 Open Source 上要阻擋病毒和廣告郵件可以很容易且不需花費任何費用。本次實作為利用 Amavisd-new 當作郵件閘道 (Mail Gateway) 將郵件內容 (含附加檔案) 進行分析掃瞄,判斷是否屬於已知病毒感染或是廣告郵件並針對信件屬性進行不同處理 (包含郵件主旨標示或刪除),以下則是相關套件任務說明:
- Amavisd-New: Mail Gateway 並搭配 UVScan 進行郵件掃毒。
- SpamAssasin: 過濾 (Filter) 郵件判斷其內容特徵是否為廣告信 SPAM (為所過濾郵件打分數,分數愈高代表極可能為廣告信)。
- Procmail: 自訂郵件收送規則,當然也可刪除或導向打過分數並判定為 SPAM 的郵件。
文章目錄
1、前言2、實作環境
3、Amavisd-New部份 (過濾病毒信)
步驟1.安裝 McAfee AntiVirus 套件
步驟2.安裝 Amavisd-New 套件
步驟3.修改 Amavisd-New 設定檔 (amavisd.conf)
步驟4.修改 Postfix 設定檔 (master.cf、main.cf)
步驟5.更新病毒碼
步驟6.重新啟動 Postfix 服務
步驟7.測試阻擋病毒信機制
4、P5-Mail-SpamAssassin部份 (過濾廣告信)
步驟1.修改 Amavisd-New 設定檔 (amavisd.conf)
步驟2.新增廣告信過濾規則 (user_prefs、spam rule)
步驟3.重新啟動相關服務
步驟4.測試阻擋廣告信機制
5、Procmail 部份 (自訂郵件收送規則)
步驟1.安裝 Procmail 套件
步驟2.修改 Postfix 設定檔 (main.cf)
步驟3.編寫過濾規則 (procmailrc)
步驟4.測試過濾規則
步驟5.如何過濾中文廣告信
6、參考
2、實作環境
- FreeBSD 5.2-RELEASE
- uvscan-4.32e
- uvscan_dat-4329
- amavisd-new-20030616.p7
- p5-Mail-SpamAssassin-2.63 (相依於 amavisd-new)
- procmail-3.22_4
3、Amavisd-New部份 (過濾病毒信)
步驟1.安裝 McAfee AntiVirus 套件
切換至 Ports Tree 路徑安裝 McAfee AntiVirus 套件,目前在 FreeBSD Ports Collection 裡面的 UVScan 為 30 天試用版,軟體使用授權部分請參考 /usr/local/share/doc/uvscan/license.txt。# cd /usr/ports/security/vscan //切換至安裝路徑
# make install clean //安裝套件並清除暫存檔案
步驟2.安裝 Amavisd-New 套件
切換至 Ports Tree 路徑安裝 Amavisd-New 套件。# cd /usr/ports/security/amavisd-new/ //切換至安裝路徑
# make install clean //安裝套件並清除暫存檔案
步驟3.修改 Amavisd-New 設定檔 (amavisd.conf)
修改 Amavisd-New 設定檔 amavisd.conf,並設定檔案擁有人 (owner) 為 vscan 以便屆時 Amvisd-New 服務可順利讀取設定檔。# cd /usr/local/etc //切換至設定檔路徑
# cp amavisd.conf-dist amavisd.conf //複製預設檔案並修改
# chown vscan amavisd.conf //設定擁有人 (owner) 為 vscan
# chmod 750 amavisd.conf //設定檔案權限
# chown vscan /usr/local/sbin/amavisd //設定擁有人 (owner) 為 vscan
# chmod 750 /usr/local/sbin/amavisd //設定檔案權限
# vi /usr/local/etc/amavisd.conf //內容如下修改下列設定
$mydomain = 'weithenn.org'; //填入 Domain Name
$TEMPBASE = "/tmp";
$forward_method = 'smtp:127.0.0.1:10025';
$notify_method = $forward_method;
$virus_admin ="vscan\@$mydomain";
$mailfrom_notify_admin = "vscan\@$mydomain";
$mailfrom_notify_recip = "vscan\@$mydomain";
$mailfrom_notify_spamadmin = "vscan\@$mydomain";
#$QUARANTINEDIR = '/var/virusmails'; //註解此行 (若未註解則必須定期去資料夾刪除被判定為病毒的郵件)
步驟4.修改 Postfix 設定檔 (master.cf、main.cf)
關於詳細 Postfix 安裝及設定請參考站內文章 Postfix-配合 SASLv1 達成 SMTP Auth。修改 master.cf
# vi /usr/local/etc/postfix/master.cf //修改內容如下
smtp-amavis unix - - n - 2 lmtp
127.0.0.1:10025 inet n - n - - smtpd
-o smtp_data_done_timeout=1200 //-o 要留空格否則會造成 Postfix 啟動失敗
-o disable_dns_lookups=yes
-o content_filter=
修改 main.cf
# vi /usr/local/etc/postfix/main.cf //修改內容如下
content_filter = smtp-amavis:127.0.0.1:10024 //加入此行
步驟5.更新病毒碼
可執行如下指令先嘗試手動更新病毒碼,確定可更新病毒碼之後設定排程來定期更新病毒碼。# /usr/local/sbin/update_dat //手動更新病毒碼,更新成功後會出現類似如下訊息
Wed Mar 3 15:35:16 CST 2004 Successfully updated AntiVirus DAT files to 4332
# crontab -e //修改排程來定期更新病毒碼
0 0 * * * /usr/local/sbin/update_dat //每天凌晨 12 點進行更新
步驟6.重新啟動 Postfix 服務
鍵入如下指令來重新啟動 Postfix 服務,使剛才修改的設定檔內容生效。# /usr/local/etc/rc.d/postfix.sh restart //重新啟動 Postfix 服務
# /usr/local/etc/rc.d/amavisd.sh start //啟動 Amavisd-New 服務
啟動 Amavisd-New 服務成功後可由 maillog 發現載入 McAfee AntiVirus 的相關訊息。
# tail /var/log/maillog
amavis60966: Found primary av scanner NAI McAfee AntiVirus (uvscan) at /usr/local/bin/uvscan
步驟7.測試阻擋病毒信機制
成功載入 McAfee AntiVirus 之後,利用手動輸入病毒信範例郵件內容測試系統的偵測病毒信機制是否成功運作。# telnet localhost 10024 //測試連結 SMTP Amavisd 服務
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^'.
220 127.0.0.1 ESMTP amavisd-new service ready
mail from:weithenn@weithenn.com //寄件者郵件
250 2.1.0 Sender 111@domain.edu.tw OK
rcpt to:weithenn@weithenn.org //收件者郵件
250 2.1.5 Recipient 222@domain.edu.tw OK
data //郵件
354 End data with <CR><LF>.<CR><LF>
Subject: Test 2 //郵件主旨
X5O!P%@AP4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* //郵件內容
.
250 2.5.0 Ok, id=32575-04, BOUNCE //出現此行代表發現 Virus
quit //離開
221 2.0.0 127.0.0.1 (amavisd) closing transmission channel
Connection closed by foreign host.
我們也可透過 maillog 來瞭解當系統偵測到病毒郵件及正常郵件時 Log 的關鍵字。正常郵件訊息,可看到 amavis 過濾後關鍵字為 Passed。
# tail /var/log/maillog
Mar 3 23:46:25 mail amavis32575: (32575-05-26) Passed, <weithenn@msn.com> -> <weithenn@weithenn.org>, Message-ID:
<20040302190213.A0F8E4153@weithenn.org>, Hits: 0.691
病毒郵件訊息,可看到 amavis 過濾後關鍵字為 INFECTED。
# tail /var/log/maillog
Mar 3 23:37:14 mail amavis32575: (32575-04) INFECTED (EICAR test file), <weithenn@msn.com> -> <weithenn@weithenn.org>,
quarantine virus-20040303-233714-32575-04, Message-ID: , Hits: -
若在上面步驟3修改 Amavisd-New 設定檔 (amavisd.conf) 時未將 $QUARANTINEDIR 項目註解,則被系統判斷為病毒信的郵件會被移動到指定的資料夾 (請記得定期刪除以免空間塞爆)。
# cd /var/virusmails
# ls -l //可看到剛才判定為病毒信的代碼
-rw-r----- 1 vscan vscan 338 Mar 3 23:37 virus-20040303-233714-32575-04
4、P5-Mail-SpamAssassin部份 (過濾廣告信)
步驟1.修改 Amavisd-New 設定檔 (amavisd.conf)
修改 Amavisd-New 設定檔 amavisd.conf 內容如下:# vi /usr/local/etc/amavisd.conf //修改內容如下
$sa_spam_subject_tag = '***SPAM*** '; //為廣告信主旨加上標籤
$sa_spam_modifies_subj = 1;
$final_spam_destiny = D_REJECT; //預設值 (拒絕此信件)
$final_spam_destiny = D_PASS; //修改後 (收下廣告信避免誤判信件)
步驟2.新增廣告信過濾規則 (user_prefs、spam rule)
新增廣告信過濾規則 user_prefs 及 spam rule 內容如下,記得此檔案擁有人記得設定為 vscan,以便屆時 Amvisd-New 服務可順利讀取廣告信過濾規則,若日後有修改此規則內容 (ex. 加白名單) 必須重新啟動 Amvisd-New 服務才可使變更生效。# cd /var/amavis/.spamassassin //切換至廣告信規則路徑
# chown vscan user_prefs //設定擁有人為 vscan
# vi user_prefs
##############################################
###How many hits before a message is considered spam.###
##############################################
required_hits 5.0 //設定郵件特徵分數超過 5 分即判定為廣告信
auto_learn_threshold_spam 7.00
############################################
###Whether to change the subject of suspected spam###
############################################
rewrite_subject 0
#############################################
###Text to prepend to subject if rewrite_subject is used###
#############################################
subject_tag *****SPAM***** //為廣告信主旨加上標籤
################################
###Encapsulate spam in an attachment###
################################
report_safe 1
#################################
###Use terse version of the spam report###
#################################
use_terse_report 0
#########################
###Enable the Bayes system###
########################
use_bayes 1
##########################
###Enable Bayes auto-learning###
##########################
auto_learn 1
################################
###Enable or disable network checks###
################################
skip_rbl_checks 0
use_razor2 1
use_dcc 1
use_pyzor 1
#########################################################
###Mail using languages used in these country codes will not be marked###
###as being possibly spam in a foreign language. ###
#########################################################
ok_languages all
#######################################################
###Mail using locales used in these country codes will not be marked###
###as being possibly spam in a foreign language. ###
#######################################################
ok_locales all
##############
###nospam list###
##############
whitelist_from *@weithenn.com //此 Domain 送來的郵件不進行廣告信過濾 (白名單)
whitelist_from weithenn@msn.com //此帳號送來的郵件不進行廣告信過濾 (白名單)
rewrite_subject 1
score HEADER_8BITS 0
score HTML_COMMENT_8BITS 0
score SUBJ_FULL_OF_8BITS 0
score UPPERCASE_25_50 0
score UPPERCASE_50_75 0
score UPPERCASE_75_100 0
步驟3.重新啟動相關服務
重新啟動 Amavisd-New、Postfix、Spamd 服務,使過濾廣告信機制生效。# /usr/local/etc/rc.d/amavisd.sh start //重新啟動 Amavisd-New 服務
# /usr/local/etc/rc.d/postfix.sh restart //重新啟動 Postfix 服務
# /usr/local/etc/rc.d/spamd.sh start //啟動 Spamd 服務
spamd61054: server started on port 783/tcp (running version 2.63)
步驟4.測試阻擋廣告信機制
鍵入如下指令將測試用廣告信寄給使用者 weithenn 測試系統的阻擋廣告信機制是否成功運作。# /usr/local/sbin/sendmail weithenn < /usr/local/share/doc/p5-Mail-SpamAssassin/sample-spam.txt
若在步驟 1 修改 Amavisd-New 設定檔 (amavisd.conf) 時 $final_spam_destiny 採用預設值 D_REJECT 如左下圖,若設定為 D_PASS 如下圖可看到郵件主旨被加上 ***SPAM*** 標籤。
我們也可透過 maillog 來瞭解當系統偵測到廣告郵件時 Log 的關鍵字。$final_spam_destiny 選項設定為 D_REJECT 過濾後關鍵字為 Not-Delivered,可看到此封郵件分數為 1001.781。
# tail /var/log/maillog
Mar 5 15:17:22 mail amavis57115: (57115-07) Not-Delivered, <weithenn@weithenn.com> -> <weithenn@weithenn.org>, quarantine
spam-fbfaa7ae2ce107ec1ee6598c72d0e04f-20040305-151722-57115-07, Message-ID: <GTUBE1.1010101@example.net>, Hits: 1001.781
$final_spam_destiny 選項設定為 D_PASS 過濾後關鍵字為 Passed,可看到此封郵件分數為 1001.781。
# tail /var/log/maillog
Mar 5 16:09:45 mail amavis60889: (60889-01) Passed, <weithenn@weithenn.com> -> <weithenn@weithenn.org>, quarantine
spam-fbfaa7ae2ce107ec1ee6598c72d0e04f-20040305-160945-60889-01,Message-ID: <GTUBE1.1010101@example.net>, Hits: 1001.781
5、Procmail 部份 (自訂郵件收送規則)
步驟1.安裝 Procmail 套件
切換至 Ports Tree 路徑安裝 Procmail 套件。# cd /usr/ports/mail/procmail //切換至安裝路徑
# make install clean //安裝套件並清除暫存檔案
步驟2.修改 Postfix 設定檔 (main.cf)
修改 Postfix 設定檔 main.cf 內容如下。# vi /usr/local/etc/postfix/main.cf //修改 Postfix 設定檔
mailbox_command = /usr/local/bin/procmail //加入此行 (套用至所有帳號)
步驟3.編寫過濾規則 (procmailrc)
編寫過濾規則設定檔 Promailrc 下列過濾規則為收集網路上資料而成的範例。- 所有使用者的過濾條件: /usr/loca/etc/procmailrc
- 個別使用者的過濾條件: .procmailrc (使用者家目錄下透過 .forware 來啟動 procmail)
使用者可透過在個人家目錄下 .forward 加入如下內容來達到自訂個人過濾條件的目的 (請依個人喜好擇一即可)。
# cat ~/.forward
"| /usr/local/bin/procmail" //方式一
"|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 $USER" //方式二
以下為自訂所有使用者的過濾條件,其中的 /dev/null 可以換成別的目錄 (ex./var/virusmails)。內容如下 (當然您可依個人需求新增/刪除)。
# vi /usr/loca/etc/procmailrc
VERBOSE=off
LOGFILE=/var/log/procmail.log
###########################################################################
###Procmail 寄進來的郵件依下列規則逐一過濾,未符合底下規則的信件都放行 ###
###Subjcet 主旨 ###
###Content-Type: ###
###########################################################################
############ KLEZ.G Virus ############
:0b
* ^Subject:.*(Let's be friends)
/dev/null
###
:0b
* ^Subject:.*A funny game
/dev/null
###
:0b
* ^Subject:.*Hello\,.*\,how are you.*
/dev/null
###
:0 B
* ^Content-Type:.*audio/x-wav.*
* ^.*name=.*\.(scr|SCR)
/dev/null
###
:0 B
* ^Content-Type:.*audio/x-midi.*
* ^.*name=.*\.(scr|SCR)
/dev/null
###
:0 B
* ^Content-Type:.*application/octet-stream.*
* ^.*name=.*\.(scr|SCR)
/dev/null
###
:0 Bb
* ^This game is my first work.*
* ^You\'re the first player.*
* I.*you would .* it.*
/dev/null
###
:0 Bb
* .*This is a.*patch.*
* ^I .* you would.*it.*
/dev/null
###
:0 Bb
* .*iframe src=3Dcid.*height=3D0 width=3D0.*
/dev/null
###
:0 B
* ^Content-Type:.*multipart/mixed.*
* name="ANTI_CIH.EXE"
/dev/null
###
:0b
* ^Subject:.*W32.Klez.*removal tools.*
/dev/null
############## Nimda Virus ###############
:0 Bh
* ^Content-Type:.*audio/x-wav.*
* name="readme.exe"
/dev/null
###
:0 Bh
* ^Content-Type:.*audio/x-wav.*
* name="sample.exe"
/dev/null
###
:0 B
* ^Content-Type:.*multipart/mixed.*
* name="readme.exe"
/dev/null
###
:0 B
* ^Content-Type:.*multipart/mixed.*
* name="sample.exe"
/dev/null
###
:0 B
* ^Content-Type:.*application.*
* name="readme.exe"
/dev/null
###
:0 B
* ^Content-Type:.*application.*
* name="sample.exe"
/dev/null
############# SirCam Virus ############
:0 Bh
* I send you this file in order to have your advice
/dev/null
############# PE.BRID.A ############
:0 H
* ^X-Mailer: EBT Reporter.*$
/dev/null
###
:0 B
* ^.*NnAaMmEe=README\.EXE.*$
/dev/null
#############廣告信 (下列三種挑一個吧) ##############
:0:
* ^X-Spam-Flag:.*YES
/dev/null
:0:
* ^X-Spam-Level:.\*\*\*\*\*
/dev/null
:0:
* ^X-Spam-Status:.*Yes
/dev/null
建立 Procmail Log 以便後續觀察 Procmail 運作狀況,若要允許使用者的 Procmail 過濾規則也可寫入該 Log 的話則權限請設定為 666。
# touch /var/log/procmail.log //建立 Procmail Log
# chmod 666 /var/log/procmail.log //允許使用者的 Procmail 過濾規則也可寫入
步驟4.測試過濾規則
在測試過程中可以針對 A funny game 主旨來進行測試並且把 /dev/null 改成/var/virusmails。寄此主旨的信件給使用者然後使用 mailstat 來觀察。# mailstat -km /var/log/procmail.log
步驟5.如何過濾中文廣告信
由於中文編碼 (中文廣告信) 進入系統後會顯示為亂碼,因此若是您直接在過濾規則內打中文是無法過濾中文廣告信的,所以請安裝 mmencode 套件,將中文字轉換為 MIME Code。# cd /usr/ports/converters/mmencode //切換到安裝路徑
# make install clean //安裝並清除暫存檔案
MIME 定義兩種編碼方法:Base64 與 QP(Quote-Printable) 而含有 MIME 編碼的郵件若您查看它的源始碼會含有 "This is a multi-part message in MIME format." 這樣的句子。
Base64: 預設值,將整個檔案資料重新編碼為 7bits,以下將中文字 打炮 轉換成 MIME 編碼中的 Base64 以及將 Base64 轉換回中文。
# echo "打炮" | mmencode //中文轉換為 Base64
pbSstgo=
# echo "pbSstgo=" |mmencode -u //Base64 轉換為中文
打炮
QP (Quote-Printable): 將 8bits 中文資料轉換為 7bits,以下將中文字 打炮 轉換成 MIME 編碼中的 QP 以及將 QP 轉換回中文。
# echo "打炮" | mmencode -q //中文轉換為 QP
=A5=B4=AC=B6
# echo "=A5=B4=AC=B6" | mmencode -q -u //QP 轉換為中文
打炮
在 Procemail 過濾規則 (procmailrc) 中可以接受 Base64 及 QP 的 MIME 編碼,以下過濾規則中為郵件主旨中只要有打炮這二個中文字眼就把該 Mail 移到 /dev/null 去。
:0b
* ^Subject:.*(pbSstgo=)* //Base64 Code
/dev/null
:0b
* ^Subject:.*(=A5=B4=AC=B6)* //QP Code
/dev/null