前言:
postfix是Wietse Venema在IBM的GPL協議之下開發的MTA(郵件傳輸代理)軟件。下面一段話摘自postfix的官方站點(http://www.postfix.org):“postfix是Wietse Venema想要為使用最廣泛的sendmail提供替代品的一個嘗試。在Internet世界中,大部分的電子郵件都是通過sendmail來投遞的,大約有100萬用戶使用sendmail,每天投遞上億封郵件。這真實一個讓人吃驚的數字。Postfix試圖更快、更容易管理、更安全,同時還與sendmail保持足夠的兼容性。”
全世界范圍內的SMTP服務器與日俱增,但是這些SMTP服務器都有一個與生俱來的缺點,那就是沒有任何的認證機制。因為在設計這些SMTP服務器時,全世界范圍的Internet主機還不是很多,彼此間都有很高的可信任級別,所以沒有全面考慮安全性問題。這種現象也可以在別的Internet協議中看到。
正是因為SMTP通訊過程缺乏認證機制,以及ip欺騙的容易實現,導致了以下兩個方面的問題:SMTP服務器無法確認SMTP客戶機的合法性;SMTP客戶機也無法確認SMTP服務器的合法性。從而也就導致了用戶可以不經過認證就發送郵件,用戶可以冒名發送郵件,以及垃圾郵件的泛濫。
Postfix設置了好多選項讓網絡管理員來限制服務器資源的使用,以及確定用戶的合法性。但遺憾的是,這些認證機制都是基於ip地址或者客戶DNS信息。在客戶ip地址固定的情況下,這些方法或許有一定的作用(雖然還是無法解決冒名發送郵件),但是在客戶ip地址不固定的情況下,就很難通過這種機制來進行限制了。當然,現在也有一些其他的技術,比如POP-before-SMTP(在發信前收信)來解決這個問題,但是這需要運行額外的服務程序。並且用戶在發行之前一定要先收信,這或多或少都會帶來一些不方便。
好在有簡單認證安全層(SASL),它提供了模塊化的SMTP認證擴展,因此SMTP就可以在SASL之上構建自己的SMTP認證,因為可以通過開放式的機制和協議來建立認證會話。另外,SASL在實現了對PLAIN以及CRAM-MD5加密等協議的基礎上,還提供了多種認證方法,比如通過Kerberos、用戶數據庫、passwd文件、PAM等。這樣,SMTP程序不需要支持這些認證方法就可以實現多種認證方式。並且,SMTP在用戶經過成功認證以後同樣可以定義自己的訪問策略來對用戶訪問進行控制。
當然,首先我們必須保證該SMTP服務器能夠提供對SASL的支持
要求:
首先要保證您的postfix版本是snapshot-20000507及其以上的版本,從而保證postfix對SASL的支持。強烈建議您升級至postfix-20010228及其以上版本。可以從www.postfix.org下載postfix的源代碼包,在測試過程中我使用的是postfix-2.3.-20060517-milter.tar.gz
然後,要保證您的SASL的版本是1.5.5及其以上版本,因為已經有報告稱這些版本的SASL可以和postfix工作得很好。可以從ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/下載SASL,在測試過程中我使用的是cyrus-sasl-1.5.28.
整個測試過程是在FC3中進行的.
什麼是sasl呢?
SASL(即Simple Authentication and Security Layer)是為基於連接協議提供輔助認證支持的一種方法。使用SASL認證庫時,應用層協議通過插入相關的認證命令來獲取服務器的訪問授權,同時也可以協商協議交互時的增強保護措施。當使用協商的安全措施時,一個安全協議層會被插入到應用協議層與連接層之間。
步驟:
1.首先檢查系統中是否裝了Cyrus-sasl
rpm -qa |grep cyrus
檢查結果是未安裝,那麼我接下來先安裝Cyrus-sasl
a.tar -zxvf cyrus-sasl-1.5.28.tar.gz
b.cd cyrus-sasl-1.5.28
c../configure --prefix=/usr/local \
--sysconfdir=/usr/local/etc \
--with-plugindir=/usr/local/lib/sasl \
--with-dbpath=/usr/local/etc/sasldb \
--includedir=/usr/local/include/sasl \
--enable-static \
--enable-login \
--disable-plain \
--disable-krb4 \
--disable-anon \
--with-pwcheck=/var/pwcheck \
--with-rc4=openssl \
--disable-gssapi \
--with-dblib=ndbm
各個選項的含義請運行./configure --help獲取。--disable-plain在測試時可以不要,--enable-login是必需的,否則Outlook/Outlook Express客戶端不能實現SMTP認證。SASL除了支持DB3、ndbm數據庫外,還支持MySQL、LDAP1和LDAP2等。
d.編譯
make
e.安裝
make install
cyrus-sasl安裝完畢後下面我們將編譯postfix
a.tar xvzf postfix-postfix-2.3.-20060517-milter.tar.gz
b.cd postfix-2.3.-20060517-milter
c.make tidy
d. make makefiles CCARGS='-DUSE_SASL_AUTH -I/usr/include' AUXLIBS='-L/usr/lib -lsasl'
e.make
f. adduser -s /bin/false postfix
g. make install
接著為了告訴postfix采用sasl來進行SMTP的用戶認證,我們必須用vi命令在/etc/postfix/目錄下的main.cf文件的最後添加以下幾行:
smtpd_sasl_auth_enable = yes
爏mtpd_delay_reject=yes
爏mtpd_recipient_restrictions = permit_mynetworks
permit_sasl_authenticated = permit_auth_destination reject
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
然後保存並退出,添加以上幾行的詳細說明如下:
smtpd_sasl_auth_enable:告訴SMTP客戶,該SMTP服務器需要進行用戶認證。
smtpd_recipient_restrictions = permit_sasl_authenticated permit_auth_destination
reject:僅僅中繼通過SMTP認證的客戶端郵件,以及接收本postfix為最後一站的郵件。
broken_sasl_auth_clients = yes:有一些Microsoft 的SMTP客戶端,比如Outlook Express 4.X采用的是非標准的SMTP認證協議,將該選項設置為yes可以解決這類不兼容問題。
smtpd_sasl_security_options = noanonymous:控制本地SMTP認證所采用的機制,這裡是允許任何非匿名認證方法。這樣用戶的postfix就支持smtp認證.
配置SASL:
a.cd /usr/lib/sasl/
b.touch smtpd.conf
c.more smtpd.conf
d.vi smtpd.conf插入pwcheck_method:pam(也就是通過PAM來進行用戶認證)
什麼是PAM呢?
PAM(Pluggable Authentication Modules )是由Sun提出的一種認證機制。它通過提供一些
動態鏈接庫和一套統一的API,將系統提供的服務 和該服務的認證方式分開,使得系統管理
員可以靈活地根據需要給不同的服務配置不同的認證方式而無需更改服務程序,同時也便於
向系 統中添加新的認證手段。說白了就是一種可插入模塊,是一個用於認證用戶的靈活機制.
配置PAM
a.cd /etc/pam.d
b.touch smtp
c.more smtp
d.more pop
要將pop和smtp的內容設置相同:
auth required /lib/security/pam_stack.so service=system-auth
account required /lib/security/pam_stack.so service=system-auth
修改/etc/shadow文件權限
因為PAM最終要去讀取/etc/shadow文件的內容來進行用戶認證,但是/etc/shadow文件
權限是設置為只有root用戶可以讀寫,而我們的postfix是運行在postfix用戶權限之下,所以我們要合理的設置/etc/shadow文件權限,以便讓pam可以讀取其內容。
執行以下命令,讓root組也可以讀取shadow
a.chmod 640 /etc/shadow
然後再將postfix用戶加入root組,采用以下命令:
b.usermod -G root postfix
最後啟動postfix
c.postfix start
這樣,一個支持SMTP認證的postfix就開始工作了.
然後telnet本機的 25端口
a.telnet 127.0.0.1
b.ehlo 127.0.0.1
ok大功告成,要是哪裡有不對之處希望大家給予點撥斧正.