觀點

建立安全的郵件伺服器

2005 / 11 / 03
曾漠益
建立安全的郵件伺服器

網路的普及,使得許多傳統的行為出現了典範轉移,一個明顯的例子就是電子郵件。人們透過網路,可以輕易的寄送信件,而無需再經由郵差遞送。電子郵件的應用非常廣泛,舉凡報紙、賀卡等產業,都受到直接影響。和傳統信件比起來,電子郵件有以下優點:
免費:免貼郵票,免費使用,只需支付些微電費即可。
快速:寄信人在這一分鐘寄信,收信人可在下一分鐘收信。
方便:免用紙筆,免貼郵票,免跑郵局。
但是,「水能載舟,亦能覆舟。」電子郵件的優點反而成為不肖駭客的利器。若郵件伺服器之安全性不足,很有可能被用來當做廣告信件的跳板,或者郵件可能遭受竊取。尤其是垃圾信件(Spam Mails)的問題,幾乎人人收信後第一件事就是砍垃圾信,若一不小心,還有砍到重要信件的危險。
為防止這種情況發生,本文提供一些郵件伺服器的安全防範機制,以期郵件伺服器能避免被作為垃圾信件的轉送跳板,並讓電子郵件使用者能享有更清新安全的電子郵件使用環境。

一、 郵件伺服器可能遭遇的安全威脅
一般郵件伺服器常提供以下幾種服務:SMTP、POP3、WebMail。 SMTP全名為「Simple Mail Transfer Protocol」,中文可稱為「簡單郵件傳輸協定」。SMTP最大的缺點為:太過信任使用者。這是因為SMTP發展之初僅為學術使用,它相信所有使用者的身分均為真實的,因此不肖商人可以很容易地捏造一個不實身分,透過SMTP伺服器來寄送廣告信件。雖然SMTP有先天上的缺陷,但仍有許多人是針對SMTP提出改良方案,例如在SMTP協定中加入使用者身份認證機制,並且在SSL/TLS上執行SMTP,以防止使用者之帳號密碼洩漏。本文將在第二節簡單介紹建立認證SSL/TLS SMTP伺服器的方法。
POP3全名為「Post Office Protocol, version3」,中文可稱為「郵局通訊協定」。POP3是用來接收電子郵件的通訊協定,它會把使用者位於郵件伺服器上的信件通通下載至使用者的個人電腦中,此外,亦可選擇是否將郵件保留於伺服器上。
傳統上,POP3是以明碼傳遞使用者的帳號和認證密碼,因此若郵件伺服器遭到竊聽,則使用者的帳號和密碼即可能洩漏,或者於郵件傳遞過程中竊取信件。因此,有人提出了基於SSL的POP3協定,稱為POP3S。本文將於第三節簡單介紹建立POP3S伺服器的方法。
WebMail亦是郵件伺服器經常提供的服務,它可讓使用者於個人電腦的瀏覽器上收取並閱讀信件,而無需下載信件到個人電腦中。通常,郵件伺服器的WebMail必須配合網頁伺服器運作,因此網頁伺服器的安全性與WebMail有直接的關聯性。要提供安全的WebMail,最簡單的方式就是一併提供支援SSL加密的網頁伺服器。本文將於第四節簡單介紹一些安全小技巧,以Open WebMail為例。 鑑於大部分的郵件伺服器均以UNIX為架設平台,因此本文選用FreeBSD 4.x作業系統作為介紹的基本架構,針對以上三項服務提供一份安全的架構方案(Postfix + IMAP-UW + Open WebMail)。

