sendmail及mailscanner及clamav的安裝及設定
作者:cschen33.tw@yahoo.com.tw
最後更新時間:2005/1/06
本文還在整理中,所以有點亂

電子郵件的電腦病毒及垃圾郵件已經 是企業中的一大問題,
下圖是前年2003-5月至2004-4月份,我公司mail伺服器病毒的統計圖,由本圖你可以看去電腦病毒大量傳播

下圖則是同時期spam的統計圖,從前年的十月份垃圾郵件大量增加


我們以下討論,如何設定過濾這兩種郵件
使用軟體:
MailScanner
Clamav(目前最新版本0.80)
安裝clamav

參照內附文件,如果是redhat則其網站上含有srpm/rpm套件,其路徑和下述的說明可些差異
1.redhat
  下載最新版
   (如果是srpm)
   rpmbuild --rebuid clamav.xxxx.srpm
   編譯成功後切換到套件所在目錄
   rpm -ivh clamav.xxxx.rpm
2.redhat Fecora code 有rpm檔
   rpm -ivh clamav.xxxx.rpm
 
3.使用tar.gz檔案安裝
  1. groupadd  clamav
  2. useradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav
  3. 先至http://www.clamav.net/下 載
  4. tar xvfz clamav.xxxx.tar.gz
  5. cd clamav*
  6. ./configure --sysconfdir=/etc
  7. make
  8. make install
    如此就安裝完畢
  9. 測試
    cd test
    clamscan -r -l scan.txt test1.zip
  10. 更新病毒碼
    freshclam
上述已完成安裝防毒程式, 並更新完病毒碼

安裝 MailScanner
這是掃描程式可以和你的mail server溝通,能對郵件的內容,如主旨,寄件者,附件,本文做處理,
有兩個選擇MailScanner,AMaVis,但是MailScanner有webmin的模組,及mrtg的統計圖表,因此可以簡化管理
而安裝也比軟容易,但其實兩個程式都是以perl為程式主題語言,因此有一些模組需要安裝,可是MailScanner已經在套件中內含了
安裝:
先至www.mailscanner.info找download, 然後下載rpm套件
然後解壓縮
$tar xvfz MailScanner*.tar.gz
$cd MailScanner*
$./install.sh
如果有問題它會告訴你,但是一般碰到的問題是,要你執行
$./Update-MakeMaker.sh
然後再執行
$./install.sh
如果正常就安裝完畢了
因為MailScanner會自己啟動sendmail
所以你要先關閉sendmail服務,並啟動MailScanner服務
chkconfig --level 2345 sendmail off
chkconfig --level 2345 MailScanner  on
service  sendmail stop
service  MailScanner start
現在MailScanner應該已經跑起來

設定MailScanner 使用clamav

要修改其設定
/etc/MailScanner/MailScanner.conf
找尋二個參數設定如下
Virus Scanning = yes
Virus Scanners = clamav
如此掃毒的功能已經加進來了
如果你使用srpm/rpm套件更新
請修改 /etc/MailScanner/virus.scanners.conf 將clamav那一行最後的/usr/local改為/usr

然後重新啟動MailScanner
如此你的mail server現在已經具備防毒的功能

自動定時更新病毒碼
防毒程式最重要的工作之一就是更新病毒碼,否則防毒軟體功能無法防止最新的病毒。
根據一般的建議企業最好每四個小時至六個小時更新一次
#區網內更新病毒碼(自己架設供自己區域網內的病毒更新伺服器)
  1. clamav
    1. 以一般命令啟動
    2. freshclam -l /var/log/clamav/freshclam.log
    3. 以daemon的方式(以下設定每天更新6次)
      freshclam -d -c 6 -l /var/log/clamav.freshclam.log

  2. MailScanner
    當你安裝了本程式,它會在/etc/cron.hourly/下安裝一個update_virus_scanners, 這個定時排程的程式會呼叫update_virus_scanners程式,而這個程式會根據你設定檔內的virus scanner參數來更新病毒碼來呼叫/usr/lib/MailScanner/防毒程式名稱-autoupdate,因為放在cron.hourly 所以每小時會更新一次,但是我覺得太多了,因此我刪除了 /etc/cron.hourly/update_virus_scanners,改在/etc/cron.d/新增一個檔案 update_virus_Scanners,內容如下:
    43 0-23/4 * * * root /usr/sbin/update_virus_scanners
    如此每四小時會更新一次
