《網路安全》 使用FreeBSD建立安全的郵件系統—Sendmail篇 張毓麟 前言 傳統的郵件傳送協定(SMTP)並不具備使用者身份認證的功能, 相當容易被有心人士濫用為廣告郵件或垃圾郵件的轉送點;而沒有 身份認證功能的郵件傳送機制,也造成系統管理或是網路管理人員 處理問題郵件追蹤時的困難。因此,大多數的郵件系統都拒絕為內 部可信賴區域以外的使用者轉送郵件(mail relay),但這種限制 也造成了合法使用者使用上的不方便。例如,出差或是下班回家之 後,無法繼續使用公司的郵件伺服器發信,學生放假離開學校之後 也不能使用學校的郵件主機發出信件。 以往要解決這個問題,必須購買一些昂貴的商業郵件伺服器(例 如微軟的Exchange Server),以便在使用者發出信件前先進行身份 的認證。現在使用新版本的Sendmail郵件伺服軟體,搭配Cyrus SASL 認證程式庫,即可達成往日商業軟體才有的身份認證功能。這種具 有身份認證的郵件伺服器稱為Authenticated Mail Server。 為了進行使用者身份認證,勢必採用帳號(account)與通行碼 (password)或類似的認證機制。如果進行認證的時候,帳號與通 行碼以明文(clear text)的方式在網路上傳遞,則十分容易被有 心的駭客擷取,認証功能反而為駭客開一個更方便的大門。基於保 護合法使用者以及網路資源的前提之下,保密連線(Encrypted Connection)就成為一個必備的功能。 本文所將介紹的Sendmail郵件伺服軟體,亦具備與OpenSSL安全程 式庫搭配的能力。利用OpenSSL程式庫的功能,不只提供使用者安全 連線(SSL/TLS)避免帳號與通行碼外洩,在Email Server與其他機 器連線傳送郵件的時候,也會儘可能的使用最安全的保密連線方式, 讓使用者的郵件在Internet上傳送的時候更加安全。 以下,筆者將根據個人經驗,詳細解說使用FreeBSD 4.3-STABLE 版作業系統、架設具有保密連線功能的Authenticated Mail Server 的詳細操作步驟,與同仁一起交流、分享。 預備程序 由於Sendmail與OpenSSL都是FreeBSD 4.3-STABLE版作業系統內建 的功能,因此不需要額外的安裝手續,只需要根據我們的需要進行 調整即可。為了進行調整,需要有FreeBSD 4.3-STABLE的OS Source Code。如果您的系統安裝時沒有將OS Source Code安裝進去,請先 執行/stand/sysinstall這支工具程式進行補充安裝,或是查閱 http://www.freebsd.org/ 網站上的說明來安裝。 保密連線的金鑰(key-pair)與授權憑證(CA; Certification Authority) 通常,我們會向獨立公正單位(例如VeriSign或GlobalSign等公 司)購買安全金鑰以及授權憑證。如果不願意花錢購買,也可以自 行製作金鑰以及授權憑證。自行製作的安全金鑰與授權憑證,在功 能上與買來的相同,惟向獨立公正單位購買,會讓使用者心理上覺 得比較有保障。 安全連線至少需要三個檔案才能啟用,請將公正單位核發的key- pair與CA放置於下列目錄: server端的key-pair存放於/etc/mail/cert/mykey.pem server端的CA存放於/etc/mail/cert/mycert.pem 公正單位的CA存放於 /etc/mail/cert/cacert.pem 請注意:如果使用由公正單位所發出的key-par,務必通知公正單 位不可將mykey.pem做DES編碼,否則sendmail將無法於開機時自動 啟動。 如果想自行製作key-pair與CA,請依照下列指令操作: # mkdir /usr/local/CA # cd /usr/local/CA # mkdir certs crl newcerts private # echo “01” > serial # cp /dev/null index.txt # cp /etc/ssl/openssl.cnf openssl.cnf 請編輯openssl.cnf檔案,將檔案中約第38行的路徑設定由./demoCA 改成/usr/local/CA。接著執行以下指令,假裝自己是公正單位,做 一個cacert.pem出來。請按螢幕上的指示,輸入相關的系統資料, 當螢幕上提示輸入公正單位密碼(PEM pass phrase)的時候,請自 行設定一個密碼,並請牢記這個密碼,以便日後使用。 # cd /usr/local/CA # openssl req -new -x509 -keyout private/cakey.pem \ -out cacert.pem -days 365 -config openssl.cnf 執行以下指令,建立server端的CA與key-pair。請特別留意,在 這個步驟中,當畫面上提示輸入Common Name的時候,請務必輸入機 器的全名(FQDN),否則以後使用者連線的時候將會出現警告訊息, 造成使用者的困擾。當螢幕提示輸入PEM pass phrase的時候,請輸 入上一步驟中的公正單位密碼。 # cd /usr/local/CA # openssl req -nodes -new -x509 -keyout mykey.pem \ -out myreq.pem -days 365 -config openssl.cnf # openssl x509 -x509toreq -in myreq.pem -signkey mykey.pem \ -out tmp.pem # openssl ca -config openssl.cnf -policy policy_anything \ -out mycert.pem -infiles tmp.pem # rm -f tmp.pem 以下列指令,將key-pair與CA複製到 /etc/mail/cert目錄之下, 並設定正確權限: # mkdir /etc/mail/cert # cp /usr/local/CA/mykey.pem /etc/mail/cert/ # cp /usr/local/CA/mycert.pem /etc/mail/cert/ # cp /usr/local/CA/cacert.pem /etc/mail/cert/ # chmod og-rwx /etc/mail/cert/mykey.pem # chmod og=r /etc/mail/cert/mycert.pem # chmod og=r /etc/mail/cert/cacert.pem 使用下述指令建立CA的hash link,請特別注意引號的方向(建議 剪貼以下指令,以免不小心打字失誤): # cd /etc/mail/cert # ln -s cacert.pem `openssl x509 -noout -hash < cacert.pem`.0 如此,即完成了自行建立key-pair與CA的程序。這組key-pair與 CA將可被sendmail使用於保密連線的資料加密功能上。 軟體與程式庫安裝設定 以下所有的操作程序,請特別留意大小寫的不同,因大小寫與空 白的混淆,將造成操作上的失敗: Cyrus SASL程式庫 Cyrus SASL程式庫由卡內基美隆大學(Carnegie Mellon University) 發展,被收錄在軟體庫的系統安全分類中,安裝的指令如下: # cd /usr/ports/security/cyrus-sasl # make install Cyrus-SASL程式庫安裝之後,會自動建立Sendmail運作時需要的 設定檔,完全不需要進行任何調整,只要以下述指令啟動password checking介面即可: # /usr/local/etc/rc.d/pwcheck.sh start Sendmail設定調整 系統雖然內建Sendmail,但內建的版本並沒有與Cyrus-SASL程式 庫連結,因此必須加以調整。以下的指令將為調整Sendmail做準備: # killall -9 sendmail # cat >> /etc/make.conf SENDMAIL_CFLAGS=-I/usr/local/include/sasl -DSASL SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl ^D(同時按Ctrl鍵與D字母鍵) 此外,我們還希望在系統的紀錄檔中,能明確地紀錄某位使用者 在幾點幾分使用本Server發送信件,因此以下列指令取得筆者提供 的小小修正檔,並將其與系統的Sendmail Source Code整合: # cd /tmp # fetch http://beta.wsl.sinica.edu.tw/~ylchang/Email/patch/ sendmail.logfile.header.patch(請與上一行不空格連接) # cd /usr/src # patch < /tmp/sendmail.logfile.header.patch 以下列指令安裝新的Sendmail程式: # cd /usr/src/lib/libsmutil # make clean # make # cd /usr/src/usr.sbin/sendmail # make clean # make all install 完成上述指令後,sendmail的安全連線與身份認證功能已經被啟 動,但仍需進一步設定才能正常運作。 請編輯/etc/mail/freebsd.mc檔案,在檔案末端加入以下11行設 定: dnl The following lines are used to enable the STARTTLS function define(`CERT_DIR’, `/etc/mail/cert’)dnl define(`confCACERT_PATH’, `CERT_DIR’)dnl define(`confCACERT’, `CERT_DIR/cacert.pem’)dnl define(`confSERVER_CERT’, `CERT_DIR/mycert.pem’)dnl define(`confSERVER_KEY’, `CERT_DIR/mykey.pem’)dnl define(`confCLIENT_CERT’, `CERT_DIR/mycert.pem’)dnl define(`confCLIENT_KEY’, `CERT_DIR/mykey.pem’)dnl dnl The following lines are used to enable CYRUS-SASL function TRUST_AUTH_MECH(`LOGIN PLAIN’)dnl define(`confAUTH_MECHANISMS’, `LOGIN PLAIN’)dnl 請特別注意大小寫以及引號的方向,建議使用複製的方式將以上 11行設定貼入/etc/mail/freebsd.mc檔案的末端,以免發生意外的 打字錯誤。接著,以以下列指令來建立新的sendmail控制檔案(cf file): # cd /etc/mail # make cf # make install 完成以上設定程序之後,sendmail的保密連線與身份認證功能已 經被正確的設定完成,可以進行下一步驟,檢查是否正確運作。首 先,請執行下列指令以重新啟動sendmail: # killall -9 sendmail # /usr/sbin/sendmail -bd -q30m 以下列指令係為檢查保密連線與身份認證功能是否正確啟動: # telnet localhost 25 ehlo localhost 若螢幕上出現如下兩行訊息,則表示保密連線與身份認證功能已 經正確啟動了: 250-AUTH LOGIN PLAIN 250-STARTTLS 若沒有出現這兩個訊息,表示前述的操做發生了錯誤,請檢查 sendmail的記錄檔/var/log/maillog內的訊息,以瞭解錯誤發生的 詳細狀況。 設定使用者的郵件程式使用保密連線與身份認證 在此,以Microsoft OutLook Express以及Netscape Messenger為 範例,以圖例(參見圖一、二、三)說明如何設定使用者發送郵件時, 受到保密連線以及身份認證機制的保護。 Microsoft OutLook Express設定步驟 身份認證部份(如圖一): [OutLookExpress]-->[工具]-->[帳號]-->[郵件]-->[內容]--> [伺服器]-->[我的伺服器需要查驗身份](打勾) 保密連線部份(如圖二): [OutLookExpress]-->[工具]-->[帳號]-->[郵件]-->[內容]--> [進階]-->[外寄郵件-SMTP]-->[這個伺服器需要安全連線-SSL] (打勾) Netscape Messenger設定步驟 身份認證部份:   Netscape Messenger會自動偵測mail server是否提供身份認證功 能,因此不需要針對身份認證做額外的設定。 保密連線部份(如圖三): [NetscapeMessenger]-->[Edit]-->[Preference]-->[Mail&Newsgroups] -->[Mail Servers]-->[Outgoing Mail Server]-->[Use Secure Socket Layer (SSL) or TLS for outgoing messages]-->選Always 結語 以上即是在FreeBSD 4.3-STABLE版作業系統上,以sendmail搭配 OpenSSL與Cyrus-SASL建構具備保密連線與身分認證的郵件系統程序。 搭配合適的用戶端軟體,可以在使用者傳送郵件到主機的過程中, 保護資料的安全;另一方面,如果收件人的主機有支援保密連線功 能,則也會自動的以加密的方式將郵件送到收件人的信箱,以達到 全程保密目標。 後續,為讓使用者對此一安全機制全貌有更充份的掌握,筆者將 逐期於通訊中介紹包括:如何藉由郵件的標頭(Email Header)判 讀保密連線的等級、以及如何在郵件標頭中加上發信記錄,並與 sendmail記錄檔交叉比對等主題,實現問題郵件全程追蹤、快速處 理的功能,以饗同仁。 ********************************************************** 為什麼選用FreeBSD? 在幾個免費的PC-UNIX(或Linux)作業系統中,*BSD家族(包括 FreeBSD/OpenBSD/ NetBSD)擁有其他OS望塵莫及的優點。當其他的 PC-UNIX(或Linux)作業系統還在為系統整合煩惱,並且為系統中 大小漏洞疲於奔命的時候,*BSD家族早已完成系統整合,並將眼光 放在打造多平台作業系統的目標上。 *BSD除了以架構嚴謹、管理便利著稱以外,設計時對系統安全性 近乎瘋狂偏執的追求,使他成為PC上最難入侵的作業系統。再加上 沿襲4BSD在網路與高系統負荷方面優異表現的血統,因此,*BSD不 只適合擔任個人DeskTop的工作平台,更是作為Internet Service伺 服器的不二人選。 而FreeBSD是在國內最容易取得的*BSD家族作業系統,也有大量的 中英文文件以及書籍可供參考(其實*BSD的文件幾乎是完全通用的)。 此外,FreeBSD提供的安裝介面操作上較為便利,對於習慣微軟軟體 的使用者而言,轉換上比較沒有障礙。 (註:在本文中所需要使用的軟體與程式庫,都已經被收錄在 FreeBSD超過5,700套軟體的軟體庫(ports)之中。只需要下幾個簡 單的指令即可安裝,並且都提供設定的範例與詳細說明文件)。