二、建立安全的SMTP伺服器
在這一節中,我們將介紹如何以Postfix來建立安全的SMTP伺服器。何以選用Postfix呢?而不使用Sendmail?這是由於Sendmail存在許多安全性問題,並且Sendmail.cf複雜難懂。Wietse Venema先生有鑑於此,就設計了一個足以取代Sendmail的軟體,因此Postfix就此而生。Postfix無論在安全性、穩定性、效能、設定等方面均相當出色,並且相容於Sendmail,滿足原本Sendmail用戶的使用習慣。
有了這身分認證功能後,SMTP伺服器將不會再轉送未經認證之使用者的信件,而只信任通過認證的真正合法使用者,只要在Outlook帳號設定中的進階標籤裡,把「我的外寄伺服器(SMTP)需要驗證」打勾,就可以使用身分認證機制。唯一的隱憂是合法使用者的密碼外洩,並且被駭客用來從事不法行為。此時可在配合SSL/TLS的加密機制,讓駭客無法竊聽使用者之帳號密碼,進而防止駭客盜用合法帳號。支援SSL/TLS加密的郵件伺服器必須向其使用者宣導使用SSL/TLS來做寄信的動作,只要在Outlook帳號設定中的進階標籤裡,把「外寄伺服器(SMTP),此伺服器需要加密連線(SSL)」打勾,就可以採用TLS加密連線了。至於其他的郵件客戶端軟體(如Mozilla Mail),請參閱其文件,將SMTP設定為TLS/SSL加密連線。 (如表一)

三、建立安全的POP3伺服器
傳統的POP3協定並不提供SSL加密功能,因此隨後有人提出了POP3S協定來加強POP3的安全性。POP3S為加上SSL支援的POP3,預設使用的是port 995作為其加密傳輸的預設通訊埠。
完成上面步驟後,郵件伺服器的使用者即可享受以SSL加密傳輸的POP3S協定。郵件伺服器必須宣導使用者使用該項服務,只要在Outlook帳號設定中的進階標籤裡,把「內送伺服器(POP3),此伺服器需要加密連線(SSL)」打勾,就可以採用SSL加密連線了。至於其他的郵件客戶端軟體(如Mozilla Mail),請參閱其文件,將POP3設定為TLS/SSL加密連線。 (如表二)

四、建立安全的WebMail
因為WebMail必須和網頁伺服器共同運作,因此WebMail要安全,就必須透過一個支援SSL加密傳輸的網頁伺服器。 前面提到,我們使用Open WebMail來作為範例,它是一個以CGI寫成的WebMail,安裝完成後,其首頁位於 http://your.host.name/cgi-bin/openwebmail/openwebmail.pl 但直接連接該頁的話,使用者不一定會走SSL協定(HTTPS),透過下面這個小技巧,可以讓使用者更加安全。 郵件伺服器不一定要以該連結為WebMail進入頁面,而可以對外公布說,本WebMail的進入頁面位於http://your.host.name/webmail/。此時,只要在網頁伺服器根目錄下建立一個名為webmail的子目錄,並在其中放置一個名為index.html檔案(或其他網頁伺服器的預設首頁檔名),其內容如下:

上面的HTML語法所進行的動作是將使用者以HTTPS的協定導到真正的Open WebMail進入頁面。如此一來,大部分的使用者將會被自動導到支援SSL加密協定的頁面,並且享用安全的WebMail使用環境。此外,這樣的網址也較原來那一大串網址好記。

本文作者任職於 台灣電腦網路危機處理暨協調中心(TWCERT/CC)

參考資料:[1] [教學]Postfix+Cryus-SASL2+SSL/TLS+Courier-IMAP實作, http://www.backup.idv.tw/phpBB2/viewtopic.php?t=683
[2] [教學]FreeBSD - Postfix + SMTP AUTH, http://www.backup.idv.tw/phpBB2/viewtopic.php?t=628
[3] 簡易 Mail Server 架設 Postfix 設定, http://linux.vbird.org/linux_server/0390postfix.php
[4] 如何把 Sendmail 換成 Postfix,
http://linux.tnc.edu.tw/techdoc/postfix-howto.htm
[5] 使用FreeBSD建立安全的郵件系統—imap/pop篇 http://www.ascc.net/nl/90/1714/04.txt
[6] HTML完全程式設計手冊 http://db.books.com.tw/exep/prod/booksfile.php?item=0010007995

