pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
当客户端应用连接到数据库服务器时,它会指定要以哪个 Postgres 用户名连接,这很像以某个特定用户身份登录 Unix 计算机。在 SQL 环境中,当前活动的数据库用户名决定了对数据库对象的访问权限——有关的更多信息见 第 7 章。因此,显然必须限制给定客户端能以哪些数据库用户名连接。
认证是数据库服务器确认客户端身份的过程,并据此决定是否允许该客户端应用(或者运行该客户端应用的用户)以请求的用户名进行连接。
Postgres 按(客户端)主机和数据库提供客户端认证,并有多种不同的认证方法可用。
Postgres 数据库用户名在逻辑上独立于服务器所在操作系统的用户名。如果某台服务器的所有用户在该机器上也都有账号,那么为他们分配与其 Unix 用户 id 匹配的数据库用户名是有意义的。不过,接受远程连接的服务器可能有许多用户并没有本地账号,在这种情况下,数据库用户名与 Unix 用户名之间就不必存在任何对应关系。
pg_hba.conf 文件 #客户端认证由 $PGDATA 目录中的文件 pg_hba.conf 控制,例如 /usr/local/pgsql/data/pg_hba.conf。(HBA 代表 host-based authentication,即基于主机的认证。)当数据区域由 initdb 初始化时,会安装一个默认的 pg_hba.conf 文件。
pg_hba.conf 文件的基本格式是一组记录,每行 一条。空行和以井号(“#”)开头的行会被忽略。每条记录由若干字段组成,字段之间用空格和/或制表符分隔。记录不能跨行续写。
记录可以采用以下三种格式
localdatabaseauthentication-method[authentication-option] hostdatabaseIP-addressIP-maskauthentication-method[authentication-option] hostssldatabaseIP-addressIP-maskauthentication-method[authentication-option]
各字段的含义如下:
local该记录针对经由 Unix domain 套接字的连接尝试。
host该记录针对经由 TCP/IP 网络的连接尝试。注意,除非服务器启动时带了 -i 开关或设置了等效的配置参数,否则 TCP/IP 连接被完全禁用。
hostssl该记录针对在 TCP/IP 上使用 SSL 的连接尝试。要使用此选项,服务器编译时必须带有 SSL 支持启用。此外,服务器启动时必须用 -l 选项或等效的配置设置启用 SSL。
database指定此记录适用的数据库。值 all 表示适用于所有数据库,而值 sameuser 标识与连接用户同名的那个数据库。否则,这就是某个具体 Postgres 数据库的名称。
IP addressIP mask这两个字段根据 IP 地址控制一条 host 记录适用于哪些主机。(当然,IP 地址可以伪造,但这一考虑超出了 Postgres 的范围。)精确的逻辑是
(actual-IP-addressxorIP-address-field) andIP-mask-field
必须为零,记录才匹配。
authentication method指定用户连接该数据库时必须用来认证自身的方法。可选方法如下,细节见 第 4.2 节。
无条件地允许连接。此方法允许任何对客户端主机有登录访问权限的用户以任何 Postgres 用户身份连接。
无条件地拒绝连接。这主要用于从一组主机中“过滤掉”某些主机。
要求客户端随连接尝试提供一个密码,该密码须与为该用户设置的密码匹配。
可以在 password 关键字之后指定一个可选的文件名。该文件应包含此记录所涉及的用户列表,还可以可选地包含备用密码。
密码以明文形式在线路上发送。为了更好的保护,请使用 crypt 方法。
类似于 password 方法,但密码使用一个简单的质询-应答协议加密后在线路上发送。这仍不是密码学上安全的,但可以防范偶然的线路嗅探。crypt 关键字后面可以跟一个文件名,该文件包含此记录所涉及的用户列表。
使用 Kerberos V4 认证用户。这只适用于 TCP/IP 连接。
使用 Kerberos V5 认证用户。这只适用于 TCP/IP 连接。
向客户端主机上的 ident 服务器询问连接用户的身份。Postgres 然后验证如此识别出的操作系统用户是否被允许以请求的数据库用户身份连接。这只适用于 TCP/IP 连接。跟在 ident 关键字后面的 authentication option 指定一个ident 映射的名称,该映射指定哪些操作系统用户等同于哪些数据库用户。细节见下文。
authentication option此字段的解释因认证方法而异,如那里所述。
第一条与连接尝试的客户端 IP 地址和请求数据库名匹配的记录被用来执行认证步骤。这里不存在“继续向后匹配”或“后备”机制:如果选中某条记录而认证失败,就不会再考虑后面的记录。如果没有任何记录匹配,访问将被拒绝。
pg_hba.conf 文件在每次连接尝试期间重新读取。因此,在服务器运行期间修改访问权限是轻而易举的:只需编辑该文件。
一个 pg_hba.conf 文件的例子见 例 4.1。各种认证方法的细节见下文。
例 4.1. 一个 pg_hba.conf 文件示例
# TYPE DATABASE IP_ADDRESS MASK AUTHTYPE MAP # Allow any user on the local system to connect to any # database under any username, but only via an IP connection: host all 127.0.0.1 255.255.255.255 trust # The same, over Unix-socket connections: local all trust # Allow any user from any host with IP address 192.168.93.x to # connect to database "template1" as the same username that ident on that # host identifies him as (typically his Unix username): host template1 192.168.93.0 255.255.255.0 ident sameuser # Allow a user from host 192.168.12.10 to connect to database "template1" # if the user's password in pg_shadow is correctly supplied: host template1 192.168.12.10 255.255.255.255 crypt # In the absence of preceding "host" lines, these two lines will reject # all connection attempts from 192.168.54.1 (since that entry will be # matched first), but allow Kerberos V5-validated connections from anywhere # else on the Internet. The zero mask means that no bits of the host IP # address are considered, so it matches any host: host all 192.168.54.1 255.255.255.255 reject host all 0.0.0.0 0.0.0.0 krb5 # Allow users from 192.168.x.x hosts to connect to any database, if they # pass the ident check. If, for example, ident says the user is "bryanh" # and he requests to connect as PostgreSQL user "guest1", the connection # is allowed if there is an entry in pg_ident.conf for map "omicron" that # says "bryanh" is allowed to connect as "guest1": host all 192.168.0.0 255.255.0.0 ident omicron
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。