请先阅读前一篇
这篇文章是“在Linux上构建邮件服务器”系列的第六篇。
在前一篇中,我们完成了基于PostgreSQL的虚拟用户账户表设计
如果您还没有查看,建议先阅读。
👉 前一篇: Dovecot虚拟用户概念与PostgreSQL表设计


Dovecot的 auth-sql.conf.ext 配置是什么?

要通过数据库而非系统账户来认证虚拟用户,需配置auth-sql.conf.ext文件。
通过此设置,Dovecot可以从PostgreSQL中获取用户信息进行认证。


Dovecot的SQL认证配置 (auth-sql.conf.ext)

连接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认证联动 (敬请期待!)