表一:一個安全的SMTP伺服器應當提供兩個功能:身分認證機制和資料加密傳輸機制。因為本文是以FreeBSD為架構平台,因此下列安裝範例是以FreeBSD的ports來安裝。
# Step 1. 停止Sendmail運作
shell> killall sendmail
# Step 2. 由FreeBSD的ports安裝Postfix
shell > cd /usr/port/mail/postfix
shell > make install clean
# 在出現的第一個選單中選擇SASL和TLS
# 在出現的第二個選單中選擇PWCHECK
# 之後的程序中會出現兩個選項,一個是問「是否將postfix加入mail群組?」,另一個是問「是否在/etc/mail/mailer.conf中啟動Postfix?」,請都選y
# 安裝過程中,會出現指示使用者進行下面Step 3和Step 4動作的訊息
# Step 3. 修改/etc/rc.conf,加入以下設定,以讓Postfix取代Sendmail: sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"
# Step 4. 建立/etc/periodic.conf檔案,內容為:
daily_clean_hoststat_enable="NO" daily_status_mail_rejects_enable="NO" daily_status_include_submit_mailq
="NO" daily_submit_queuerun="NO"
# Step 5. 編輯/usr/local/etc/postfix/main.cf檔案,設定伺服器環境,通常需設定以下四項:
myhostname = your.host.name mydomain = your.domain myorigin=$myhostname alias_maps = hash:/usr/local/etc/postfix/aliases
# Step 6. 建立alias資料庫
shell> postalias /usr/local/etc/postfix/aliases
# Step 7. 設定SASL認證
# 修改/etc/group,將postfix加入cyrus群組:
cyrus:*:60:postfix
# 建立/usr/local/lib/sasl/smtpd.conf,內容為:
pwcheck_method: pwcheck
# 確定/usr/local/etc/rc.d/cyrus_pwcheck.sh存在下列一行: cyrus_pwcheck_enable="yes"
# 啟動 cyrus_pwcheck:
shell> /usr/local/etc/rc.d/cyrus_pwcheck start
# 編輯/usr/local/etc/postfix/main.cf,加入:
smtpd_recipient_restrictions = permit_sasl_
autheNticated,check_relay_domains,permit_mynetworks smtpd_client_restrictions = permit_sasl
_authenticated smtpd_sasl_auth_enable= yes smtpd_sasl_security_options= noanonymous
smtpd_sasl_local_domain = $myhostname
表一︰# Step 8. 加入SSL/TLS支援,編輯/usr/local/etc/postfix/main.cf,加入:
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
# 以下三行設定伺服器認證金鑰的位置,若無鑰匙,可自行以OpenSSL產生
# 產生鑰匙的方法請自行參閱相關文件,在此不多行贅述
smtpd_tls_key_file = /usr/local/etc/postfix/CA/server.pem
smtpd_tls_cert_file = /usr/local/etc/postfix/CA/server.pem
smtpd_tls_CAfile = /usr/local/etc/postfix/CA/server.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
mtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
# 9. 啟動Postfix
shell> /usr/local/sbin/postfix start
至此,我們已啟動了一個支援身分認證及SSL/TLS加密傳輸的SMTP伺服器,此時telnet到SMTP所使用的port 25作測試,輸入ehlo localhost後將看到下面二行:
250-STARTTLS
250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5

表二:目前支援POP3S的POP3軟體仍然不多,在此介紹其中之一:IMAP-UW。IMAP-UW是由西雅圖華盛頓大學(University of Washington)所發展,提供IMAP/POP3協定,更重要的是IMAP-UW亦提供了IMAPS/POP3S等SSL加密協定。以下簡單列出其安裝方法,一樣是基於FreeBSD平台,並且使用ports安裝:
#Step 1. 安裝 IMAP-UW
shell> cd /usr/ports/mail/imap-uw
shell> make WITH_SSL=YES install clean
# Step 2. 建立認證金鑰
shell> make cert
# Step 3. 設定 /etc/inetd.conf,加入:
pop3 stream tcp nowait root /usr/local/libexec/ipop3d ipop3d
imap4 stream tcp nowait root /usr/local/libexec/imapd imapd
pop3s stream tcp nowait root /usr/local/libexec/ipop3d ipop3d
imaps stream tcp nowait root /usr/local/libexec/imapd imapd
# Step 4. 設定 /etc/hosts.allow,加入:
imapd : ALL : allow
ipop3d : ALL : allow
# Step 5. 設定 /etc/pam.conf,加入:
imap auth required pam_unix.so
imap account required pam_unix.so try_first_pass
imap session required pam_deny.so
pop3 auth required pam_unix.so
pop3 account required pam_unix.so try_first_pass
pop3 session required pam_deny.so
# Step 6. 啟動服務
shell> killall -HUP inetd