2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

18.7. 防止服务器欺骗 #

服务器运行时,恶意用户无法取代正常的数据库服务器。然而,当服务器关闭时,本地用户可以通过启动自己的服务器来欺骗正常的服务器。欺骗服务器可以读取客户端发送的密码和查询,但无法返回任何数据,因为 PGDATA 目录由于目录权限的保护仍然是安全的。欺骗是可能的,因为任何用户都可以启动数据库服务器;客户端无法识别一个无效的服务器,除非它经过特殊配置。

防止欺骗 local 连接的一种方法是使用一个只有可信本地用户才有写权限的 Unix 域套接字目录 (unix_socket_directories)。这可以防止恶意用户在该目录中创建自己的套接字文件。如果你担心某些应用程序可能仍然引用 /tmp 作为套接字文件,从而容易受到欺骗攻击,那么在操作系统启动时,创建一个符号链接 /tmp/.s.PGSQL.5432 指向重定位的套接字文件。你还可能需要修改你的 /tmp 清理脚本,以防止删除该符号链接。

对于 local 连接的另一种选择是让客户端使用 requirepeer 来指定连接到套接字的服务进程的所需所有者。

为了防止 TCP 连接上的欺骗,请使用 SSL 证书并确保客户端检查服务器的证书,或者使用 GSSAPI 加密(如果它们在不同的连接上,则两者都使用)。

为了防止 SSL 欺骗,服务器必须配置为只接受 hostssl 连接 (第 20.1 节),并且拥有 SSL 密钥和证书文件 (第 18.9 节)。TCP 客户端必须使用 sslmode=verify-caverify-full 进行连接,并安装相应的根证书文件 (第 32.19.1 节)。或者,可以使用 sslrootcert=system 来使用 SSL 实现定义的 系统 CA 池;在这种情况下,为了安全起见,会强制使用 sslmode=verify-full,因为由公共 CA 签名的证书通常很容易获得。

为了防止在使用 scram-sha-256 密码认证通过网络进行时发生服务器欺骗,您应该确保使用 SSL 连接到服务器,并使用上文所述的防欺骗方法之一。此外,libpq 中的 SCRAM 实现无法保护整个认证交换过程,但使用 channel_binding=require 连接参数可以缓解服务器欺骗。攻击者使用伪造的服务器拦截 SCRAM 交换,可以通过离线分析来潜在地确定来自客户端的哈希密码。

为了防止 GSSAPI 欺骗,服务器必须配置为只接受 hostgssenc 连接 (第 20.1 节),并与它们一起使用 gss 认证。TCP 客户端必须使用 gssencmode=require 进行连接。

提交更正

如果您在文档中发现任何不正确之处、与您对特定功能的实际体验不符之处或需要进一步澄清之处,请使用 此表格 报告文档问题。