↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本PostgreSQL 7.4 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

第 19 章 客户端认证

当客户端应用连接到数据库服务器时,它会指定要以哪个 PostgreSQL 数据库用户名连接,这很像以某个特定用户身份登录 Unix 计算机。在 SQL 环境中,当前活动的数据库用户名决定了对数据库对象的访问权限——详见 第 17 章。因此,必须限制哪些数据库用户能够连接。

认证是数据库服务器确认客户端身份的过程,并据此决定是否允许该客户端应用(或者运行该客户端应用的用户)以请求的数据库用户名进行连接。

PostgreSQL 提供了多种不同的客户端认证方法。用于认证特定客户端连接的方法可以根据(客户端)主机地址、数据库和用户来选择。

PostgreSQL 数据库用户名在逻辑上独立于服务器所在操作系统中的用户名。如果某台服务器的所有用户在该机器上也都有账号,那么为他们分配与操作系统用户名一致的数据库用户名是有意义的。不过,接受远程连接的服务器可能有许多数据库用户并没有本地操作系统账号,在这种情况下,数据库用户名与操作系统用户名之间就不必存在任何对应关系。

19.1. 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 地址范围(如果该连接类型需要)、一个数据库名、一个用户名,以及对匹配这些参数的连接要使用的认证方法。第一条同时匹配连接类型、客户端地址、请求数据库和用户名的记录会被用来执行认证。这里不存在“继续向后匹配”或“后备”机制:如果选中某条记录而认证失败,就不会再考虑后续记录。如果没有任何记录匹配,则拒绝访问。

记录可以采用以下七种格式之一

local      database  user  authentication-method  [authentication-option]
host       database  user  IP-address  IP-mask  authentication-method  [authentication-option]
hostssl    database  user  IP-address  IP-mask  authentication-method  [authentication-option]
hostnossl  database  user  IP-address  IP-mask  authentication-method  [authentication-option]
host       database  user  IP-address/IP-masklen  authentication-method  [authentication-option]
hostssl    database  user  IP-address/IP-masklen  authentication-method  [authentication-option]
hostnossl  database  user  IP-address/IP-masklen  authentication-method  [authentication-option]

各字段的含义如下:

local

该记录匹配使用 Unix 域套接字的连接尝试。没有这种类型的 记录时,Unix 域套接字连接将被禁止。

host

该记录匹配使用 TCP/IP 网络进行的连接尝试。注意,除非服务器启动时带了 -i 选项,或者启用了 tcpip_socket 配置参数,否则 TCP/IP 连接是被禁用的。

hostssl

该记录匹配使用 TCP/IP 上的 SSL 进行的连接尝试。 host 记录既匹配 SSL 连接尝试,也匹配非 SSL 连接尝试,但 hostssl 记录要求 SSL 连接。

要使用此选项,服务器编译时必须带有 SSL 支持启用。此外,还必须通过启用 ssl 配置参数来启用 SSL(更多信息参见 第 16.4 节)。

hostnossl

这种记录类型与 hostssl 类似,但逻辑相反:它只匹配不使用 SSL 的常规连接尝试。

database

指定此记录匹配哪些数据库。值 all 表示匹配所有数据库。值 sameuser 表示当请求的数据库与请求的用户 同名时记录匹配。值 samegroup 表示请求的用户必须是与请求数据库 同名的组的成员。否则,这就是某个具体 PostgreSQL 数据库的名称。 多个数据库名可以用逗号分隔提供。还可以在文件名前加 @ 来指定一个包含数据库名的文件。该文件必须与 pg_hba.conf 位于同一目录中。

user

指定此记录匹配哪些 PostgreSQL 用户。值 all 表示匹配所有用户。否则,这就是某个具体 PostgreSQL 用户的名称。多个用户名可以用逗号分隔提供。组名可以在组名前加 + 来指定。还可以在文件名前加 @ 来指定一个包含用户名的文件。该文件必须与 pg_hba.conf 位于同一目录中。

IP-address
IP-mask

这两个字段包含标准点分十进制表示的 IP 地址和掩码值。(IP 地址只能以数值形式指定,不能用域名或主机名。)二者合起来指定此记录匹配的客户端机器 IP 地址。精确的逻辑是

(actual-IP-address xor IP-address-field) and IP-mask-field

必须为零,记录才匹配。

