2025年7月20日 星期日

Mapleboard MP510-50 測試 (三十三) : Postfix 郵件伺服器安全設定

前一篇測試中已安裝好郵件工具包 Postfix 與 mailutils 並成功地透過 Google SMTP 郵件伺服器傳送 Email, 本篇則是要針對 Postfix 郵件伺服器加強安全防護. 

本系列全部的測試紀錄參考 :


Postfix 作為一個郵件傳輸代理 (MTA), 雖然設計上注重安全, 但若設定不當或未及時更新版本 (postfix 與相關之 libsasl2-2, ca-certificates 等套件), 仍然存在潛在的資安風險, 例如遭受暴力破解後, 攻擊者可能利用 Postfix 發送垃圾郵件, 這會導致 Postfix 伺服器被 Google 列入黑名單而無法正常寄信. 其次, 預設的 Postfix 日誌 (/var/log/mail.log) 包含敏感資訊 (如發信人/收信人地址), 若伺服器被入侵, 則日誌可能被用來收集個資. 

由於我的 Mapleboard 的 Postfix 僅作為 SMTP 客戶端 (運行 smtp 進程), 僅連接到 Google 的 SMTP 伺服器 (smtp.gmail.com:587) 寄信, 不開放 25, 587 或 465 埠接受外部連線 (即不運行 smtpd 進程來處理外部請求, 只寄信不收信), 因此不需要在 jail.local 中設定監控規則, 因為 Fail2Ban 的 Postfix 監控是針對外部攻擊, 如果只收信就不會有外部 IP 觸發日誌中的異常行為, Fail2Ban 的 Postfix 監控規則就沒有實際作用, 但是必須進行下列安全防護檢視與設定.  


1. 保護 Google 帳戶憑證 (密碼檔 /etc/postfix/sasl_passwd 權限設為 600) :

此項在前一篇測試中已完成設定, 可用 stat 指令直接查詢權限的數字表示 :

tony1966@LX2438:~$ stat -c "%a" /etc/postfix/sasl_passwd   
600
tony1966@LX2438:~$ stat -c "%a" /etc/postfix/sasl_passwd.db 
600


2. 確保 TLS 加密 (smtp_use_tls = yes 和 smtp_tls_security_level = encrypt)

在前一篇測試中已在 Postfix 設定檔 /etc/postfix/main.cf 中添加如下設定 : 

# Gmail SMTP settings
relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_use_tls = yes   

其中包含了 smtp_use_tls = yes 設定. 而 smtp_tls_security_level 參數在 /etc/postfix/main.cf 設定檔中已經預設為 smtp_tls_security_level=may, 此設定會讓 Postfix 嘗試使用 TLS 與遠端 SMTP 伺服器 (例如 smtp.gmail.com:587) 建立加密連線, 但如果遠端伺服器不支援 TLS, 則會退回到未加密連線. 如果 Google SMTP 伺服器因某種原因無法使用 TLS (雖然這極少發生), 連線可能以明文傳輸, 會導致認證憑證 (例如應用程式密碼) 或郵件內容暴露, 因此設為 may不夠安全. 

用 nano 編輯 /etc/postfix/main.cf 設定檔, 將 smtp_tls_security_level 參數改為 encrypt : 

smtp_tls_security_level=encrypt  

tony1966@LX2438:~$ sudo nano /etc/postfix/main.cf  
[sudo] tony1966 的密碼: 




按 Ctrl+O 存檔後按 Ctrl+X 跳出 nano 即可. 


3. 配置防火牆 (禁止內連 25, 587, 465 埠但允許外連 587 埠) : 

由於我僅使用 Postfix 作為 SMTP 客戶端連接到 Google 的 SMTP 伺服器 (smtp.gmail.com:587) 寄信, 並不運行 Postfix 的 smtpd 進程 (意即不接受外部 SMTP 連線收信), 因此不需要開放 25, 587 或 465 埠的內連流量, 保持這些埠在關閉狀態可以避免不必要的網路攻擊 (例如暴力破解或垃圾郵件中繼等). 

用 sudo ufw status verbose 指令檢視 UFW 防火牆設定 :

tony1966@LX2438:~$ sudo ufw status verbose  
狀態: 啓用
日誌: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
新建設定檔案: skip

至                          動作          來自
-                          --          --
22/tcp                     ALLOW IN    Anywhere                  
80/tcp                     ALLOW IN    Anywhere                  
443/tcp                    ALLOW IN    Anywhere                  
22/tcp (v6)                ALLOW IN    Anywhere (v6)             
80/tcp (v6)                ALLOW IN    Anywhere (v6)             
443/tcp (v6)               ALLOW IN    Anywhere (v6)             

可見目前的 ufw 規則中並未允許 25, 587 或 465 埠的內連流量, 其中 Default: deny (incoming), allow (outgoing) 表示防火牆預設阻止全部內連流量 (除了下方所列之手動開啟埠號外), 且允許全部外連流量, 所以 Postfix 要連線 Google SMTP 伺服器 (587 埠) 沒有問題. 但如果為了管理上強調 須保持 587 埠可外連, 也可以用下列指令做顯式設定 :  

sudo ufw allow out to any port 587


4. 定期更新 Postfix 和相關套件 : 

在 Postfix + mailutils 透過 Google SMTP 寄信的應用場景下須定期更新的 Postfix 相關套件如下 :
  • postfix : 負責處理郵件寄送的核心郵件傳輸代理 (MTA) 
  • mailutils : 提供 mail 指令用來在命令列寄送郵件
  • libsasl2-2 : SASL 相關套件 (用於 Google SMTP 認證), 提供認證框架
  • libsasl2-modules : SASL 相關套件 (用於 Google SMTP 認證), SASL 認證模組
  • ca-certificates : 提供 CA 憑證以驗證 Google SMTP 伺服器的 TLS 連線
可以使用下列指令進行版本更新 :

sudo apt update   (更新套件清單)
sudo apt upgrade   (套件升版)


5. 保護日誌文件 (/var/log/mail.log 權限設為 640) : 

可用 stat 指令查詢日誌檔權限, 它會直接傳回權限的數字表示 :

tony1966@LX2438:~$ stat -c "%a" /var/log/mail.log   
640 

1 則留言 :

Surono 提到...
網誌管理員已經移除這則留言。