我在 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(中间人)等攻击。
我是否缺少额外的配置或步骤来强制执行证书验证?如何确保连接安全并且证书得到正确验证?
这是客户端配置问题,PostgreSQL 支持的客户端库称为
libpq
,Dovecot 正在使用它。相关手册页libpq SSL 支持(针对版本 17)明确指出:要强制验证,
sslmode
必须设置为verify-ca
检查证书是否被链信任,或者还要检查verify-full
证书中的名称是否与连接字符串中的名称匹配。libpq
如果您使用Dovecot 的 SQL 驱动程序,它可能看起来像这样:
仅提到了 Dovecot;我预计至少还会有一些 MTA,其配置可能也需要进行类似的调整。
您的客户端系统还必须具有
~/.postgresql/root.crt
包含受信任的根 CA 证书的文件。因此,您必须找到 Dovecot 的用户主目录并将根证书放在那里。或者,您可以将sslrootcert=/path/to/file
参数设置为连接字符串以指定包含受信任的根 CA 证书的文件,并提供该文件。