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

18.7. 防止服务器欺骗 #

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

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

对于 本地 连接的另一个选择是,客户端可以使用 requirepeer 来指定连接到套接字的服务器进程所需的拥有者。

要防止对 TCP 连接进行欺骗,请使用 SSL 证书并确保客户端检查服务器的证书,或者使用 GSSAPI 加密(或者两者都使用,如果它们在单独的连接上)。

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

要防止在通过网络使用 scram-sha-256 密码身份验证时发生服务器欺骗,您应该确保使用 SSL 以及上段中描述的防欺骗方法之一连接到服务器。此外,libpq 中的 SCRAM 实现无法保护整个身份验证交换,但使用 channel_binding=require 连接参数可以减轻服务器欺骗。使用流氓服务器拦截 SCRAM 交换的攻击者可以使用脱机分析来潜在地从客户端确定哈希密码。

要防止使用 GSSAPI 进行欺骗,服务器必须配置为仅接受 hostgssenc 连接 (第 20.1 节) 并使用 gss 身份验证。TCP 客户端必须使用 gssencmode=require 连接。

提交更正

如果您在文档中看到任何不正确的内容,不符合您对特定功能的体验,或者需要进一步说明,请使用 此表格 报告文档问题。