#原始/usr/lib/MailScanner/clamav-autoupdate 的更新記錄檔在/tmp下,我將它改為正規的rpm套件的
/var/log/clamav/freshclam.log,你可以修改這個clamav-autoupdate中$Log= "/var/log/clamav/freshclam.log"


Clamav 基礎
程式名稱
說明
clamscan
這是一個掃描程式,如一般命令列下的掃描程式,它會開檔比對病毒碼資料 庫
clamd
這是一個daemon(常駐)程式,它是配合clamdscan,因為 是預載,可以加快 掃描,需要設 定環境檔/etc/clamd.conf
clamdscan
必須配合clamd使用
clamuko
是配合及時掃描程式(on access,存取時)的中介程式,另需配合dazuko
freshclam
病毒碼更新程式
sigtool 如果有一個病毒,被其它描毒程式掃到,但沒有被clamva掃描到,可 以用這個工具來新增
如果需要詳細的指令,可以使用man的命令
這塈畯戔N只用到clamscan及freshclam及sigtool,其它程式將不會用到
sigtool
sigtool -c "clamscan --stdout" -f testfile -s "ClamAv-Test"
我實在是不知其取樣的方法,因此如果有一個檔案染到了病毒,如何得知其那一個部份是有毒的程式碼,如何取出該段足以表示該病毒的特徵的病毒碼, 其網站上有一份五頁的文件來說明
*其自動產生病毒碼的原理了,它是使用別的防毒程式來取得病 毒碼,變成自己的
*手動還不是很清楚


MailScanner 的環境設定
/etc/MailScanner
MailScanner.conf
主要環境檔
filename.rules.conf
附件檔名設定(接受/拒絕)
filetype.rules.conf
檔案類型設定(接受/拒絕),和上述不同它是在mail中mime設定
virus.scanners.conf
指定防毒程式的script(並不是防毒程式,而是 MailScanner
本身的呼叫防毒程式的script),一般是不用更改
spam.assassin.prefs.conf
程式sapmassassin垃圾郵件的設定
spam.lists.conf

/rules/spam.whitelist.rules
設定非圾垃郵件的規則
/reports/
是一般報告的信件,如查到病毒及一些相關訊息所要產生通知信等郵件
問題HTML-IFrame,HTML-Form有些人送這些檔案,雖然不一定是病毒但是很困擾,放行吧?
你要想清楚否則如forenight這種病毒可能會進來
Allow IFrame Tages= yes
Allow Form Tags = yes
如此就可以了

郵件被偽造的問題
有一些電腦病毒會偽造送件者的e-mail,因此防毒程式中的通知傳送者功能必需關閉,否則收件人會不勝其擾(不是他送的病毒,卻警告他),
在mailscanner.conf的設定中有一個選項,可以指定多個使用空白的區隔
Silent Viruses = 你可以指定病毒的名稱
所有的病毒都不要送通知信,可設為下
Silent viruses= All-Viruses

原理(參照MailScanner 文章):
E-Mail服務及傳送郵件

一般的郵件伺服器同時提供兩個服務 SMTP及遞送服務(一個是接受別人傳進來,一個是傳送出去).它監聽進來的郵件使用SMTP port, 將這些郵件放在一個queue(目錄),然後遞送queue中的郵件到目的地.

一旦你使用MailScanner,會分開為不同的工作,是由不同的sendmail行程及不同的queue來處理. 第一個 sendmail行程監聽由SMTP port進來的信件,並將其放在一個incoming queue. MailScanner的責任是收集這些信件由incoming queue來的,檢查及過濾它們,然後將其放在外送的queue並觸發第二個sendmail行程來遞送它們.

由於sendmail設計的架構問題,這種分隔是相當的簡單,並不需要重新編譯或更改環境檔.所有要求只是改變啟動sendmail的 script,/etc/rc.d/init.d/sendmail,內的一些命令.

