Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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 使用系统 CA 池;在这种情况下,由于通常轻而易举地能够获得由公用 CA 签名的证书,所以出于安全原因强制执行 sslmode=verify-full

在使用网络上的 scram-sha-256 密码验证时,要防止出现服务器欺骗,应当确保使用 SSL 连接至服务器,并使用上一段中描述的一种防欺骗方法。此外,libpq 中的 SCRAM 实现无法保护整个验证交换过程,但是使用 channel_binding=require 连接参数可以减轻服务器欺骗的风险。攻击者使用恶意服务器拦截 SCRAM 交换后,可离线分析,可能从客户端确定哈希密码。

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