如果使用sendmail來構建網站的電子郵件系統,基本上不必費心,因為幾乎所有的Unix的缺省配置中都內置這個軟件,只需要設置好操作系統,它就能立即運轉起來。然而,Inte.net用戶的要求更為苛刻,紛紛指出sendmail中包含的各個不足之處。
第一個重要的缺點是它的安全性較差,這是因為當其作者Eric Allman最初開始寫作這個軟件的時候,Internet的用戶還很少,因而安全性并不沒有得到大家的重視。由于郵件系統需要處理的是外部發送來的各種各樣的信息,甚至包含一些惡意數據,然而sendmail在大多數系統中都是以root身份運行,一旦出現問題,就會對系統安全造成嚴重影響。在這種情況下,要防止出現安全問題,僅僅依賴程序本身是不可取的,應該從系統結構出發,使程序擁有的特殊權限限制到最小。
此外,也是由于其早期的Internet用戶數量及郵件數量都相當小,Sendmail的系統結構并不適合較大的負載,對于高負載的郵件系統,需要對Sendmail進行復雜的調整。例如,通常情況下sendmail只啟動一個進程順序向外發送郵件,如果郵件較多時就要花費相當長的時間。
使用 Sendmail還會遇到的另一個問題是它的設置相當復雜,對于使用缺省設置來收發電子郵件,問題并不存在。當管理員打算進行一些特殊設置,以便利用 Sendmail提供的復雜郵件處理能力時,就不得不面對復雜的宏和正則表達式。雖然現在Sendmail使用了宏預處理程序m4使設置更易于理解一些,但是掌握Sendmail的設置仍然是對系統管理員的一大挑戰。
使用Qmail替代Sendmail
為了解決 sendmail的安全問題,整個系統結構需要重新設計?;镜脑瓌t是將系統劃分為不同的模塊,有負責接收外部郵件的,有管理緩沖目錄中待發送的郵件隊列的,有將郵件發送到遠程服務器或本地用戶的。Qmail就是按照這個原則進行的設計,它由多個不同功能的小程序組成,只有必要的程序才是setuid程序(即以root用戶權限執行),這樣就減少了安全隱患,并且由于這些程序都比較簡單一些,因此就可以達到較高的安全性。
這種按照 Unix思路的模塊化設計方法也使得Qmail具備較高的性能,因為如果需要,Qmail可以啟動某個模塊的多個實例來完成同一個任務,例如啟動多個發送程序同時向外發送郵件,這對于提供郵件列表服務的郵件系統是非常有益的。這種方式也使得Qmail要占用較大的網絡帶寬,如果帶寬有限,效果反而不好,但在當前網絡性能大幅度提高的情況下,這種方式是非常合適的。
Qmail還提供一些非常有用的特色來增強系統的可靠性,例如,它提出了 Maildir格式的郵件存儲方式,這使得通過網絡文件系統NFS存取郵件成為可能。此外,Qmail還具備一些非常別致的特色,它不僅僅提供了與 Sendmail兼容的方式來處理轉發、別名等能力,還可以用以Sendmail完全不同的方式來提供這些功能。從它的編譯安裝方式、提供的擴展功能和源代碼的風格,可以看出其作者Dan Bernstein是一個極具個性化的程序員。正因為如此,對于Qmail的某些方面,有著一些爭論,例如有些人認為Qmail的安裝設置并不易于理解,很容易讓人糊涂,而另一些人的看法則相反?;旧线@是因為Qmail提供解決問題的方式,和Sendmail不大相同的緣故,這樣對那些不太熟悉 Sendmail的郵件系統管理員,反而更容易接受Qmail一些。
另一種替換軟件:Postfix
Postfix 同樣也是采用了模塊化的方式,但與Qmail不同的是,Postfix使用了一個主控進程進行監控。Postfix在很多方面都考慮到了安全問題,它甚至不向root分發電子郵件,以避免以root身份讀寫文件或啟動外部程序??紤]到它的作者Wietse Venema曾編寫了著名的安全軟件TcpWrapper,并是SATAN程序的合作人員之一,Postfix的安全性是非常值得信賴的。
同樣,Postfix的性能也非常不錯,甚至在Qmail作者自己進行的測試中也表明,Postfix的性能和Qmail基本相當。但Postfix占用的內存要大一些,這主要是由于Postfix和Qmail在系統結構上的差異造成的。
與Qmail 不同,Postfix更著眼于作為Sendmail的直接替換,使用Postfix替換Sendmail卻相當簡單,因為Postfix使用的很多文件和 Sendmail一致,只需要在配置文件中指明原有Sendmail配置文件的位置就可以了,Postfix甚至還提供了sendmail和mailq程序,以保持兼容性?;旧?,可以直接從Sendmail轉換為使用Postfix,而不需要額外的設置。Postfix提供的安裝配置方式也相當簡單,它使用中心化的配置文件和非常易理解的配置指令。
Postfix提供的一些強大的功能主要在于多種數據庫表查詢方式,例如它支持DB、 DBM、passwd文件、正則表達式、MySQL數據庫以及LDAP方式的查詢,用于支持系統級的別名、虛擬主機等。雖然在Qmail中也能支持這些功能,但沒有象Postfix那樣統一、簡潔。此外,更改Postfix的設置之后,也不需要重新啟動整個系統,只需要使用postfix reload就能完全刷新配置,這也避免了丟失郵件的可能性。
事實上,除了Qmail和Postfix之外,還有很多種郵件系統,例如Smail、Exim等,然而毫無疑問Qmail和Postfix是其中最優秀的,也是Sendmail最有力的競爭者。此外,還有一些商業郵件服務器產品,但一般情況下,購買商業郵件服務器軟件大部分是沖著其提供的服務或者是附加功能來的,例如群件產品通常帶有很多額外功能用于辦公環境等。
至于在Sendmail、Postfix和Qmail之間進行選擇,基本上依賴于用戶自己的偏好。有些人喜歡Qmail提供的復雜特色,而有的人希望對 Sendmail的替換能簡單一些,也有人不打算更換,而堅持使用Sendmail的最新版本。對于一個熟悉Unix系統而又愿意改善郵件系統性能和安全性的管理員,應該轉換為使用Postfix或Qmail,除非對Sendmail非常熟悉而保持了特殊的感情。在Postfix和Qmail之間,它們各自有一批忠心擁護者,選擇哪個都是可行的。不管選擇哪種郵件系統核心,都需要選擇過硬的專業電子郵件系統廠商提供完善的技術支持服務,除非您本身有強大過硬的技術力量,否則,您將面對的是一場惡夢.
Sendmail作為免費的郵件服務器軟件,已被廣泛應用于Internet各種操作系統的服務器中。如:Solaris,HPUX,AIX,IRIX,Linux等等。隨著互連網的普及,郵件服務器受攻擊的機會也大大增加。目前互連網上的郵件服務器所受攻擊有兩類:一類就是中繼利用(Relay),即遠程機器通過你的服務器來發信,這樣任何人都可以利用你的服務器向任何地址發郵件,久而久之,你的機器不僅成為發送垃圾郵件的幫兇,也會使你的網絡國際流量激增,同時將可能被網上的很多郵件服務器所拒絕。另一類攻擊稱為垃圾郵件(Spam),即人們常說的郵件炸彈,是指在很短時間內服務器可能接收大量無用的郵件,從而使郵件服務器不堪負載而出現癱瘓。這兩種攻擊都可能使郵件服務器無法正常工作。因此作為一個校園網郵件服務器防止郵件攻擊將不可缺少。
目前對于sendmail郵件服務器,阻止郵件攻擊的方法有兩種。
一種是升級高版本的服務器軟件,利用軟件自身的安全功能。
第二種就是采用第三方軟件利用其諸如動態中繼驗證控制功能來實現。下面就以sendmail V8.9.3為例,介紹這些方法。
1.服務器自身安全功能
(1)編譯sendmail時的安全考慮
要利用sendmail 8.9.3的阻止郵件攻擊功能,就必須在系統編譯時對相關參數進行設置,并借助相關的軟件包。目前主要就是利用Berkeley DB數據庫的功能,Berkeley DB包可以從相關站點上下載,并需要預先編譯好。然后將Berkeley DB的相關參數寫進sendmail的有關文件中。
a.修改site.config.m4文件
將編譯好的Berkeley DB有關庫文件路徑加入到site.config.m4文件中,使sendmail編譯后能夠使用Berkeley DB數據庫。
例如:
#cd $/sendmail-8.9.3/BuidTools/Site 修改site.config.m4文件 define (confINCDIRS, -I/usr/local/BerkeleyDB/include) define (confLIBDIRS, L/usr/local/BerkeleyDB/lib)
b.修改sendmail.mc文件
sendmail.mc是生成sendmail.cf的模板文件之一,要使sendmail具有抗郵件攻擊功能還需在該文件中進行相關定義。
主要包括以下幾項: ......
FEATURE(relay_entire_domain)
FEATURE(ACCESS_DB)dn1
FEATURE(blacklist_recipients) ......
(2)相關文件的配置
正確編譯好sendmail是郵件服務器安全控制的基礎,而真正的安全設置主要還是利用相關文件進行的。這種包含控制語句的文件主要是access和 relay-domains。access是郵件安全控制的主要數據庫文件,在該文件中可以按照特定的格式將需控制的域名、IP地址或目標郵件地址,以及相應的動作值寫入,然后使用makmap命令生成access.db文件(#makemap hash access.db < access),從而使服務器允許或屏蔽郵件中繼和郵件轟炸。access的格式如下:
spam.com REJECT edu.cn OK
hotmail.com DISCARD
其中reject動作是拒絕接受從指定地址發來的郵件;ok是允許特定地址用戶任意訪問;relay允許通過本郵件服務器進行中轉郵件;discard是將收到的郵件交給特定命令進行處理,例如:可以設定將收到的郵件丟棄,或者設定收到郵件后返回給使用者一條出錯信息等等。Relay-domains文件是設定哪些域是該服務器可以中繼的域,其格式為每個域占一行。如: ...... CN EDU JP ......
在服務器開始使用時建議將所有頂級域名加入其中,以后再根據安全需要對其進行修改,否則將會使pop3用戶發送郵件時出現relay reject錯誤,而無法向沒有加入的域名目標郵件地址發送郵件。
3)版本號的修改
對于一臺郵件服務器,可以通過遠程的25端口telnet命令來獲取服務器的版本信息。如:“telnet sendmail服務器主機25”就可以查看sendmail的當前版本。為了防止一些惡意的查看版本信息操作,sendmail提供了可以對顯示的版本進行修改的操作。 在sendmail.cf文件中有一句“SmtpGreetingMessage=$j sendmail $V/$Z; $b”的語句,其中$V/$Z就是版本信息,正常情況下由該參數顯示的版本信息為sendmail本身的版本。如果要設定成管理員給定的版本信息,只需將該參數改掉,然后加入你所希望的信息即可。例如:當把這句改成“SmtpGreeting Message=$j sendmail 0.0/0.0; $b”,重啟sendmail服務,則sendmail的版本就會變成“sendmail 0.0”。從而達到隱蔽版本信息的目的。以上是sendmail 8.9.3本身帶有的安全功能設置,通過這些安全設置可以大大加強服務器安全性能。但是在防止郵件中繼和郵件炸彈的設置時,如何確定哪些目標地址是需阻止中繼的,哪些又是允許中轉的,似乎只能通過管理員對日志文件的分析和觀測,或者待發現了安全問題后才能確定。因此這種安全控制還僅是事后控制,并且對相關文件修改后還必須重新啟動服務器。如要實現事先動態安全控制還需要采用其他方法。
2.動態中繼驗證控制
DRAC(Dynamic Relay Authorization Control)動態中繼驗證控制是專門為郵件服務器設計的一個服務器端軟件(http://mail.cc.umanitoba.ca/drac/index.html),它可以安裝在一臺SMTP服務器上,并同時為多個郵件服務器提供動態中繼驗證服務。DRAC主要通過自動獲取和動態更新中繼驗證數據庫中的信息來允許合法 pop3或IMAP用戶使用郵件服務器,從而有效地控制郵件炸彈和非法的郵件中繼。DRAC的原理就是利用pop3或imap服務器固有的功能來獲取用戶名、密碼和客戶機IP地址等信息,并將這些信息及時映象到驗證數據庫中,供smtp服務器調用,同時在經過一段時間以后(缺省為30分種),其驗證信息將自動失效,需要用戶重新輸入驗證信息。這樣不僅可以保證合法的pop3或imap用戶能夠正常使用郵件服務器,也可以阻止任何非注冊用戶(包括本地)利用郵件服務器來發送郵件。這種郵件安全控制常常被稱為:“郵件服務之前的pop驗證”(POP-before-SMTP)。
(1)DRAC的編譯
在編譯DRAC之前,系統的sendmail服務器應該已經正確編譯安裝了。首先在DRAC源程序目錄中編輯Makefile文件,在Solaris 2.x操作系統中其Makefile改成: INSTALL=/usr/ucb/install
EBIN=/usr/local/sbin
MAN=/usr/local/man/man
DEFS=-DTI_RPC -DFCNTL_LOCK -DSYSINFO
CC= (編譯器)
RANLIB= : CFLAGS=$(DFES) -g -I/path/to/db/include LDLIBS=-L/path/to/db/library -lns1 -1db TSTLIBS=-L. -ldrac -lns1 MANLIB=3 MANADM=1m
然后編譯并安裝即可。
如果存在多個pop/IMAP服務器,則還需要將這些服務器的IP地址加到文件/etc/mail/dracd.allow中,其文件書寫格式與/var/yp/securenets文件格式一樣。如:
255.255.255.255 202.139.244.23 255.255.255.255 127.0.0.1
(2)修改sendmail.mc文件重新生成sendmail.cf
在使用DRAC驗證功能之前,還需要將DRAC的驗證信息加到sendmail.cf文件中。首先要修改sendmail.mc文件,然后重新生成sendmail.cf。sendmail.mc文件中相關語句修改如下:
在LOCAL_CONFIG行下增加 kdrac btree /etc/mail/dracd
在LOCAL_RULESETS下增加 Slocal_check_rcpt R$* $: $&{client_addr} R$+ $: $(drac $1 $: ? $) R? $@ ? R$+ $@ $#OK
重新生成sendmail.cf文件后,再重啟sendmail進程。
(責任編輯:城塵)