什麼是 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

以及在 /etc/postfix/main.cf 內的 smtpd_relay_restrictions 部份加入 permit_sasl_authenticated

# 使用 2.10 之後的 Postfix 版本,使用 
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

在 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

THE END

參考

Postfix/dovecot SASL and SSL/TLS guide

Postfix and Dovecot SASL

SASL

 
個人頭像照片

By 伍芳左

MIS, ERP Pro... RHCE Member (7.2)

發表迴響