↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 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 8.0 已结束支持。 请参阅 当前版本手册.

第 19 章 客户端认证

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

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

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

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

19.1. pg_hba.conf 文件 #

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

pg_hba.conf 文件的基本格式是一组记录,每行一条。空行会被忽略,# 注释字符之后的文本同样如此。记录不能跨行续写。每条记录由若干字段组成,字段之间用空格和/或制表符分隔。如果字段值用引号括起来,就可以包含空白。

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

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

local      database  user  authentication-method  [authentication-option]
host       database  user  CIDR-address  authentication-method  [authentication-option]
hostssl    database  user  CIDR-address  authentication-method  [authentication-option]
hostnossl  database  user  CIDR-address  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]

各字段的含义如下:

local

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

host

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

注意

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

hostssl

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

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

hostnossl

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

database

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

user

指定此记录匹配哪些 PostgreSQL 用户。值 all 表示匹配所有用户。否则,这就是某个具体 PostgreSQL 用户的名称。多个用户名可以用逗号分隔提供。组名可以通过在组名前加 + 来指定。还可以在文件名前加 @ 来指定一个包含用户名的文件。

CIDR-address

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

一个典型的 CIDR-address 是单个主机用 172.20.143.89/32,或者一个网络用 172.20.143.0/24。要指定单个主机,IPv4 使用 CIDR 掩码 32,IPv6 使用 128。

以 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-address
IP-mask

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

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

authentication-method

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

trust

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

reject

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

md5

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

crypt

要求客户端提供经crypt()加密的密码进行认证。对于 7.2 及更高版本的客户端,md5是首选,但 7.2 之前的客户端只支持crypt。详见第 19.2.2 节。

password

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

krb4

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

krb5

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

ident

获取客户端的操作系统用户名(对 TCP/IP 连接,通过联系客户端上的 ident 服务器获取;对本地连接,从操作系统获取),并使用跟在ident关键词后面的映射所指定的映射,检查该用户是否被允许以其请求的数据库用户身份连接。详见第 19.2.4 节。

pam

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

authentication-option

这个可选字段的含义取决于所选的认证方法。细节见下文。

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

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

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

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

例 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        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 last 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 "template1" as the same user name that ident reports for
# the connection (typically the Unix user name).
# 
# TYPE  DATABASE    USER        CIDR-ADDRESS          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        CIDR-ADDRESS          METHOD
host    template1   all         192.168.12.10/32      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 5 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        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 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        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, but not groups:
local   db1,db2,@demodbs  all                         md5

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.