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

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 7.3 已结束支持。 请参阅 当前版本手册.

第 6 章 客户端认证

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

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

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

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

6.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]
    

各字段的含义如下:

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

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

(actual-IP-address xor IP-address-field) and IP-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

报告文档问题

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