pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
目录
当客户端应用连接到数据库服务器时,它会指定要以哪个 PostgreSQL 数据库用户名连接,这很像以某个特定用户身份登录 Unix 计算机。在 SQL 环境中,当前活动的数据库用户名决定了对数据库对象的访问权限——详见 第 4 章。因此,必须限制哪些数据库用户能够连接。
认证是数据库服务器确认客户端身份的过程,并据此决定是否允许该客户端应用(或者运行该客户端应用的用户)以请求的数据库用户名进行连接。
PostgreSQL 提供了多种不同的客户端认证方法。用于认证特定客户端连接的方法可以根据(客户端)主机地址、数据库和用户来选择。
PostgreSQL 数据库用户名在逻辑上独立于服务器所在操作系统中的用户名。如果某台服务器的所有用户在该机器上也都有账号,那么为他们分配与操作系统用户名一致的数据库用户名是有意义的。不过,接受远程连接的服务器可能有许多用户并没有本地操作系统账号,在这种情况下,数据库用户名与操作系统用户名之间就不必存在任何对应关系。
pg_hba.conf 文件 #客户端认证由数据目录中的文件 pg_hba.conf 控制,例如 /usr/local/pgsql/data/pg_hba.conf。 (HBA 代表 host-based authentication,即基于主机的认证。)当数据目录由 initdb 初始化时,会安装一个默认的 pg_hba.conf 文件。
pg_hba.conf 文件的基本格式是一组记录,每行 一条。空行会被忽略,“#” 注释字符之后的文本同样 如此。每条记录由若干字段组成,字段之间用空格和/或制表符分隔。 如果字段值用引号括起来,就可以包含空白。记录不能跨行续写。
每条记录都指定一种连接类型、一个客户端 IP 地址范围(如果该连接类型需要)、一个数据库名、一个用户名,以及对匹配这些参数的连接要使用的认证方法。第一条同时匹配连接类型、客户端地址、请求数据库和用户名的记录会被用来执行认证。这里不存在“继续向后匹配”或“后备”机制:如果选中某条记录而认证失败,就不会再考虑后续记录。如果没有任何记录匹配,则拒绝访问。
记录可以采用以下三种格式之一
localdatabaseuserauthentication-method[authentication-option] hostdatabaseuserIP-addressIP-maskauthentication-method[authentication-option] hostssldatabaseuserIP-addressIP-maskauthentication-method[authentication-option]
各字段的含义如下:
local该记录匹配使用 Unix domain 套接字的连接尝试。没有这种类型的 记录时,Unix domain 套接字连接将被禁止
host该记录匹配使用 TCP/IP 网络进行的连接尝试。注意,除非服务器启动时带了 -i 选项,或者启用了 tcpip_socket postgresql.conf 配置参数,否则 TCP/IP 连接是被禁用的。
hostssl该记录匹配使用 TCP/IP 上的 SSL 进行的连接尝试。 host 记录既匹配 SSL 连接尝试,也匹配非 SSL 连接尝试,但 hostssl 记录要求 SSL 连接。
要能够使用此选项,服务器编译时必须带有 SSL 支持启用。此外,还必须在 postgresql.conf 中启用选项 ssl 来启用 SSL(见 第 3.4 节)。
database指定此记录匹配哪些数据库。值 all 表示匹配所有数据库。值 sameuser 表示当请求的数据库与请求的用户 同名时记录匹配。值 samegroup 表示请求的用户必须是与请求数据库 同名的组的成员。否则,这就是某个具体 PostgreSQL 数据库的名称。 多个数据库名可以用逗号分隔提供。还可以在文件名前加 @ 来指定一个包含数据库名的文件。该文件必须与 pg_hba.conf 位于同一目录中。
user指定此记录匹配哪些 PostgreSQL 用户。值 all 表示匹配所有用户。否则,这就是某个具体 PostgreSQL 用户的名称。多个用户名可以用逗号分隔提供。组名可以在组名前加 + 来指定。还可以在文件名前加 @ 来指定一个包含用户名的文件。该文件必须与 pg_hba.conf 位于同一目录中。
IP-addressIP-mask这两个字段包含标准点分十进制表示的 IP 地址/掩码值。(IP 地址只能以数值形式指定,不能用域名或主机名。)二者合起来指定此记录匹配的客户端机器 IP 地址。精确的逻辑是
(actual-IP-addressxorIP-address-field) andIP-mask-field
必须为零,记录才匹配。(当然,IP 地址可以伪造,但这一考虑超出了 PostgreSQL 的范围。)
这些字段只适用于 host 和 hostssl 记录。
authentication-method指定当连接匹配此记录时所使用的认证方法。可选方法在此概述, 细节见 第 6.2 节。
trust无条件地允许连接。此方法允许任何能连接到 PostgreSQL 数据库的人以 他们希望的任何 PostgreSQL 用户身份登录,无需 密码。详见 第 6.2.1 节。
reject无条件地拒绝连接。这有助于从一组主机中“过滤掉”某些主机。
md5要求客户端提供经 MD5 加密的密码进行认证。这是唯一允许把加密密码存储在 pg_shadow 中的方法。 详见 第 6.2.2 节。
crypt类似于 md5 方法,但使用较旧的 crypt 加密,pre-7.2 客户端需要它。对于 7.2 及以后的客户端,首选 md5。 详见 第 6.2.2 节。
password与 "md5" 相同,但密码以明文形式在网络上发送。不应在不可信网络上使用 此方法。详见 第 6.2.2 节。
krb4使用 Kerberos V4 认证用户。这只适用于 TCP/IP 连接。详见 第 6.2.3 节。
krb5使用 Kerberos V5 认证用户。这只适用于 TCP/IP 连接。详见 第 6.2.3 节。
ident获取客户端的操作系统用户名(对 TCP/IP 连接,通过联系客户端上的 ident 服务器获取;对本地 连接,从操作系统获取),并通过查询 ident 关键字之后指定的映射,检查该用户是否被允许以请求的数据库用户身份连接。
如果使用映射 sameuser,则假定用户名相同。否则,会在与 pg_hba.conf 位于同一目录的文件 pg_ident.conf 中查找映射名。如果该文件中包含此映射名下 ident 提供的用户名与所请求的 PostgreSQL 用户名的一条条目,则接受连接。
对本地连接,这只在支持 Unix 域套接字凭据的机器上有效(目前有 Linux、FreeBSD、NetBSD 和 BSD/OS)。
详细信息见下面的 第 6.2.4 节。
pam使用操作系统提供的可插拔认证模块(PAM)服务进行认证。详见 第 6.2.5 节。
authentication-option这个可选字段的含义取决于所选的认证方法,将在下一节中描述。
由于对每次连接尝试都是顺序检查 pg_hba.conf 记录,记录的顺序是重要的。通常,靠前的记录有较紧的连接匹配参数和较弱的认证方法,而靠后的记录有较松的匹配参数和较强的认证方法。例如,你可能希望对本地 TCP/IP 连接使用 trust 认证,但对远程 TCP 连接要求密码。这种情况下,为来自 127.0.0.1 的连接指定 trust 认证的记录应当出现在为更宽的允许客户端 IP 地址范围指定密码认证的记录之前。
不要阻止超级用户访问 template1 数据库。各种工具命令需要访问 template1。
pg_hba.conf 文件在启动时以及 postmaster 收到 SIGHUP 信号时读取。如果在运行的系统上编辑了该文件,你需要(使用 pg_ctl reload 或 kill -HUP)向 postmaster 发信号,让它重新读取该文件。
一个 pg_hba.conf 文件的例子见 例 6.1。各种认证方法的细节见下文。
例 6.1. 一个 pg_hba.conf 文件示例
# Allow any user on the local system to connect to any database under # any user name using Unix-domain sockets (the default for local # connections). # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD local all all trust # The same using local loopback TCP/IP connections. # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host all all 127.0.0.1 255.255.255.255 trust # Allow any user from any host with IP address 192.168.93.x to connect # to database "template1" as the same user name that ident reports for # the connection (typically the Unix user name). # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host template1 all 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 is correctly supplied. # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host template1 all 192.168.12.10 255.255.255.255 md5 # In the absence of preceding "host" lines, these two lines will # reject all connection from 192.168.54.1 (since that entry will be # matched first), but allow Kerberos V 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. # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host all all 192.168.54.1 255.255.255.255 reject host all 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". # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host all all 192.168.0.0 255.255.0.0 ident omicron # If these are the only three lines for local connections, they will # allow local users to connect only to their own databases (databases # with the same name as their user name) except for administrators and # members of group "support" who may connect to all databases. The file # $PGDATA/admins contains a list of user names. Passwords are required in # all cases. # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD local sameuser all md5 local all @admins md5 local all +support md5 # The last two lines above can be combined into a single line: local all @admins,+support md5 # The database column can also use lists and file names, but not groups: local db1,db2,@demodbs all md5
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。