操作原理

在執行之後, MailScanner重複的執行一個迴圈工作如下:

  1. 收集由Incoming queue來的郵件
  2. 檢查郵件是否可以spam,並且如果需要標記它
  3. 選擇性的移除簡單的純文字的郵件到 outgoing queue並觸發使其被傳送
  4. 解壓縮出含有MIME結構的所有的郵件及附件
  5. 掃描病毒
  6. 掃描檔名合乎使用者設定的規則
  7. 掃描所有攻擊性的e-mail client 程式,如Outlook 或 Eudora
  8. 移除被感染或危檢的附件到一個隔離區(quarantine area),如果你有設定
  9. 取代感染或危險的附件使用你指定的文字內容來解釋,準備送給使用者
  10. 加入一個短的訊息在原始文件的前面
  11. 移動安全及不受感染的郵件到outgoing queue
  12. 重建修改的郵件到outgoing queue
  13. 刪除在incoming queue中的郵件
  14. 觸發傳送outgoing queue中的郵件
  15. 通知本地的postmaster, 和郵件傳送者,一個感染或是危險的郵件發現
  16. 如果可能,不受感染的原始附件送它們到原始收件人,並使用一個通知說明發生了什麼事

幾乎每一個步驟都可設定, 從批次郵件的檔案大小到掃描的每一個重複到本地postmaster的郵件位址,都是可以被設定的.

最小的郵件的變動,任何的郵件如果沒有發現病毒是直接移動在兩個queues之間;並不會嘗試重新建立任何的M MIME.郵件會被重建它的MIME項目,只有當它包含危險的檔名或是感染到病毒時,才會導致其使用文字檔來取代附件.

去排除和取消一個郵件的傳送含有感染病毒,失敗的解毒, 解毒程序掃描後,然後解毒,然後再掃一次. 只有附件會通過病毒掃描程式在最後的掃描是轉寄給原始的收件人.

Spam偵測

每一個進來的郵件會被檢查是否是由open mail relay主機所寄的,一個被知道的spam 來源,或是傳送由直接的知名dial-up 線路沒有透過合適的郵件主機.這均被使用在公開的及時資料庫上因此不需要在安裝的主機上維護. 如果 檢查的結果,一個郵件看起來可疑,它是被標示加入一個額外的檔頭列表資料庫. 這個郵件會被正常的傳遞(當然也要在病毒檢查之後).

SpamAssassin 系統也是支援外部程式的選項, 安裝該程式可以大大的改善辨識spam的能力.這是一個非常 clever heuristics-based engine(聰明具有嘗試性的引擎),它使用許多的測試在郵件的headers及body部份.

在這種情況下正常的mail伺服器是被標示為來源spam, 它們的位址可能被加入一個 "spam white list" 的位址或是網路將不會被標示為spam.

這個程序標記但仍舊遞送可疑的郵件讓使用者全權控制它們的郵件.許多的e-mail套件和傳送代理如Eudora, Microsoft Outlook, pine 或 procmail, 可以設定來檢查進來的郵件規則儲存甚至刪除郵件.有一些使用者 使用anti-spam可能自動的刪除任何標記的. 然而,大部份的使用者設定它的e-mail軟體自動儲存標記"Auto-Spam" 目錄.

Robustness(強健)

當本程式及配合的軟體執行產生錯誤訊息時,或電腦當機,本程式當掉,可以向你確認沒有郵件會遺失,它仍會放在queue中,只要你修改回來這些錯誤 時,它仍會這那些郵件送出.

為避免作業系統資源缺乏, MailScanner週期性的中斷和重新啟動自己. 在過去有一些Perl模組會產生記憶體不足的現象,這種方法是最簡單來避免這個問題,給予作業系統有機會來清除該應用程式所使用的記憶體.

目前尚未指出這個應用程式會導致缺乏資源, 但是它是一個小心的設計,來改良程式的穩定度,而且這樣做也無妨


