当服务器正在运行时,恶意用户不可能取代正常的数据库服务器。然而,当服务器关闭时,本地用户却可能通过启动自己的服务器来冒充正常服务器。这个伪造服务器可以读取客户端发出的密码和查询语句,但由于PGDATA目录仍然受目录权限保护,它无法返回任何真实数据。之所以会出现这种冒充,是因为任何用户都可以启动一个数据库服务器;而客户端除非经过专门配置,否则无法识别服务器是否为伪造。
防止local连接被欺骗的一种办法,是使用一个 Unix 域套接字目录(unix_socket_directories),并且只允许可信的本地用户对该目录拥有写权限。这样可以防止恶意用户在其中创建自己的套接字文件。如果你担心某些应用程序仍会引用/tmp中的套接字文件,因此仍然容易受到欺骗,那么可以在操作系统启动时创建一个符号链接/tmp/.s.PGSQL.5432,使其指向迁移后的套接字文件。你可能还需要修改/tmp清理脚本,防止该符号链接被删除。
对于local连接,另一个选项是让客户端使用requirepeer,指定连接到该套接字的服务器进程必须由哪个用户拥有。
要防止 TCP 连接上的欺骗,要么使用 SSL 证书并确保客户端检查服务器证书,要么使用 GSSAPI 加密(如果它们分别用于不同连接,也可以两者都用)。
要防止 SSL 欺骗,服务器必须配置为仅接受 hostssl 连接(Section 20.1),并且具备 SSL 密钥和证书文件(Section 18.9)。TCP 客户端必须使用 sslmode=verify-ca 或 verify-full 连接,并安装适当的根证书文件(Section 32.19.1)。另外,也可使用 SSL 实现定义的系统 CA 池(system CA pool),即设置 sslrootcert=system;出于安全考虑,此时会强制使用 sslmode=verify-full,因为获得由公共 CA 签发的证书通常并不困难。
在网络上使用 scram-sha-256 密码认证时,为防止服务器欺骗,应确保通过 SSL 连接服务器,并使用上一段描述的任一防欺骗方法。此外,libpq 中的 SCRAM 实现无法保护整个认证交换过程,但使用连接参数 channel_binding=require 可对服务器欺骗提供一定缓解。攻击者若用伪造服务器拦截 SCRAM 交换,可能通过离线分析推导出客户端哈希密码。
要防止 GSSAPI 欺骗,必须将服务器配置为仅接受hostgssenc连接 (Section 20.1) 并对它们使用gss认证。 TCP 客户端则必须使用 gssencmode=require 发起连接。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。