我在 PostgreSQL 数据库上启用了 SSL,并使用pg_hba.conf
以下行强制执行它:
hostssl all all 0.0.0.0/0 md5
从 PostgreSQL 连接日志和通过 tcpdump 捕获的网络流量来看,似乎正在建立 SSL 连接:
2024-10-20 10:12:16.140 UTC [63] LOG: connection authenticated: identity="user" method=md5 (/etc/postgresql/pg_hba.conf:136)
2024-10-20 10:12:16.140 UTC [63] LOG: connection authorized: user=user database=db SSL enabled (protocol=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384, bits=256)
然而,由于 Dovecot 和 PostgreSQL 运行在不同的机器上,并且证书及其 CA 在 Dovecot 机器上不受信任,我预计连接到 PostgreSQL 的 Dovecot 会标记自签名证书的问题,但没有出现任何投诉。这让我相信证书没有得到适当的验证,使连接容易受到 MITM(中间人)等攻击。
我是否缺少额外的配置或步骤来强制执行证书验证?如何确保连接安全并且证书得到正确验证?
5
最佳答案
1
这是客户端配置问题,PostgreSQL 支持的客户端库称为libpq
,Dovecot 正在使用它。相关手册页(针对版本 17)明确指出:
默认情况下,PostgreSQL 不会执行任何服务器证书的验证。
要强制验证,sslmode
必须设置为verify-ca
检查证书是否被链信任,或者还要检查verify-full
证书中的名称是否与连接字符串中的名称匹配。libpq
如果您使用,它可能看起来像这样:
connect = host=localhost dbname=mails user=admin password=pass sslmode=verify-full
仅提到了 Dovecot;我预计至少还会有一些 MTA,其配置可能也需要进行类似的调整。
您的客户端系统还必须具有~/.postgresql/root.crt
包含受信任的根 CA 证书的文件。因此,您必须找到 Dovecot 的用户主目录并将根证书放在那里。或者,您可以将sslrootcert=/path/to/file
参数设置为连接字符串以指定包含受信任的根 CA 证书的文件,并提供该文件。
2
-
1我最终还添加
sslrootcert
了参数,以便所有连接到 psql 实例的用户都可以验证证书。
–
-
好主意,我认为在答案中提到这个参数也会有益,所以我更新了它!
–
|
–
–
–
–
–
|