以 IPv4 格式给出的 IP 地址会匹配具有相应地址的 IPv6 连接, 例如 127.0.0.1 会匹配 IPv6 地址 ::ffff:127.0.0.1。以 IPv6 格式给出的条目只匹配 IPv6 连接,即使所表示的地址位于 IPv4-in-IPv6 范围内也是如此。注意,如果系统的 C 库不支持 IPv6 地址,以 IPv6 格式给出的条目将被拒绝。

这些字段只适用于 host、 hostssl 和 hostnossl 记录。

IP-masklen

此字段可用作 IP-mask 表示法的替代。它是一个整数,指定掩码中要置位的高位位数。 该数字必须在 0 到 32(IPv4 地址的情形)或 128(IPv6 地址的情形)之间(含)。0 匹配任何地址,而 32(或相应的 128)只匹配指定的那个确切主机。使用的匹配逻辑与点分表示法的 IP-mask 相同。

IP-address 与 / 之间以及 / 与 IP-masklen 之间不能有任何空白,否则文件将不能被正确解析。

此字段只适用于 host、 hostssl 和 hostnossl 记录。

authentication-method

指定当连接匹配此记录时所使用的认证方法。可选方法在此概述, 细节见 第 19.2 节。

trust

无条件地允许连接。此方法允许任何能连接到 PostgreSQL 数据库服务器的人以 他们希望的任何 PostgreSQL 用户身份登录,无需 密码。详见 第 19.2.1 节。

reject

无条件地拒绝连接。这有助于从一组主机中“过滤掉”某些主机。

md5

要求客户端提供经 MD5 加密的密码进行认证。这是唯一允许把加密密码存储在 pg_shadow 中的方法。 详见 第 19.2.2 节。

crypt

类似于 md5 方法,但使用较旧的 crypt() 加密,pre-7.2 客户端需要它。对于 7.2 及以后的客户端,首选 md5。 详见 第 19.2.2 节。

password

与 md5 相同,但密码以明文形式在网络上发送。不应在不可信网络上使用 此方法。详见 第 19.2.2 节。

krb4

使用 Kerberos V4 认证用户。这只适用于 TCP/IP 连接。详见 第 19.2.3 节。

krb5

使用 Kerberos V5 认证用户。这只适用于 TCP/IP 连接。详见 第 19.2.3 节。

ident

获取客户端的操作系统用户名(对 TCP/IP 连接,通过联系客户端上的 ident 服务器获取;对本地 连接,从操作系统获取),并通过查询 ident 关键字之后指定的映射,检查该用户是否被允许以请求的数据库用户身份连接。

如果使用映射 sameuser,则要求用户名相同。否则,会在与 pg_hba.conf 位于同一目录的文件 pg_ident.conf 中查找映射名。如果该文件中包含此映射名下操作系统用户名与所请求的 PostgreSQL 用户名的一条条目,则接受连接。

对本地连接,这只在支持 Unix 域套接字凭据的机器上有效(目前有 Linux、FreeBSD、NetBSD、 OpenBSD 和 BSD/OS)。

详细信息见下面的 第 19.2.4 节。

pam

使用操作系统提供的可插拔认证模块(PAM)服务进行认证。详见 第 19.2.5 节。

authentication-option

这个可选字段的含义取决于所选的认证方法,将在下一节中描述。

由于对每次连接尝试都是顺序检查 pg_hba.conf 记录,记录的顺序是重要的。通常,靠前的记录有较紧的连接匹配参数和较弱的认证方法,而靠后的记录有较松的匹配参数和较强的认证方法。例如,你可能希望对本地 TCP/IP 连接使用 trust 认证,但对远程 TCP/IP 连接要求密码。这种情况下,为来自 127.0.0.1 的连接指定 trust 认证的记录应当出现在为更宽的允许客户端 IP 地址范围指定密码认证的记录之前。

重要

不要阻止超级用户访问 template1 数据库。各种工具命令需要访问 template1。

pg_hba.conf 文件在启动时以及主服务器进程(postmaster)收到 SIGHUP 信号时读取。如果在运行的系统上编辑了该文件,你需要(使用 pg_ctl reload 或 kill -HUP)向 postmaster 发信号,让它重新读取该文件。

一个 pg_hba.conf 文件的例子见 例 19.1。各种认证方法的细节见下一节。

例 19.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     

# The same as the last line but using a CIDR mask
#
# TYPE  DATABASE    USER        IP-ADDRESS/CIDR-mask  METHOD
host    all         all         127.0.0.1/32          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

# The same as the last line but using a CIDR mask
#
# TYPE  DATABASE    USER        IP-ADDRESS/CIDR-mask  METHOD
host    template1   all         192.168.93.0/24       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 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。