我們現在使用mailscanner(掃描軟體)和clamav(防毒軟體)
查看/etc/rc.d/init.d/MailScanner的內容,得知進來的郵件是使用
sendmail收到郵件後將其存在非sendmail內定/var/spool/mqueue中而是改為/var/spool/in.mqueue中
其所啟動的參數是,僅將其駐列在queue中,然後使用MailScanne去掃描該目錄

sendmail(放在別的目錄,僅駐列不傳送)->scanner 呼叫antvirus program掃毒->sendmail(正常的目錄)

sendmail會啟動兩個行程
1.提供25的服務
2.定時傳送/var/spool/mqueue中的信件
首先提供一個SMTP 25  Port和建立MailScanner的收信的工作駐列

建立第二個Queue

你的sendmail可能是使用內定的queue位於/var/spool/mqueue. 如果這個目錄不存在檢查一下你的sendmail文件及sendmail.cf檔中QueueDirectory所在的位置.假設它是/var/spool/mqueue, 建立第二個queue目錄 mqueue.in 設定相同於mqueue的權限及擁有者.例如(你不需要下以下的指令,MailScanner都幫你做好了,以下是說明觀念),

 # cd /var/spool
# ls -ld mqueue
drwxr-x--- 2 root bin 62976 Oct 23 16:18 mqueue
# mkdir mqueue.in
# chown root mqueue.in
# chgrp bin mqueue.in
# chmod 750 mqueue.in
# ls -ld mqueue mqueue.in
drwxr-x--- 2 root bin 62976 Oct 23 16:18 mqueue
drwxr-x--- 2 root bin 41472 Oct 23 16:18 mqueue.in

這個queue mqueue.in將被使用為sendmail所提供的SMTP服務.

修改Sendmail的啟動命令檔

你的啟動命令在/etc/rc.d/init.d/sendmail.在其中做了一些動作如更新aliaes.db,你可以看到 命令類似下面:

 sendmail -bd -q15m
將其改成下面二行:
 sendmail -bd -OPrivacyOptions=noetrn -ODeliveryMode=queueonly -OQueueDirectory=/var/spool/mqueue.in
sendmail -q15m
第一行啟動SMTP服務,建立兩個工作queue給MailScanner. 第二行啟動另一個複本的sendmail來傳送由 MailScanner產生輸出.

你也需要改變停止原來的sendmail服務.


MailScanner的備份 郵件設定說明
#
# Mail Archiving and Monitoring
# -----------------------------
#

# Space-separated list of any combination of
# 1. email addresses to which mail should be forwarded,
# 2. directory names where you want mail to be stored,
# 3. file names (they must already exist!) to which mail will be appended
#    in "mbox" format suitable for most Unix mail systems.
#
# If you give this option a ruleset, you can control exactly whose mail
# is archived or forwarded. If you do this, beware of the legal implications
# as this could be deemed to be illegal interception unless the police have
# asked you to do this.
#Archive Mail = /var/spool/MailScanner/archive
Archive Mail =

上述的說明你可以備份郵件但是否合法?
範例:

Archive Mail = /etc/MailScanner/rules/backup_mail.rules

然後編輯
backup_mail.rules 檔案
From: user1@domain1.com /archive/domain1/user1
To: *@domain2.com /archive/domain2 user2@domain3.com user4@domain5.com
FromAndTo: *@domain6.com /archive/domain6/internalmail
FromOrTo: default

第一行是 寄件者如果是 user1@domain1.com 則備份到檔案/archive/domain1/user1
第二行是收件者是     *@domain2.com    則備份到檔案/archive/domain2 並轉寄給兩個人
第三行是收件者及寄件者都是 *@domain6.com 則備份到檔案(內部郵件)/archive/domain6/interrnalmail
第四行是任何收件及寄件者,預設什麼都不做(不備份)

考慮公司 郵件備份的事項
1.只要是公司的都備在同一個信箱,再由client端來分

  FromOrTo: *@domain.company     email-address
 2.直接分區分

寄件者:公司網域
收件者:非公司網域
外送郵件
奇件者:非公司網域
收件者:公司網域
內送郵件
奇件者:公司網域
收件者:公司網域
公司內部交換郵件

