請先閱讀前篇
這篇文章是「在 Linux 上建立郵件伺服器」系列的第六篇。
在前一篇中我們完成了使用 PostgreSQL 設計虛擬使用者帳號表
如果還沒有確認,建議您先閱讀。
👉 前篇:Dovecot 虛擬使用者概念和 PostgreSQL 表設計


Dovecot 的 auth-sql.conf.ext 設定是什麼?

要讓 Dovecot 通過數據庫而非系統帳號來驗證虛擬使用者,必須設定 auth-sql.conf.ext 文件。
此次設定使 Dovecot 能夠從 PostgreSQL 中獲取使用者信息來進行驗證。


Dovecot 的 SQL 驗證設定 (auth-sql.conf.ext)

為了讓 Dovecot 與 PostgreSQL 連接,需要設定以下主要項目。

1. 設定文件路徑

設定文件位於以下路徑。

/etc/dovecot/conf.d/auth-sql.conf.ext

如果文件不存在,可以使用以下命令創建。

sudo touch /etc/dovecot/conf.d/auth-sql.conf.ext

2. 主要設定項目

driver = sql
connect = host=localhost dbname=mail user=mailadmin password=yourpassword

default_pass_scheme = SHA256-CRYPT

password_query = SELECT email AS user, password FROM mail_users WHERE email='%u';

user_query = SELECT home_directory AS home FROM mail_users WHERE email='%u';

設定說明

  • driver = sql → 使用基於 SQL 的驗證
  • connect = host=localhost dbname=mail user=mailadmin password=yourpassword → PostgreSQL 連接信息
  • default_pass_scheme = SHA256-CRYPT → 指定默認密碼雜湊算法。如果使用 bcrypt,則設為 'BLF-CRYPT'
  • password_query → 與用戶輸入的密碼進行數據庫中的雜湊值比較
  • user_query → 返回使用者的郵件存儲路徑

3. 重新啟動 Dovecot 服務

應用設定後重新啟動 Dovecot。

sudo systemctl restart dovecot

Dovecot 與 PostgreSQL 連接測試

要確認設定是否正常應用,請使用以下命令。

1. 驗證測試

doveadm auth test user@example.com password123

如果設定正常,應該會成功通過 passdb 的驗證。

2. 檢查錯誤日誌

如果設定未正確應用,可以檢查日誌來分析原因。

journalctl -xe | grep dovecot

安全的郵件伺服器驗證

密碼雜湊方式 (MD5, SHA-256, BCRYPT 比較及應用)

當 Dovecot 與 PostgreSQL 集成時,密碼必須以雜湊的狀態儲存。
根據雜湊方式的不同,安全性和性能也會有所不同。

1. 雜湊方式比較

雜湊方式 安全水平 速度 使用示例
MD5 脆弱 (可能存在衝突) 快速 不推薦
SHA-256 中等 (較安全) 一般 一般安全需求時
BCRYPT 強大的安全性 緩慢 需高安全要求時

由於 MD5 的脆弱性,建議不要使用。
SHA-256 通常被廣泛使用,在速度和安全性之間取得平衡。
BCRYPT 提供了最強大的安全性,但速度較慢,在性能要求高的環境中需考慮合適的選擇。


使用 Dovecot 命令 (doveadm pw) 進行雜湊

也可以直接在 Dovecot 中雜湊密碼。

1. SHA-256 雜湊

doveadm pw -s SHA256-CRYPT

輸入密碼後會生成如下的雜湊值。

{SHA256-CRYPT}$5$rounds=5000$abc123def456$ABCDEF1234567890ABCDEF1234567890

2. BCRYPT 雜湊

doveadm pw -s BLF-CRYPT

輸出示例:

{BLF-CRYPT}$2a$05$abcdefghij1234567890ABCDEFGHIJKL$CDEFGHIJKLMNOPQRSTUVWXYZ123456

將該雜湊值存儲到 PostgreSQL 的 mail_users 表中即可。


在 PostgreSQL 中直接進行雜湊 (pgcrypto 擴展使用)

使用 PostgreSQL 的 pgcrypto 擴展可以在不使用 doveadm 的情況下進行密碼雜湊。

1. 啟用 pgcrypto 擴展

CREATE EXTENSION IF NOT EXISTS pgcrypto;

2. 雜湊 SHA-256 並儲存密碼

INSERT INTO mail_users (domain_id, email, password, home_directory)
VALUES (1, 'user@example.com', crypt('mypassword', gen_salt('bf')), '/var/mail/vmail/user@example.com');

3. 雜湊 BCRYPT 並儲存密碼

INSERT INTO mail_users (domain_id, email, password, home_directory)
VALUES (1, 'user@example.com', crypt('mypassword', gen_salt('bf', 12)), '/var/mail/vmail/user@example.com');

總結與下一步

在本篇文章中所探討的內容 - Dovecot 的 auth-sql.conf.ext 設定方法
- Dovecot 與 PostgreSQL 連接測試方法
- SHA-256 和 BCRYPT 雜湊方式的應用方法
- 在 PostgreSQL 中直接進行雜湊的方法

預告下一篇:Postfix 與 Dovecot 的 SMTP 認證整合
現在已經設定了 Dovecot,下一步是設置 Postfix 使用 Dovecot 的認證

👉 下一篇:Postfix 與 Dovecot 的 SMTP 認證整合 (敬請期待!)