选择 打开 改范围 完整检索页

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
历史版本PostgreSQL 9.0 已于 2015 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

第 19 章 客户端认证

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

注意

第 20 章 中所述,PostgreSQL 实际上是以 角色 为单位进行权限管理的。在本章中,我们统一使用 数据库用户 来表示 拥有 LOGIN 权限的角色

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

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

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

19.1. The pg_hba.conf file #

客户端认证由一个配置文件控制,该文件按惯例命名为 pg_hba.conf,并存放在数据库集簇的数据目录中。 (HBA 代表 host-based authentication,即基于主机的认证。) 当数据目录由 initdb 初始化时,会安装一个默认的 pg_hba.conf 文件。不过,也可以把认证配置文件放在别处; 请参见配置参数 hba_file

pg_hba.conf 文件的基本格式是一组记录,每行 一条。空行会被忽略,# 注释字符之后的文本同样 如此。记录不能跨行续写。每条记录由若干字段组成,字段之间用 空格和/或制表符分隔。如果字段值用引号括起来,就可以包含空白。 把数据库或用户名字段中的某个关键字(例如 allreplication)用引号括起来,会使该词失去特殊 含义,只匹配同名的数据库或用户。

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

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

local      database  user  auth-method  [auth-options]
host       database  user  CIDR-address  auth-method  [auth-options]
hostssl    database  user  CIDR-address  auth-method  [auth-options]
hostnossl  database  user  CIDR-address  auth-method  [auth-options]
host       database  user  IP-address  IP-mask  auth-method  [auth-options]
hostssl    database  user  IP-address  IP-mask  auth-method  [auth-options]
hostnossl  database  user  IP-address  IP-mask  auth-method  [auth-options]

各字段的含义如下:

local

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

host

该记录匹配使用 TCP/IP 进行的连接尝试。 host 记录既匹配 SSL 加密连接尝试,也匹配非 SSL 连接尝试。

注意

除非服务器启动时为配置参数 listen_addresses 设置了恰当的值,否则 无法进行远程 TCP/IP 连接,因为默认行为是只在本地环回地址 localhost 上监听 TCP/IP 连接。

hostssl

该记录匹配使用 TCP/IP 进行的连接尝试,但仅当连接使用 SSL 加密时才匹配。

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

hostnossl

这种记录类型的行为与 hostssl 相反:它只匹配通过 TCP/IP 进行的、不使用 SSL 的连接尝试。

database

指定此记录匹配哪些数据库名。值 all 表示匹配所有数据库。值 sameuser 表示当请求的数据库与请求的用户 同名时记录匹配。值 samerole 表示请求的用户必须是与请求数据库 同名的角色的成员。( samegroupsamerole 已过时但仍被接受的拼法。)值 replication 表示当请求复制连接时记录匹配 (注意,复制连接不指定任何特定数据库)。否则,这就是某个 具体 PostgreSQL 数据库的名称。 多个数据库名可以用逗号分隔提供。还可以在文件名前加 @ 来指定一个包含数据库名的单独文件。

user

指定此记录匹配哪些数据库用户名。值 all 表示匹配所有用户。否则,它是某个具体 数据库用户的名称,或以 + 开头的组名。(回想一下, PostgreSQL 中用户和组之间没有真正的区别; + 标记的实际含义是 匹配直接或间接属于该成员的任何角色,而不带 + 标记的名称只匹配那个特定角色。)多个 用户名可以用逗号分隔提供。还可以在文件名前加 @ 来指定一个包含用户名的单独文件。

CIDR-address

指定此记录匹配的客户端机器 IP 地址范围。此字段包含一个标准 点分十进制表示的 IP 地址和一个 CIDR 掩码长度。(IP 地址只能以数值形式 指定,不能用域名或主机名。)掩码长度指示客户端 IP 地址中 必须匹配的高位位数。给定 IP 地址中此位之后的位必须为零。 IP 地址、/ 与 CIDR 掩码长度之间不能有 任何空白。

除了 CIDR-address 之外,还可以写 samehost 来匹配服务器自身的任何 IP 地址, 或写 samenet 来匹配服务器直连的任何子网中的 任何地址。

CIDR-address 的典型示例有:单个主机 用 172.20.143.89/32,小型网络用 172.20.143.0/24,较大网络用 10.6.0.0/160.0.0.0/0全零)表示所有 地址。要指定单个主机,IPv4 使用 CIDR 掩码 32,IPv6 使用 128。 在网络地址中,不要省略末尾的零。

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