由上分 析,我們要將郵件備份為三份(三個email信箱),可用的指令如下
1.from: *@domain.company
2.to:   *@domain.company
3.FromAndTo: *@domain.company
4.FromOrTo:  *@domain.company

由於無法 組合應用及使用NOT,如何分呢?
#版本4.26.8(2004/2/2)支援分開的AND
from: xxx@bbbb.xxx.ddd   And To: kkk@rrr.sss.ttt


中文化息訊郵件
發現病毒,或垃圾郵件及其它危險內容,Mailscanner會根據你的設定傳送,郵件給收件者、寄件者、郵件管理者通知郵件,但MailScanner 並沒有中文化這些訊息,你可以自己將其中文化
cp -r /etc/MailScanner/reports/en /etc/MailScanner/reports/tw
依次編輯/etc/MailScanner/reports/tw內的檔案為中文
因寄件者的國別問題,因此你可能需要考慮中英文的切換
1.在指定報表需指示為一個rules檔(有十個報表需要十個rules有點複雜)
  例: stored.virus.message.rules
      From: *@*.com.tw  中文訊息的stored.virus.message.txt的路徑
      From: default     英文訊息的stored.virus.message.txt的路徑
2.另一種作法,取消寄件者通知信(很多病毒都是偽造的),所以所有的通知信將只侷限在你自己的公司
  %report-dir%=/etc/MailScanner/reports/en
  直接改為
  %report-dir%=/etc/MailScanner/reports/tw
3.可只針對儲存,及刪除部份的通知訊息作變更(建議使用)
  新增%reporttw%=/etc/mailScanner/reports/tw
  將儲存或刪除的報表只要將原命令由%report-dir%改為%reporttw%就可以了,注意自定變數%reporttw中間不要有特殊符號如-



報表
在MailScanner網站上有一個說明有關MRTG
http://www.sng.ecs.soton.ac.uk/mailscanner/mrtg.shtml
或是你可以使用mailwatch這個軟體(已經不維護)
#mailwatch已經復活了2006/02/22
我的文件mailwatch


