什麼是 SASL(Simple Authentication and Security Layer),我需要它嗎?
默認情況下,postfix 使用 $mynetworks 參數來控制訪問,即誰可以通過郵件服務器發送或中繼郵件。
除了檢查嘗試發送郵件的用戶的 IP 地址是否屬於 $mynetworks 中指定的受信任網絡的一部分之外,沒有執行其他身份驗證。
如果您只是實現一個所有用戶都基於同一網絡的郵件服務器,那麼您不太可能需要使用 SASL 。
然而,如果有 移動用戶 希望在 遠離基地 時使用郵件服務器,我們需要一種機制來驗證他們作為受信任用戶的身份,以便他們能夠通過郵件服務器發送郵件。
可能最著名的 SASL 實現是由 Cyrus SASL 庫提供的,但是 dovecot 也內置了它自己的 SASL 實現,而且由於我們已經在運行 dovecot,我們不妨將它用於 SASL,而不必安裝和配置另一個包裹。
在 Postfix 配置 SASL
/etc/postfix/main.cf 中添加以下內容:
smtpd_sasl_auth_enable = yes # 啟用 SASL 的常用設置
smtpd_sasl_type = dovecot #啟用 SASL 身份驗證和授權, 默認情況下,SMTP 使用 Cyrus SASL 。
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
# 使用 2.10 之後的 Postfix 版本,使用
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
permit_mynetworks 當客戶端 IP 地址與 $ mynetworks 中列出的任何網絡或網絡地址匹配時,允許請求. permit_sasl_authenticated 當客戶端通過RFC 4954 (AUTH) 協議成功通過身份驗證時,允許請求 defer_unauth_destination 拒絕與reject_unauth_destination相同的請求,帶有非永久性錯誤代碼。此功能在 Postfix 2.10 及更高版本中可用 reject_unauth_destination 拒絕請求,除非以下情況之一為真: Postfix 是郵件轉發器:解析的 RCPT TO 域匹配 $ relay_domains或其子域,並且不包含發件人指 定的路由(user@elsewhere@domain), Postfix 是最終目的地:解析的 RCPT TO 域匹配 $ mydestination、$ inet_interfaces、$ proxy_interfaces、$ virtual_alias_domains或 $ virtual_mailbox_domains, 並且不包含發件人指定的路由 (user@elsewhere@domain)
在 Dovecot 配置 SASL
從 2.3 版開始,Postfix 通過 Dovecot SASL支持 SMTP AUTH, 可以通過運行以下命令檢查 Postfix 是否支持 Dovecot SASL
postconf -a
一旦確認 Postfix 支持 Dovecot SASL,配置就非常簡單
請按情況刪除註釋及/或加入以下內容(請小心,因為這部份有大量註釋,某些項目可能已經存在)
/etc/dovecot/conf.d/10-master.conf 摘錄
service auth {
…
unix_listener /var/spool/postfix/private/auth {
mode = 0660
# Assuming the default Postfix user and group
user = postfix
group = postfix
}
/etc/dovecot/conf.d/10-auth.conf 摘錄
# Outlook 和 Windows Mail 僅適用於 LOGIN 機制,而不適用於標準的 PLAIN
auth_mechanisms = plain login
測試 SASL
我們可以 telnet 進入伺服器並嘗試以目己的用戶名稱及密碼來進行驗證。然而我們的用戶名稱及密碼必須以 Base64 來編碼(註:我們的用戶名稱及密碼是被編碼,而不是加密,解讀它亦易如反掌,所以此刻它並不安全)。利用 perl,你可以按照以下方式產生一句以 Bas64 編碼、包含我們的用戶名稱和密碼的字串(在範例裡我用了 test 這個用戶及 test1234 作為密碼)
perl -MMIME::Base64 -e 'print encode_base64("\000qq\0008879576");'
AHFxADg4Nzk1NzY=
作為參考,我們以 Base64 編碼的字串可以這樣被解讀:
perl -MMIME::Base64 -e 'print decode_base64("AHFxADg4Nzk1NzY=");'
qq8879576
利我們用以 Base64 編碼的字串來測試驗證:
telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.dxqerp.com ESMTP Postfix
EHLO dxqerp.com
250-mail.dxqerp.com
250-PIPELINING
250-SIZE 20480000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN AHFxADg4Nzk1NzY=
235 2.0.0 Authentication successful
quit
221 2.0.0 Bye
Connection closed by foreign host.
假如一切正常的話,我們應該會看見 AUTH PLAIN LOGIN(及 AUTH=PLAIN LOGIN),表示了郵件伺服器現正提供 smtp 驗證,而我們應該可以運用 Base64 編碼的用戶名稱及密碼來成功地驗證。
現在我們可以設定郵件客戶端在發放郵件時採用驗證(用戶名稱及密碼)。
Outlook :「工具」 > 「帳號」 > 「郵件」頁籤 > 選取一個帳戶並點擊「內容」。然後在「伺服器」頁籤裡,於「外寄郵件伺服器」之下,選取「我的伺服器須要驗證」。
如果我們發放一封測試訊息並追查 maillog,假設一切是正常的話,便應該看見我們的郵件客戶端以 SASL 進行驗證:
tail -f /var/log/maillog
使用 SASL 和 Postfix 提交端口
vim /etc/postfix/master.cf
當 Dovecot 用作 Postfix 的身份驗證後端時,最好為 MUA (TCP 587) 使用專用提交端口。您不僅可以在master.cf 中指定覆蓋全局參數的單個參數,而且當 Dovecot 身份驗證機制不可用時,您也不會遇到 Internet 郵件拒絕
submission inet n – n – – smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_sasl_security_options=noanonymous
-o smtpd_sasl_local_domain=$myhostname
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_sender_login_maps=hash:/etc/postfix/virtual
-o smtpd_sender_restrictions=reject_sender_login_mismatch
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
THE END
參考
Postfix/dovecot SASL and SSL/TLS guide