建立安全的郵件伺服器

Home Home
引用 | 編輯 masa
2005-02-27 13:06
樓主
推文 x0
有關想要架設郵件伺服器站的人請參考這篇,有許多安全問題可以參考
-------------------------------------------------------------------------------------------------------------
建立安全的郵件伺服器

張貼者: Banana  
摘要

  網路的普及,使得許多傳統的行為出現了典範轉移,一個明顯的例子就是電子郵件。
人們透過網路,可以輕易的寄送信件,而無需再經由郵差遞送。電子郵件的應用非常廣泛
,舉凡報紙、賀卡等產業,都受到直接影響。和傳統信件比起來,電子郵件有以下優點:

 .免費:免貼郵票,免費使用,只需支付些微的電費即可。
 .快速:寄信人在這一分鐘寄信,收信人可在下一分鐘收信。
 .方便:免用紙筆,免貼郵票,免跑郵局。

  但是,「水能載舟,亦能覆舟。」電子郵件的優點反而成為不肖駭客的利器。若郵件
伺服器之安全性不足,很有可能被用來當做廣告信件的跳板,或者郵件可能遭受竊取。尤
其是垃圾信件(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 伺服器應當提供兩個功能:身分認證機制和資料加密傳輸機制。因為
本文是以 FreeBSD 為架構平台,因此下列安裝範例是以 FreeBSD 的通訊埠來安裝。

# Step 1. 停止 Sendmail 運作
shell> killall sendmail

# Step 2. 由 FreeBSD 的通訊埠安裝 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

  有了此身分認證功能後,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 作為其加密傳
輸的預設通訊埠。

  目前支援 POP3S 的 POP3 軟體仍然不多,在此介紹其中之一:IMAP-UW。IMAP-UW 是由
西雅圖華盛頓大學(University of Washington)所發展,提供 IMAP/POP3 協定,更重要
的是 IMAP-UW 亦提供了 IMAPS/POP3S 等 SSL 加密協定。以下簡單列出其安裝方法,一樣
是基於 FreeBSD 平台,並且使用通訊埠安裝:

# 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

  完成上面步驟後,郵件伺服器的使用者即可享受以 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 檔案(或其他網頁伺
服器的預設首頁檔名),其內容如下:

<meta http-equiv="refresh" content="0;URL=https://your.host.name/cgi-bin/openwebmail/openwebmail.pl">

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

參考資料

[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

獻花 x0