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

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

第 4 章 客户端认证

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

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

PostgreSQL 提供了多种不同的客户端认证方法。可以使用的方法可以根据(客户端)主机和数据库来选择;某些认证方法还允许你按用户名加以限制。

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

4.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 authentication-method [ authentication-option ]
host    database IP-address IP-mask authentication-method [ authentication-option ]
hostssl database IP-address IP-mask authentication-method [ authentication-option ]
    

各字段的含义如下:

local

该记录针对经由 Unix domain 套接字的连接尝试。

host

该记录针对经由 TCP/IP 网络的连接尝试。注意,除非服务器启动时带了 -i 开关或设置了等效的配置参数,否则 TCP/IP 连接被完全禁用。

hostssl

该记录针对在 TCP/IP 上使用 SSL 的连接尝试。要使用此选项,服务器编译时必须带有 SSL 支持启用。此外,服务器启动时必须用 -l 选项或等效的配置设置启用 SSL。(注意:host 记录既匹配 SSL 连接尝试也匹配非 SSL 连接尝试,但 hostssl 记录只匹配 SSL 连接。)

database

指定此记录适用的数据库。值 all 表示适用于所有数据库,而值 sameuser 标识与连接用户同名的那个数据库。否则,这就是某个具体 PostgreSQL 数据库的名称。

IP address
IP mask

这两个字段根据客户端机器的 IP 地址指定一条 host 或 hostssl 记录适用于哪些客户端机器。(当然,IP 地址可以伪造,但这一考虑超出了 PostgreSQL 的范围。)精确的逻辑是

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

必须为零,记录才匹配。

authentication method

指定用户在这条认证记录的控制下连接时必须用来认证自身的方法。可选方法在此概述,细节见 第 4.2 节。

trust

无条件地允许连接。此方法允许任何对客户端主机有登录访问权限的用户以任何 PostgreSQL 用户身份连接。

reject

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

password

要求客户端提供一个密码,该密码须与为该用户设置的数据库密码匹配。

可以在 password 关键字之后指定一个可选的文件名。该文件应包含可以使用此记录连接的用户列表,还可以可选地包含他们的备用密码。

密码以明文形式在线路上发送。为了更好的保护,请使用 md5 或 crypt 方法。

md5

类似于 password 方法,但密码使用一个简单的质询-应答协议加密后在线路上发送。这可以防范偶然的线路嗅探。现在这是基于密码的认证的推荐选择。

md5 关键字后面可以跟一个文件名。该文件包含可以使用此记录连接的用户列表。

crypt

类似于 md5 方法,但使用较旧的 crypt 加密,pre-7.2 客户端需要它。对于 7.2 及以后的客户端,首选 md5。crypt 方法与在 pg_shadow 中加密密码不兼容,而且在客户端和服务器机器的 crypt() 库例程实现不同时可能失败。

krb4

使用 Kerberos V4 认证用户。这只适用于 TCP/IP 连接。

krb5

使用 Kerberos V5 认证用户。这只适用于 TCP/IP 连接。

ident

用户在登录操作系统时确定的身份被 PostgreSQL 用来确定该用户是否被允许以请求的数据库用户身份连接。对 TCP/IP 连接,用户的身份通过联系客户端主机上的 ident 服务器来确定。(注意,这只有在远程 ident 服务器可靠时才可靠;对管理员不可信的远程主机绝不应使用 ident 认证。)在支持对 Unix domain 套接字的 SO_PEERCRED 请求的操作系统上,本地连接也可以进行 ident 认证;此时会向系统询问连接用户的身份。

在不支持 SO_PEERCRED 请求的系统上,ident 认证只适用于 TCP/IP 连接。作为一种变通办法,可以指定 localhost 地址 127.0.0.1 并连接到该地址。

跟在 ident 关键字后面的 authentication option 指定一个ident 映射的名称,该映射指定哪些操作系统用户等同于哪些数据库用户。细节见下文。

pam

这种认证类型的工作方式与 password 类似,主要区别是它使用 PAM(可插拔认证模块)作为认证机制。跟在 pam 关键字后面的 authentication option 指定要传递给 PAM 的服务名。默认服务名为 postgresql。关于 PAM 的更多信息,请阅读 Linux-PAM 页面 和/或 Solaris PAM 页面。

authentication option

此字段的解释因认证方法而异,如上所述。

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

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

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

例 4.1. 一个 pg_hba.conf 文件示例

# TYPE       DATABASE    IP_ADDRESS    MASK               AUTHTYPE  MAP

# Allow any user on the local system to connect to any
# database under any username, but only via an IP connection:

host         all         127.0.0.1     255.255.255.255    trust     

# The same, over Unix-socket connections:

local        all                                          trust

# Allow any user from any host with IP address 192.168.93.x to
# connect to database "template1" as the same username that ident on that
# host identifies him as (typically his Unix username):

host         template1   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 in pg_shadow is correctly supplied:

host         template1   192.168.12.10 255.255.255.255    md5

# In the absence of preceding "host" lines, these two lines will reject
# all connection attempts from 192.168.54.1 (since that entry will be
# matched first), but allow Kerberos V5-validated 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:

host         all        192.168.54.1   255.255.255.255    reject
host         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":

host         all        192.168.0.0    255.255.0.0        ident     omicron

# If these are the only two lines for local connections, they will allow
# local users to connect only to their own databases (database named the
# same as the user name), except for administrators who may connect to
# all databases.  The file $PGDATA/admins lists the user names who are
# permitted to connect to all databases.  Passwords are required in all
# cases.  (If you prefer to use ident authorization, an ident map can
# serve a parallel purpose to the password list file used here.)

local        sameuser                                     md5
local        all                                          md5  admins


提交更正

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