Linux 電子郵件防毒: ClamAV + Sendmail

本文要介紹的 Linux 的 E-Mail 防毒主要由兩個套件組成: clamav 與 clamav-milter。

其中「clamav」是防毒軟體、「clamav-milter」是 clamav 用來與 sendmail 整合的掃毒程式。

安裝 ClamAV 相關套件

yum install clamav clamav-milter

安裝完之後,它會新增一個名為「clamav」的用戶,用它來執行 ClamAV 的相關程式,請不要覺得奇怪就把這個用戶給刪了。

啟動服務:

chkconfig clamd on
chkconfig clamav-milter on
service clamd start
service clamav-milter start

第一次啟動 clamd 出現如下的錯誤訊息不用害怕:

service clamd start
Starting Clam AntiVirus Daemon:
LibClamAV Warning: **************************************************
LibClamAV Warning: ***  The virus database is older than 7 days!  ***
LibClamAV Warning: ***    Please update it as soon as possible.   ***
LibClamAV Warning: **************************************************

這表示病毒資料庫很舊,執行下列指令更新即可:

freshclam

資料庫也會每天自動更新,更新的指令寫在「/etc/cron.daily/freshclam」。

結合 sendmail 防毒

編輯 /etc/mail/sendmail.mc,在最後加入:

INPUT_MAIL_FILTER(`clmilter', `S=local:/var/clamav/clmilter.socket, F=, T=S:4m;R:4m')dnl
define(`confINPUT_MAIL_FILTERS', `clmilter')

接著要重製 sendmail.cf:

m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

重新啟動 sendmail:

service sendmail restart

如果上面都沒發生任何錯誤,那 E-Mail 防毒就完成了。

錯誤處理

如果在重新啟動 sendmail 時出現如下的錯誤訊息:

WARNING: Xclmilter: local socket name /var/clamav/clmilter.socket missing

這個錯誤是因為 sendmail 在啟動時找不到 ClamAV 的 Socket。解決方法很簡單,請查看「/etc/clamav-milter.conf」,找到 MilterSocket unix: 參數,後面接的就是 Socket 的正確路徑了 (例如: MilterSocket unix:/var/clamav/clmilter.socket)。把路徑置換到剛剛加入 sendmail.mc 的 S=local: 後面的參數,接著一樣重製 sendmail.cf:

m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

重新啟動 sendmail:

service sendmail restart

發現病毒的處理方式

ClamAV 預設是將病毒放到隔離區,如果修改處理方式,請編輯「/etc/clamav-milter.conf」,搜尋並修改 OnInfected 參數,可設為下列五種參數:

  • Accept -> 允許寄送,就像沒發生什麼事情一樣 (不建議使用)
  • Reject -> 退回給寄件者
  • Defer -> Return a temporary failure message (4xx) to the peer (不懂使用這個參數的效果)
  • Blackhole -> 直接刪除信件,不做其它回應
  • Quarantine -> 把信件放到隔離區 (預設)

修改完必須重新啟動 clamav-milter:

service clamav-milter restart

如何測試病毒郵件

要如何測試 E-Mail 的防毒是否有效?!只要寄一封信到伺服器的收件者,在郵件的內文加入這一行文字:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

查看 Server 上的 Log 檔:「/var/log/maillog」,依 OnInfected 的設定可看到這些記錄...

當 OnInfected 設為「Reject」時:

Nov 12 18:34:46 mail sendmail[20581]: tACAYk0L020581: from=<sender@example.com>, size=436, class=0, nrcpts=1, msgid=<0c49c24901446801e72dcccd4c11bcc3@example.com>, proto=ESMTP, daemon=MTA, relay=[127.0.0.1]
Nov 12 18:34:46 mail sendmail[20581]: tACAYk0L020581: Milter: data, reject=554 5.7.1 Command rejected
Nov 12 18:34:46 mail sendmail[20581]: tACAYk0L020581: to=<receiver@example.com>, delay=00:00:00, pri=30436, stat=Command rejected

當 OnInfected 設為「Blackhole」時:

Nov 12 18:43:05 mail sendmail[21387]: tACAh53o021387: from=<sender@example.com>, size=437, class=0, nrcpts=1, msgid=<ffd591847005384456d0138d10582d24@example.com>, proto=ESMTP, daemon=MTA, relay=[127.0.0.1]
Nov 12 18:43:05 mail sendmail[21387]: tACAh53o021387: Milter: data, discard
Nov 12 18:43:05 mail sendmail[21387]: tACAh53o021387: discarded

當 OnInfected 設為「Defer」時:

Nov 12 19:24:53 mail sendmail[32350]: tACDOr8O032350: from=<sender@example.com>, size=400, class=0, nrcpts=1, msgid=<201511121324.tACDOrfv032349@mail.terasic.com.tw>, proto=ESMTP, daemon=MTA, relay=[127.0.0.1]
Nov 12 19:24:53 mail sendmail[32350]: tACDOr8O032350: Milter: data, reject=451 4.3.2 Please try again later
Nov 12 19:24:53 mail sendmail[32350]: tACDOr8O032350: to=<receiver@example.com>, delay=00:00:00, pri=30400, stat=Please try again later

當 OnInfected 為預設的「Quarantine」:

Nov 12 18:20:47 mail sendmail[20871]: tACAblgl020871: from=<sender@example.com>, size=436, class=0, nrcpts=1, msgid=<6c5a214ee886d1b2ce35cf9d73a4bc4a@example.com>, proto=ESMTP, daemon=MTA, relay=[127.0.0.1]
Nov 12 18:20:47 mail sendmail[20871]: tACAblgl020871: milter=clmilter, quarantine=quarantined by clamav-milter

當 OnInfected 設為「Quarantine」時,中毒的檔案會放到隔離區,不過這個隔離區是在「/var/spool/mqueue」。你可以執行 mailq -qQ 查看有多少檔案被隔離:

mailq -qQ
/var/spool/mqueue (3 requests)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
tAC9hg4M015066       69 Thu Nov 12 17:43 <sender@example.com>
     QUARANTINE: quarantined by clamav-milter
                                         <receiver@example.com>
tACAblgl020871       69 Thu Nov 12 18:20 <sender@example.com>
     QUARANTINE: quarantined by clamav-milter
                                         <receiver@example.com>
tACAr3aP022084       70 Thu Nov 12 18:53 <sender@example.com>
     QUARANTINE: quarantined by clamav-milter
                                         <receiver@example.com>
                Total requests: 3

寫在最後

為什麼還要多這一段「寫在最後」呢?

因為,雖然很簡單的就裝好了 ClamAV,但是用一陣子你可能會發現,ClamAV 似乎...根本...好像...掃不到病毒!!

就我所知,ClamAV 能掃到的病毒只有約 50%,甚至可能更低!!

所以,如果你中過毒、知道電腦病毒的可怕,那就不要鐵齒...電腦上的防毒軟體還是再裝一套吧!!

參考網頁

  1. No comments yet.

  1. No trackbacks yet.

return top

%d 位部落客按了讚: