設置Linux郵件服務器防垃圾策略
郵件系統是Linux網絡應用的重要組成部分。完整的郵件系統包括底層操作系統、郵件傳送代理MTA、郵件分發代理MDA和郵件用戶代理MUA。
目前來看,Linux郵件系統面臨的主要危險是垃圾郵件、Linux病毒和DoS攻擊。本文將重點介紹Linux郵件服務器的防垃圾郵件策略。
垃圾郵件的防范
目前廣泛使用的防垃圾郵件技術有:
(1)SMTP用戶認證:一種常見并十分有效的方法,在郵件傳送代理(MTA)上對來自本地網絡以外的互聯網的發信用戶進行SMTP認證,僅允許通過認證的用戶進行遠程轉發。這樣既能夠有效避免郵件傳送代理服務器為垃圾郵件發送者所利用,又為出差在外或在家工作的員工提供了便利。如果不采取SMTP認證,在不犧牲安全的前提下,設立面向互聯網的Web郵件網關也是可行的。此外,如果SMTP服務和POP3服務集成在同一服務器上,在用戶試圖發信之前對其進行POP3訪問驗證(POP before SMTP)是一種更加安全的方法。
(2)關閉Open Relay:現在依然存在并非少數的開放Open Relay服務器,所以,關閉Open Relay功能對反垃圾郵件效果顯著。
(3)實時黑名單過濾:前面介紹的防范措施對使用自身合法域名的垃圾郵件無效,這時可以使用黑名單服務列表。針對每個進入的郵件信息,MTA程序獲取遠程服務器的地址,并且查詢遠程互聯網服務器對該地址進行認證。如果該地址在垃圾郵件主機列表中,則MTA拒絕接受這些郵件信息。其中使用BRL認證過程如圖1所示。
圖1
(4)內容過濾:MTA、MUA、MDA過濾有自己的特點,通常幾種方法同時使用。
◆ MTA過濾:大部分MTA提供某種過濾,因為它們在電子郵件的前端,通常更容易控制郵件的到達。
◆ MDA過濾:大多數MTA不對郵件內容過濾,對信件內容的過濾就由MDA來完成,許多復雜的過濾器都是使用MDA過濾器做的。
◆ MUA過濾:MDA位于郵件服務器上,而許多用戶希望從郵件界面管理過濾規則,因此需要MUA過濾。主流的MUA如Windows下的Outlook、Foxmail和Linux下的Evolution都帶有過濾功能。
◆ 專用工具:如SpamAssassin。
◆ 商業軟件:如趨勢科技IMSS 5.5(整合了垃圾郵件防治服務SPS)。
#p#
應用實例
Sendmail是RedHat Linux以及大多數類Unix操作系統的郵件傳送代理,因此是目前配置最廣泛的郵件服務器。下面以RedHat Linux 9.0使用的Sendmail為例,介紹上面幾種技術應對垃圾郵件的危害。
(1)關閉Sendmail的Relay功能
所謂Relay,就是指別人能用這臺SMTP郵件服務器給任何人發信,這樣別有用心的垃圾發送者就可以使用這臺郵件服務器大量發送垃圾郵件,而最后別人投訴的不是垃圾發送者,而是這臺服務器,因此必須關閉Relay。
其方法是:到Linux服務器的/etc/mail目錄編輯access文件,去掉“*relay”之類的設置,只留“localhost relay”和“127.0.0.1 relay”兩條即可。注意,修改access文件后還要使用如下命令使修改生效:
makemap hash access.db < access
(2)在Sendmail中添加RBL功能
RBL(Realtime Blackhole List)是實時黑名單。常用的RBL服務器地址有relays.ordb.org、bl.spamcop.net、dun.dnsrbl.net及dnsbl.sorbs.net等。查詢和刪除RBL中的IP地址可以去http://openrbl.org和http://ordb.org。
RBL將收集到的專發垃圾郵件的IP地址加入他們的黑名單,只要在Sendmail中加入RBL認證功能,就會使郵件服務器在每次收信時都自動到RBL服務器上去查實,如果信件來源于黑名單,則Sendmail會拒收郵件,從而使單位的用戶少受垃圾郵件之苦。
在Sendmail中添加RBL認證,需要對Sendmail.mc添加以下內容:
FEATURE(`dnsbl',`relays.ordb.org',`″Email blocked using ORDB.org - see
″')
最后執行“m4 Sendmail.mc> Sendmail.cf”和“service Sendmail restart”兩條命令,使有關Sendmail的修改生效。
(3)打開Sendmail的SMTP
◆ 服務器端設置
關掉了Relay功能,用戶就不能使用客戶端軟件發信,此時需要Sendmail配置,開放其SMTP認證功能,再在客戶端如Outlook Express、Foxmail等當中打開SMTP認證,這樣就可以正常SMTP服務器了。在
RedHat Linux 9.0中配置SMTP認證非常方便,首先用命令檢查有沒有安裝cyrus-sasl軟件包。
#rpm -qa grep sasl
cyrus-sasl-2.1.10-4
cyrus-sasl-plain-2.1.10-4
cyrus-sasl-devel-2.1.10-4
cyrus-sasl-md5-2.1.10-4
如果沒有安裝的話,用命令“rpm -ivh cyrus-sasl*.rpm”安裝所有軟件包,接著打開/etc/mail/Sendmail.mc文件,將如下命令:
dnl TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS',`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1,Name=MTA')dn1
修改為:
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS',`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
DAEMON_OPTIONS(`Port=smtp,Addr=192.168.1.200,Name=MTA')dn1
然后產生cf文件,并進行測試:
#m4 Sendmail.mc > Sendmail.cf
#service Sendmail restat
# Sendmail d0.1 -bv root grep SASL
NETUNIX NEWDB NIS PIPELINING SASL SCANF STARTTLS TCPWRAPPERS #修改成功標志
下一步測試,以Telnet到TCP 25 端口的方式:
#telnet localhost 25
ehlo localhost
注意有沒有以下的信息出現:
250-xxxxxxxx
250-xxxxxxx
250-AUTH LOGIN CRAM-MD5 DIGEST-MD5
250-xxxxxx
Outlook Express和Foxmail使用LOGIN認證,Netscape Mail使用PLAIN認證。
#p#
◆ 客戶端設置
在Outlook Express主窗口,單擊“工具(T)”選單,在下拉選單中選中“賬號(A)”。在“Internet賬號”窗口中,選定某一郵件賬號,單擊“屬性(P)”。在彈出的賬號“屬性”窗口中,選擇“服務器”選項卡,選中“我的服務器要求身份驗證(V)”。單擊旁邊的“設置(E)”按鈕,在“外發郵件服務器”窗口中選擇“使用與接收郵件服務器相同的設置(U)”。按“確定”后,設置便完成了。
(4)使用專用工具防止垃圾郵件
SpamAssassin的安裝過程比較簡單,這里就不贅述了。
其配置過程如下:
SpamAssassin預設了許多默認規則,可以在/usr/share/spamassassin下找到,用戶想添加自己的規則,可以配置通過/etc/mail/spamassassin/local.cf文件實現。要在其中添加白名單(即可以確信不會發送垃圾郵件的發件人列表)。設置代碼如下:
whitelist_from_rcvd people@basic.com
whitelist_from_rcvd @ people.com
以上兩條規則將people@basic.com郵箱和@people.com整個域加入了白名單。
下面還要把SpamAssassin與Sendmail(此處以Sendmail為例,Qmail、Postfix略有不同)整合在一起。最簡單的方法是使用procmail來調用SpamAssassin過濾器。procmail來調用SpamAssassin的過程如圖2所示。
圖2
添加以下內容到/etc/procmailrc文件:
:0fw
/usr/bin/spamassassin
:0
* X-Spam-Status: Yes
Spam
如果希望SpamAssassin不檢查大郵件,可以對其做出限制,添加一行:
:0fw * < 1000000 /usr/bin/spamassassin
這段代碼表示把郵件檢查的大小限制在1000K字節以內。SpamAssassin還提供了一個專門的spamd后臺守護程序,可以設置為系統啟動時自動啟動。在Mail-SpamAssassin-3.-0.2/spamd/下有一個redhat-rc-script.sh腳本,將此腳本放入RedHat的啟動目錄/etc/rc.d/init.d/下即可。同時,還需要對/etc/procmailrc文件做如下修改:
:0fw
/usr/bin/spamc -s 100000
這樣就可以通過控制spamd進程來調整過濾器的運行狀態。配置完成后,可以發郵件進行測試。如果看到在郵件頭出現與spam檢查相關的幾項內容,表示SpamAssassin已經開始發揮作用。
除了設置內部的規則之外,SpamAssassin也可以訪問其他外部的垃圾郵件過濾規則集,這樣可以進一步增強其適用性。Chinese_rules.cf是用于垃圾郵件過濾系統SpamAssassin的中文垃圾郵件過濾規則集。由于以前沒有中文的過濾規則集,SpamAssassin對中文郵件過濾的準確性不高。CCERT反垃圾郵件研究小組推出了第一個基于SpamAssassin的中文垃圾郵件過濾規則集Chinese_rules.cf。把Chinese_rules.cf復制到/usr/share/spamassassin配置文檔中的命令為:
# wget -N -P /usr/share/spamassassin www.ccert.edu.cn/spam/sa/Chinese_rules.cf
要注意的是,CCERT每周更新一次規則集,更新使用CCERT反垃圾郵件服務在6個月內處理過的垃圾郵件為樣本。經常更新Chinese_rules.cf會使過濾效果更好。
Linux有一個稱為crond的守護程序,主要功能是周期性地檢查/var/spool/cron目錄下的一組命令文件的內容,并在設定的時間執行這些文件中的命令。用戶可以通過crontab命令來建立、修改、刪除這些命令文件。例如用crontab命令實現每周一08:35自動更新:
A.首先建立一個文件,文件名稱myproject(名稱可隨意設定):
#crontab -e
B.文件內容為:
35 08 * * 1 wget -N -P /usr/share/spamassassin
www.ccert.edu.cn/spam/sa/Chinese_rules.cf; /etc/init.d/init-script restart
用vi編輯后存盤退出。
C.使用crontab命令添加到任務列表中:
#crontab myproject
這樣,Linux服務器便會在每星期一的8點35分會自動下載Chinese_rules.cf更新規則。
(5)Sendmail服務器防范DoS攻擊措施
通過設置/etc/mail/Sendmail.mc的一些目錄限度,DoS攻擊的有效性就會大受限制。(可參考本刊8月刊《分類防范對Linux的DoS》)。另外可以考慮使用非root權限運行Sendmail服務,使用基于xinetd的SMTP服務即可。
缺省情況下Sendmail的守護進程作為set-UID用戶進程來運行。如果Sendmail的守護進程被緩沖區溢出攻擊的話,可能危及root賬號的安全,而root用戶的權限最高,攻擊者可以摧毀整個服務器。因此需要降低Sendmail運行權限為普通用戶。方法如下:
A.建立mail用戶名稱:
#useradd mail -s /bin/false
B.修改Sendmail使用的文件和目錄的權限:
#chown root:mail /var/spool/mail;#chmod 1775 /var/spool/mail
#chown -R :mail /var/spool/mail/*;#chmod -R 660 /var/spool/mail/*
#chown mail:mail /usr/sbin/Sendmail;#chmod 6555 /usr/sbin/Sendmail
#chown mail /var/spool/mqueue/*;chown -R mail:mail /etc/mail
#chmod -R 664 /etc/mail
C.為Sendmail創建一個超級訪問程序/etc/xine.d/Sendmail:
service smtp
{socket_type=stream
wait=no
user=mail
group=mail
server=/usr/sbin/Sendmail
server_args=-bs
log_on_success+=DURATION USERID
log_on_failure+=USERID
nice=10
disable=no}
D.修改/etc/crontab,使其擁有如下實體:
10 * * * * mail /usr/sbin/Sendmail -q
表示10分鐘運行一次郵件服務器。
E.修改配置文件site.config.m4,添加以下內容:
define(`confTEMP_FILE_MODE’, `0660’)dnl
define(`ALIAS_FILE’, `/etc/mail/aliases’)
F.停止Sendmail守護進程。
G.使用“killall -USR1 xinetd”重新啟動xinetd超級服務器。
H.使用命令:“telnet localhost 25”連接Sendmail。
I.查看Sendmail運行情況,使用命令:
#ps aux grep Sendmail
mail 25274 0.0 0.7 4048 1808 ? SN 04:11 0:00 Sendmail: server
root 25294 0.0 0.2 1520 592 ttyp0 S 04:15 0:00 grep Sendmail
上面顯示Sendmail作為mail用戶在運行。然后使用quit命令推出即可。
【編輯推薦】