9.3 9.4 9.5 9.6 10 11 12 13 14 15 16 17 Current(18)
PostgreSQL中文社区 问题报告 纠错本页面

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 节)。或者,也可以使用系统CA池,该池由SSL实现定义,通过sslrootcert=system使用;在这种情况下,为安全起见强制使用sslmode=verify-full,因为通常很容易获得由公共CA签发的证书。

为了防止在通过网络使用scram-sha-256密码认证时发生服务器欺骗,您应该确保使用SSL连接到服务器,并采用上一段中描述的反欺骗方法之一。此外,libpq中的SCRAM实现无法保护整个认证交换,但使用channel_binding=require连接参数可以减轻服务器欺骗的风险。攻击者如果使用恶意服务器拦截SCRAM交换,可能通过离线分析从客户端推测出哈希密码。

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