問題:
  1. 附件檔案:
  2. 在命名附件的檔案時,小心不要命名超過一個以上的"." ,如abcd.txt.exe這是典型用來隱藏病毒副檔名的方法,如果windows設定為隱藏已知副檔名,會產生abcd.txt,因此我們要使用者在 命名附件檔案,不要用多個".",否則會被擋下來,送不出去,如果你要予許該類檔案,請修改 /etc/MailScanner/filename.rules.conf.最後一行有關"deny all other double file extensions"
  3. 自己發信的病毒:
  4. 上述的設定我們可以防止所有內送及外寄的郵件,然而有些電腦我們使用nat的方式來向外連線,如果中了會自己發信的病毒時,則防毒就無效,因為它會自己 對外連線發信,我們必須擋做其向 外直接連線的能力,如果你是使用iptables可以參考如下:
    iptables -t nat -A PREROUTING -p tcp -m tcp -s  內部IP/netmask  ! -d 可以接收的主機 --dport 25 -j DROP
    如果來源是內部IP 而連線不是-d 所設主機:25則丟棄連線,以內部ip而言,如果你的主機是多台可以先設接受的主機,在後面再設拒絕全部25
  5. 病毒通知信太多:
  6. 如果你一直收到某一IP所送來的病毒,每分鐘送數封,如何暫時停止收該IP的信 在/etc/mail/access檔中加入一行(例如傳送病毒的IP=111.222.333.444)
    111.222.333.444  REJECT
    目錄/etc/mail中執行makemap -v hash <access access (產生access.db)或是重新啟動MailScanner服務,也會幫你重建 access.db資料庫
    要封鎖前先查看一下該IP的domain寄來的,如果不是常用的很簡單封鎖,否則要好好的考慮一下
    http://www.apnic.net/db/可以查到網域的 相關 資料,使用nslookup,或dig所查不到,如果是台灣發配的IP要到http://www.twnic.net/查 詢更詳細的資料如管理者(左上角,除了網域也可以查IP)

  7. 垃圾郵件誤判
  8. 在/etc/MailScanner/rules/spam.whitelist.rules,中加入不要判為垃圾郵件(2004/04/26更新)
  9. 反浮動ip郵件主機
  10. isp給那些浮動ip的名稱(dns)固定後面名字,如(hinet -是dynamic.hinet.net)因此我們可以在/etc/mail/access 中設 dynamic.hinet.net reject,依次找尋isp大廠,查詢其動態ip的所名稱,再加入檔案中,以下是常見的動態ip的主機列表
    mailserver.idv.tw       REJECT
    www-mailserver.com      REJECT
    dynamic.hinet.net       REJECT
    dynamic.apol.com.tw     REJECT
    dynamic.so-net.net.tw   REJECT
    dynamic.ttn.net         REJECT
    dynamic.giga.net.tw     REJECT
    dynamic.tfn.net.tw      REJECT

  11. 垃圾郵件在sendmail通訊時擋掉,不浪費任何儲存空間
    /etc/mail/sendmail.mc加入
    FEATURE(`dnsbl', `bl.spamcop.net', `"Spam blocked see: http://spamcop.net/bl.shtml?"$&{client_addr}')dnl
    FEATURE(`dnsbl',`dnsbl.sorbs.net',`"554 Rejected " $&{client_addr} " found in dnsbl.sorbs.net"')dnl
    可以在連線時直接上網檢查是否為垃圾郵件主機,如果是垃圾郵主機直接拒絕連線
  12. 自己內部電腦中毒
  13. 你可碰到自己內部電腦中毒,濫發病毒郵件,雖然你的mail server攔到了,但是在郵件附件換成自己的警告訊息,依舊送出郵件,但是因是偽裝的送件者,又送出數百或是數千封信,這是不是跟垃圾郵件一樣嗎?你的主機可能會被辨識為垃圾郵件主機,因此我們必須設定Still Deliver Silent virus使用rule set,寫一個檔案內容如下:
    From:  內部ip            no
    FromOrTo: default        yes
    你區域網路送出的不要送出,別人送來的要,怕別人不是偽裝的病毒所發,可以讓收件者自行判斷(2004/11/09更新)
  14. 郵件伺服器管理者
  15. 當發現病毒時,會傳送一封通知信給postmaster ,如果你的管理者是別人請修改/etc/aliases中postmaster的對應者,修改完不要忘了執行newaliases
  16. 區域網路內的病 毒碼更新
  17. 當你區域網路內無許多機器都需要更新病毒碼,我們不需要全部都上網外更新,可以使用單一伺服器向外更新,再由該伺服器提供更新服務,作法:將病毒碼放在網 頁的 伺服器的根目錄,在別台的電腦中的freshclam.conf,變更DatabaseMirror 參數後面是你網頁伺服器的名稱,然後在執行freshclam測試一下,在下載的部份你可以使用freshclam --datadir=網頁根目錄路徑來更新,但有權限的問題,或許你可以使用freshclam --datadir=網頁根目錄 -u root ,如果你有使用clamav(linux),clamav-devel(windows),預設只能更新在網頁的根目錄病毒碼,如果是clamwin (windows)則可以指定在子目錄中。
  18. 如果你有自定語言
    /etc/MailScanner/reports,在新版更新時會非常麻煩,但是現在內附一個upgrade_languages,其操作類似 upgrade_MailScanner_conf,你可以用來更新languages.conf ,如下:upgrade_languages 新的languages.conf  舊的languages.conf ,其它的依其指示操作
  19. 同時更新本機的病毒碼及提供網頁更新服務的病毒碼
    上述8項,功能不錯,但是freshclam必須執行兩次,或是你寫一個cp的命令來排程以下是我使用同時更新的方法,在/etc/cron.d內建立一 個檔案內容如下:
    5 0-23/2 * * * root /usr/bin/freshclam --on-update-execute=`/bin/cp -u /var/lib/clamav/*.cvd /var/www/html/`
  20. 如何使用mail檔案,轉寄單一郵件,但不變更原始寄件者
    sendmail -ito 收寄者名稱 < 郵件檔案