此字段只适用于 hosthostsslhostnossl 记录。

IP-address
IP-mask

这些字段可用作 CIDR-address 表示法的替代。此时指定 的不是掩码长度,而是在单独一列中指定实际的掩码。例如, 255.0.0.0 表示 IPv4 CIDR 掩码长度 8, 255.255.255.255 表示 CIDR 掩码长度 32。

这些字段只适用于 hosthostsslhostnossl 记录。

auth-method

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

trust

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

reject

无条件地拒绝连接。这有助于从一组主机中 过滤掉某些主机,例如, reject 行可以阻止某个特定主机连接, 而靠后的行允许特定网络中的其余主机连接。

md5

要求客户端提供经 MD5 加密的密码进行认证。 详见 第 19.3.2 节

password

要求客户端提供未加密的密码进行认证。 由于密码以明文形式在网络上发送,不应在不可信网络上使用 此方法。详见 第 19.3.2 节

gss

使用 GSSAPI 认证用户。这只适用于 TCP/IP 连接。详见 第 19.3.3 节

sspi

使用 SSPI 认证用户。这只在 Windows 上可用。详见 第 19.3.4 节

krb5

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

ident

获取客户端的操作系统用户名(对 TCP/IP 连接,通过联系客户端上的 ident 服务器获取;对本地 连接,从操作系统获取),并检查它是否与请求的数据库用户名 匹配。详见 第 19.3.6 节

ldap

使用 LDAP 服务器进行认证。详见 第 19.3.7 节

radius

使用 RADIUS 服务器进行认证。详见 第 19.3.8 节

cert

使用 SSL 客户端证书进行认证。详见 第 19.3.9 节

pam

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

auth-options

auth-method 字段之后,还可以有 形如 name=value 的字段,为认证方法指定选项。哪些认证方法可使用哪些选项的 细节见下文。

@ 构造引用的文件会被读取为名称列表,其中的名称可以用空白或逗号分隔。注释仍然用 # 引入,与 pg_hba.conf 中相同,并且允许嵌套的 @ 构造。除非 @ 后面的文件名是绝对路径,否则它会被视为相对于引用它的文件所在目录。

由于每次连接尝试都会按顺序检查 pg_hba.conf 记录,因此记录的顺序很重要。通常,靠前的记录使用较严格的连接匹配条件和较弱的认证方法,靠后的记录使用较宽松的匹配条件和较强的认证方法。例如,可能希望对本地 TCP/IP 连接使用 trust 认证,而要求远程 TCP/IP 连接提供密码。此时,为来自 127.0.0.1 的连接指定 trust 认证的记录,应放在为更大范围的允许客户端 IP 地址指定密码认证的记录之前。

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

提示

要连接到一个特定数据库,一个用户必须不仅要通过pg_hba.conf检查,还必须要有该数据库上的CONNECT权限。如果你希望限制哪些用户能够连接到哪些数据库,授予/撤销CONNECT权限通常比在pg_hba.conf项中设置规则简单。

例 19.1 展示了一些 pg_hba.conf 条目示例。有关不同认证方法的详细信息,参见下一节。

例 19.1. Example pg_hba.conf entries

# Allow any user on the local system to connect to any database with
# any database user name using Unix-domain sockets (the default for local
# connections).
#
# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
local   all             all                                     trust

# The same using local loopback TCP/IP connections.
#
# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
host    all             all             127.0.0.1/32            trust

# The same as the previous line, but using a separate netmask column
#
# 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 "postgres" as the same user name that ident reports for
# the connection (typically the operating system user name).
#
# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
host    postgres        all             192.168.93.0/24         ident

# Allow any user from host 192.168.12.10 to connect to database
# "postgres" if the user's password is correctly supplied.
#
# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
host    postgres        all             192.168.12.10/32        md5

# In the absence of preceding "host" lines, these two lines will
# reject all connections from 192.168.54.1 (since that entry will be
# matched first), but allow Kerberos 5 connections from anywhere else
# on the Internet.  The zero mask causes no bits of the host IP
# address to be considered, so it matches any host.
#
# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
host    all             all             192.168.54.1/32         reject
host    all             all             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            CIDR-ADDRESS            METHOD
host    all             all             192.168.0.0/16          ident map=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 database user name) except for administrators
# and members of role "support", who can connect to all databases.  The file
# $PGDATA/admins contains a list of names of administrators.  Passwords
# are required in all cases.
#
# TYPE  DATABASE        USER            CIDR-ADDRESS            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:
local   db1,db2,@demodbs  all                                   md5

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。