当服务器正在运行时,恶意用户无法取代正常的数据库服务器。但是,当服务器关闭时,本地用户可以通过启动自己的服务器来欺骗正常的服务器。欺骗服务器可以读取客户端发送的密码和查询,但无法返回任何数据,因为 PGDATA
目录仍然因为目录权限而安全。欺骗之所以可能,是因为任何用户都可以启动数据库服务器;除非经过特殊配置,否则客户端无法识别无效的服务器。
防止欺骗 local
连接的一种方法是使用 Unix 域套接字目录(unix_socket_directories),该目录仅对受信任的本地用户具有写权限。这可以防止恶意用户在该目录中创建自己的套接字文件。如果您担心某些应用程序可能仍然引用 /tmp
作为套接字文件,因此容易受到欺骗,请在操作系统启动期间创建一个符号链接 /tmp/.s.PGSQL.5432
,该链接指向重新定位的套接字文件。您可能还需要修改 /tmp
清理脚本,以防止删除符号链接。
对于 local
连接的另一个选项是让客户端使用 requirepeer
指定连接到套接字的服务器进程所需的所有者。
要防止对 TCP 连接进行欺骗,请使用 SSL 证书并确保客户端检查服务器的证书,或使用 GSSAPI 加密(如果它们在不同的连接上,则同时使用这两种方法)。
为了防止 SSL 欺骗,必须将服务器配置为仅接受 hostssl
连接(第 21.1 节)并拥有 SSL 密钥和证书文件(第 19.9 节)。TCP 客户端必须使用 sslmode=verify-ca
或 verify-full
连接,并安装适当的根证书文件(第 34.19.1 节)。或者,可以使用 sslrootcert=system
使用系统 CA 池;在这种情况下,会强制使用 sslmode=verify-full
以确保安全,因为通常很容易获得由公共 CA 签名的证书。
为了防止在通过网络使用 scram-sha-256 密码身份验证时发生服务器欺骗,您应确保使用 SSL 连接到服务器,并使用前一段中描述的反欺骗方法之一。此外,libpq 中的 SCRAM 实现无法保护整个身份验证交换,但使用 channel_binding=require
连接参数可以缓解服务器欺骗。使用恶意服务器拦截 SCRAM 交换的攻击者可以使用离线分析从客户端确定哈希密码。
为了防止 GSSAPI 欺骗,必须将服务器配置为仅接受 hostgssenc
连接(第 21.1 节)并对它们使用 gss
身份验证。TCP 客户端必须使用 gssencmode=require
连接。