PostgreSQL/客户端服务器通信
所有对数据的访问都是由服务器(或后端)进程完成的,客户端(或前端)进程必须连接到这些进程。 在大多数情况下,这两个进程类别的实例驻留在不同的硬件上,但它们也可以在同一台计算机上运行。 它们之间的通信使用特定于 PostgreSQL 的协议,该协议运行在 TCP/IP 或 UNIX 套接字上。 它在 C 库 libpq 中实现。 对于每个传入的新连接,后端进程(有时称为 postmaster 进程)都会创建一个新的 postgres 后端进程。 此后端进程获得 PostgeSQL 实例 的一部分,该实例负责数据访问和数据库一致性。
该协议处理身份验证过程、客户端请求、服务器响应、异常、特殊情况(如 NOTIFY)以及连接的最终正常或不正常终止。
大多数客户端程序 - 如 psql - 直接使用此协议。 ODBC、JDBC(类型 4)、Perl DBI 以及用于 Python、C、C++ 等的驱动程序也基于 libpq。
您可以在 postgres wiki [1] 上找到驱动程序的详尽列表,以及在“产品”网站 [2] 上找到更多商业和开源实现。
客户端必须在获得任何数据访问权限之前进行身份验证。 此过程分为一两个阶段。 在第一个(可选)步骤中,客户端通过满足操作系统障碍来获得对服务器的访问权限。 这通常通过提供一个公共 ssh 密钥来实现。 与 PostgeSQL 的身份验证是一个单独的独立步骤,使用数据库用户名,该用户名可能与操作系统用户名相关联,也可能不相关联。 PostgreSQL 将此第二步的所有规则存储在文件 pg_hba.conf 中。
pg_hba.conf 在一行中存储每条规则,每行一条规则。 从 ph_hba.conf 的顶部到底部对这些行进行评估,第一个匹配的行将应用。 这些行的主要布局如下
local DATABASE USER METHOD [OPTIONS] host DATABASE USER ADDRESS METHOD [OPTIONS]
必须用特定值替换大写词。 像 local 和 host 这样的词是小写词。 它们决定了规则将适用于哪种连接:local 用于与后端位于同一台计算机上的客户端(它们使用 UNIX 套接字进行通信)和 host 用于不同计算机上的客户端(它们使用 TCP/IP)。 这里有一个值得注意的例外情况。 在前一种情况下,客户端可以使用通常的 TCP/IP 语法 --host=localhost --port=5432
切换到使用 TCP/IP。 因此,host 语法对它们适用。
DATABASE 和 USER 必须替换为数据库的名称和数据库用户的名称,规则将适用于这些名称。 在这两种情况下,关键字 ALL 都可以使用,表示规则将适用于所有数据库和所有数据库用户。
ADDRESS 必须替换为客户端的主机名或 IP 地址加上 CIDR 掩码,规则将适用于这些地址。 支持 IPv6 表示法。
METHOD 是以下之一。 如果数据库/用户/地址组合是 pg_hba.conf 中的第一个匹配组合,则由此定义的规则(= 行)将应用。
- trust: 允许连接而无需密码。
- reject: 拒绝连接。
- password: 客户端必须发送有效的用户/密码组合。
- md5: 与“password”相同,但密码已加密。
- ldap: 它使用 LDAP 作为密码验证方法。
- peer: 如果客户端使用与给定数据库用户名相同的用户名对操作系统进行授权,则允许连接。 此方法仅在本地连接上受支持。
关于 METHOD,还有一些其他技术。
一些示例
# joe cannot connect to mydb - eg. with psql -, when he is logged in to the backend. local mydb joe reject # bill (and all other persons) can connect to mydb when they are logged in to the # backend without specifying any further password. joe will never reach this rule, he # is rejected by the rule in the line before. The rule sequence is important! local mydb all trust # joe can connect to mydb from his workstation '192.168.178.10', if he sends # the valid md5 encrypted password host mydb joe 192.168.178.10/32 md5 # every connection to mydb coming from the IP range 192.168.178.0 - 192.168.178.255 # is accepted, if they send the valid md5 encrypted password host mydb all 192.168.178.0/24 md5
对于 DATABASE 规范,存在特殊关键字 REPLICATION。 它表示流式复制过程。 REPLICATION 不是 ALL 的一部分,必须单独指定。