Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

20.1. pg_hba.conf 文件 #

客户端身份验证受配置文件控制,该文件传统上名为 pg_hba.conf,并存储在数据库群集的数据目录中。(HBA表示基于主机的身份验证。)当使用 initdb 初始化数据目录时,会安装默认的 pg_hba.conf 文件。不过,身份验证配置文件也可以放在其他位置;请参阅 hba_file 配置参数。

在启动时以及主服务器进程接收到 SIGHUP 信号时,会读取 pg_hba.conf 文件。如果你在一个活动的系统上编辑这个文件,你需要给发布者(使用 pg_ctl reload,调用 SQL 函数 pg_reload_conf() 或使用 kill -HUP)发送信号,以使它重新读取文件。

注意

以上说法在 Microsoft Windows 上不成立:在此,pg_hba.conf 文件中的任何变更都会立即应用于后续的新连接。

系统视图 pg_hba_file_rules 对于预先测试 pg_hba.conf 文件的变更或在加载文件后未得到预期效果时诊断问题很有帮助。视图中拥有非空 error 字段的行表示文件中相应行中存在问题。

pg_hba.conf 文件的常规格式是一组记录,每行一个。空白行被忽略,# 注释字符之后的任何文本也是如此。通过使用反斜杠结束一行,该记录可以继续到下一行。(反斜杠除用于行尾外,没有其他特殊用途。)记录由用空格和/或制表符分隔的若干个字段组成。如果字段值带双引号,字段可以包含空格。在数据库、用户或地址字段(例如,allreplication)中引用一个关键词会让该词语失去其特殊含义,而仅与拥有相同名称的数据库、用户或主机匹配。即使在带引号的文本或注释中,反斜杠换行继续也适用。

每个验证记录指定一个连接类型、客户端 IP 地址范围(如果适用于连接类型)、一个数据库名称、一个用户名以及要用于匹配这些参数的连接的验证方式。第一个与匹配连接类型、客户端地址、请求的数据库和用户名相匹配的记录用于执行验证。不存在 继承备用:如果选择了一条记录并且验证失败,则不会考虑后续记录。如果找不到匹配的记录,则拒绝访问。

每个记录可以是 include 指令或验证记录。include 指令指定要包括的文件,其中包含其他记录。这些记录将代替 include 指令插入。include 指令仅包含两个字段:includeinclude_if_existsinclude_dir 指令和要包含的文件或目录。该文件或目录可以是相对路径或绝对路径,并且可以加双引号引用。对于 include_dir 表单,将包括所有不以 . 开头且以 .conf 结尾的文件。include 目录中的多个文件将按文件名顺序处理(根据 C 地区规则,即数字在字母之前,大写字母在小写字母之前)。

一条记录可以有若干种格式

local               database  user  auth-method [auth-options]
host                database  user  address     auth-method  [auth-options]
hostssl             database  user  address     auth-method  [auth-options]
hostnossl           database  user  address     auth-method  [auth-options]
hostgssenc          database  user  address     auth-method  [auth-options]
hostnogssenc        database  user  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]
hostgssenc          database  user  IP-address  IP-mask      auth-method  [auth-options]
hostnogssenc        database  user  IP-address  IP-mask      auth-method  [auth-options]
include             file
include_if_exists   file
include_dir         directory

字段的含义如下

local

此记录匹配使用 Unix 域套接字进行的连接尝试。如果没有此类型的记录,则不允许进行 Unix 域套接字连接。

host

此记录匹配使用 TCP/IP 进行的连接尝试。SSL或非SSL连接尝试以及GSSAPI加密或非GSSAPI加密的连接尝试。

注意

除非使用适当的 listen_addresses 配置参数值启动服务器,否则将无法进行远程 TCP/IP 连接,因为默认行为只侦听本地回环地址 localhost 上的 TCP/IP 连接。

hostssl

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

进行连接时。要使用此选项,服务器必须使用SSL支持构建。此外,SSL必须通过设置 ssl 配置参数来启用(有关更多信息,请参见 第 18.9 节)。否则,hostssl 记录(除了记录一条无法匹配任何连接的警告以外)将被忽略。

hostnossl

此记录类型具有与 hostssl 相反的行为;它只匹配未使用SSL.

hostgssenc

此记录匹配使用 TCP/IP 进行的连接尝试,但仅当使用GSSAPI加密

进行连接时。要使用此选项,服务器必须使用GSSAPI支持的 TCP/IP 上进行的连接尝试。否则,hostgssenc 记录(除了记录一条无法匹配任何连接的警告以外)将被忽略。

hostnogssenc

此记录类型的行为与 hostgssenc 相反;它仅与通过 TCP/IP 建立的、不使用GSSAPI加密

数据库

在此,指定此记录将与哪个数据库名称匹配。值 all 指出它将与所有数据库匹配。值 sameuser 指出如果请求的数据库与请求的用户具有相同的名称,则该记录将进行匹配。值 samerole 指出请求的用户必须是与请求数据库具有相同名称的角色的成员。(samegroupsamerole 的一个过时但仍可接受的拼写。)超级用户不被认为是 samerole 的角色成员,除非它们是该角色的明确成员(直接或间接),而不仅仅是因为自己是超级用户。值 replication 指出:如果请求了物理复制连接,则该记录将进行匹配;但是,它与逻辑复制连接不匹配。请注意,物理复制连接未指定任何特定数据库,而逻辑复制连接则指定它。否则,它是一个特定的 PostgreSQL 数据库或正则表达式的名称。可以通过用逗号分隔多个数据库名称和/或正则表达式来提供它们。

如果数据库名称以斜杠 (/) 开头,则该名称的其余部分将作为正则表达式进行处理。(有关 PostgreSQL 的正则表达式语法的详细信息,请参见 第 9.7.3.1 节。)

包含数据库名称和/或正则表达式的单独文件可以通过在文件名前加上 @ 来指定。

用户

指定此记录匹配的数据库用户名。值 all 指定它匹配所有用户。否则,这可能是特定数据库用户的名称、正则表达式(以斜杠 (/) 开始),或以 + 为前缀的组名。(回想一下,在 PostgreSQL 中用户和组之间没有真正的区别;+ 标记实际上表示 匹配此角色的直接或间接成员的任何角色,而没有 + 标记的名称只匹配特定角色。)出于这个目的,只有当超级用户显式成为角色的直接或间接成员,而不仅仅因为他是超级用户,才会被认为是角色的成员。可以通过用逗号分隔多个用户名和/或正则表达式来提供它们。

如果用户名以斜杠 (/) 开始,则名称的其余部分将被视为正则表达式。(有关 PostgreSQL 的正则表达式语法的详细信息,请参见 第 9.7.3.1 节。)

可以通过在文件名前面加 @ 来指定一个包含用户名和/或正则表达式的单独文件。

address

指定此记录匹配的客户端计算机地址。此字段可以包含主机名、IP 地址范围或下面提到的一个特殊关键字。

IP 地址范围使用范围起始地址的标准数字表示形式指定,然后是一个斜杠 (/) 和一个CIDR掩码长度。掩码长度指示客户端 IP 地址必须匹配的高位比特数。在这个右侧的比特在给定的 IP 地址中应该是零。IP 地址、/ 和 CIDR 掩码长度之间不能有空格。

以这种方式指定的 IPv4 地址范围的典型示例对于单个主机是 172.20.143.89/32,对于小型网络是 172.20.143.0/24,对于较大的网络是 10.6.0.0/16。IPv6 地址范围可能类似于 ::1/128(对于单个主机)(在这种情况下为 IPv6 环回地址)或 fe80::7a31:c1ff:0000:0000/96(对于小型网络)。0.0.0.0/0 表示所有 IPv4 地址,::0/0 表示所有 IPv6 地址。要指定单个主机,请对 IPv4 使用 32 的掩码长度或对 IPv6 使用 128 的掩码长度。在网络地址中,不要省略尾随零。

以 IPv4 格式给出的条目将仅匹配 IPv4 连接,以 IPv6 格式给出的条目将仅匹配 IPv6 连接,即使所表示的地址位于 IPv4 中的 IPv6 范围内。

您还可以写入 all 匹配任何 IP 地址、samehost 匹配服务器自己的任何 IP 地址或 samenet 匹配服务器直接连接到的任何子网中的任何地址。

如果指定了主机名(任何非 IP 地址范围或特殊关键字的内容都将被视为主机名),则该名称将与客户机的 IP 地址的反向名称解析结果(例如,DNS 反向查找,如果使用了 DNS)进行比较。主机名比较不区分大小写。如果匹配,则会在主机名上执行正向名称解析(例如,DNS 正向查找),以检查它解析出的任何地址是否等于客户端的 IP 地址。如果两个方向都匹配,则认为该条目匹配。(pg_hba.conf 中使用的主机名应为客户端的 IP 地址的地址到名称解析返回的主机名,否则该行不会匹配。一些主机名数据库允许将一个 IP 地址与多个主机名关联起来,但操作系统在要求解析 IP 地址时仅会返回一个主机名。)

以句点(.)开头的主机名规范匹配实际主机名的后缀。因此,.example.com 将匹配 foo.example.com(但绝不仅仅匹配 example.com)。

pg_hba.conf 中指定主机名时,您应确保名称解析是足够快的。设置本地名称解析缓存(如 nscd)可能很有利。此外,您可能希望启用配置参数 log_hostname,以便在日志中看到客户端的主机名,而不是其 IP 地址。

这些字段不适用于 local 记录。

注意

有时,用户想知道为什么主机名以这种看似复杂的方式处理,包括针对客户端 IP 地址的反向查找的两个名称解析。如果客户端的反向 DNS 条目未设置或产生一些不希望的主机名,这将使该功能的应用变得复杂。这样做主要是出于效率的考虑:这样,连接尝试最多只需要两次解析器查找,一次反向查找,一次正向查找。如果某个地址存在解析器问题,则该问题只属于该客户端。一种仅进行正向查找的假设替代实现必须在每次连接尝试中解析 pg_hba.conf 中提到的每个主机名。如果列出了许多名称,那可能会非常慢。并且,如果与其中一个主机名存在解析器问题,则该问题将是所有用户的问题。

此外,要实现后缀匹配功能,反向查找也是必需的,因为需要知道实际客户端主机名才能根据模式对其进行匹配。

请注意,这种行为与其他流行的主机名访问控制实现(如 Apache HTTP 服务器和 TCP Wrappers)保持一致。

IP 地址
IP 掩码

这两个字段可用作 IP 地址/掩码长度 表示法的替代。该过程不是指定掩码长度,而是通过一个单独的列来指定实际掩码。例如,255.0.0.0 表示长度为 8 的 IPv4 CIDR 掩码,255.255.255.255 表示长度为 32 的 CIDR 掩码。

这些字段不适用于 local 记录。

身份验证方法

指定该记录匹配某个连接时所使用的身份验证方法。可能的选项在此总结;详情请参见 第 20.3 节。所有选项都是小写并区分大小写,因此即使像 ldap 这样的首字母缩略词也必须指定为小写。

信任

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

拒绝

无条件地拒绝连接。这可用于除去某个组中的特定主机,例如,reject 行可阻止特定主机连接,而后续行可允许某个特定网络中的剩余主机连接。

scram-sha-256

执行 SCRAM-SHA-256 身份验证来验证用户的密码。详情请参见 第 20.5 节

md5

执行 SCRAM-SHA-256 或 MD5 身份验证来验证用户的密码。详情请参见 第 20.5 节

密码

要求客户端提供未加密的密码进行身份验证。鉴于密码是通过网络以明文发送的,因此这不应在不受信任的网络上使用。详情请参见 第 20.5 节

gss

使用 GSSAPI 对用户进行身份验证。此方法仅适用于 TCP/IP 连接。有关详情,请参见第 20.6 节,可以使用 GSSAPI 加密方法来配合使用此方法。

sspi

使用 SSPI 对用户进行身份验证。此方法仅适用于 Windows。有关详情,请参见第 20.7 节

ident

通过连接客户端上的 Ident 服务器获取客户端的操作系统用户名,然后检查其是否与所请求的数据库用户名匹配。Ident 身份验证仅可用于 TCP/IP 连接。如果在本地连接中指定此方法,将会改用对等方身份验证方法。有关详情,请参见第 20.8 节

peer

从操作系统获取客户端的操作系统用户名,然后检查其是否与所请求的数据库用户名匹配。此方法仅适用于本地连接。有关详情,请参见第 20.9 节

ldap

使用LDAP服务器进行身份验证。有关详情,请参见第 20.10 节

radius

使用 RADIUS 服务器进行身份验证。有关详情,请参见第 20.11 节

cert

使用 SSL 客户端证书进行身份验证。有关详情,请参见第 20.12 节

pam

使用操作系统提供的可插拔身份验证模块 (PAM) 服务进行身份验证。有关详情,请参见第 20.13 节

bsd

使用操作系统提供的 BSD Identity Services 身份验证服务进行身份验证。有关详情,请参见第 20.14 节

auth-options

auth-method字段之后,可以有name=value形式的字段来指定身份验证方法的选项。以下内容介绍了各种身份验证方法的可用选项的详细信息。

除了以下列出的特定于方法的选项之外,还有一个与方法无关的身份验证选项clientcert,可以在任何hostssl记录中指定。此选项可以设置为verify-caverify-full。这两种选项都要求客户端提供有效(受信)SSL 证书,而verify-full还强制要求证书中的cn(公用名)与用户名或适用的映射相匹配。此行为与cert身份验证方法类似(请参见第 20.12 节),但此方法允许将客户端证书的验证与支持hostssl条目的任何身份验证方法配对使用。

对于使用客户端证书验证的所有记录(即,使用 cert 验证方法或使用 clientcert 选项的),您可以指定使用 clientname 选项与之匹配的客户端证书凭据的哪一部分。此选项可以有两个值。如果您指定 clientname=CN,这是默认值,则用户名将与证书的 公用名 (CN) 相匹配。如果您改为指定 clientname=DN,则用户名将与证书的整个 专有名称 (DN) 相匹配。此选项最好与用户名映射结合使用。该比较使用 RFC 2253 格式中的 DN 完成。若要以这种格式看到客户端证书的 DN,请执行

openssl x509 -in myclient.crt -noout -subject -nameopt RFC2253 | sed "s/^subject=//"

在使用此选项时需要小心,尤其是在对 DN 使用正则表达式匹配时。

include

此行将用给定文件的内容替换。

include_if_exists

如果文件存在,此行将用给定文件的内容替换。否则,将记录一条消息以指示已跳过该文件。

include_dir

此行将用目录中找到的所有文件的内容替换,如果它们不以 . 开头且以 .conf 结尾,则按照文件名顺序处理(根据 C 区域设置规则,即数字在字母之前,大写字母在小写字母之前)

通过 @ 结构包含的文件被读作名称列表,这些名称可以用空格或逗号分隔。注释由 # 引入,就像在 pg_hba.conf 中一样,并允许嵌套的 @ 结构。除非 @ 后面的文件名是绝对路径,否则它将被视为相对于包含引用文件的目录。

由于 pg_hba.conf 记录对于每个连接尝试都是按顺序检查的,因此记录的顺序很重要。通常,较早的记录将具有严格的连接匹配参数和较弱的身份验证方法,而较晚的记录将具有较松散的匹配参数和较强的身份验证方法。例如,对于本地 TCP/IP 连接可能希望使用 trust 验证,但对于远程 TCP/IP 连接需要一个密码。在这种情况下,指定来自 127.0.0.1 的连接的 trust 验证的记录将出现在指定对更广泛允许的客户端 IP 地址的密码验证的记录之前。

提示

要连接到某个特定数据库,用户不仅必须通过 pg_hba.conf 检查,还必须对该数据库拥有 CONNECT 权限。如果您希望限制哪些用户可以连接至哪些数据库,通常授予/取消 CONNECT 权限(而不是将规则放置在 pg_hba.conf 条目中)更容易控制此权限。

有关 pg_hba.conf 条目的部分示例,请参见 示例 20.1。有关不同身份验证方法的详细信息,请参见下一部分。

示例 20.1。示例 pg_hba.conf 条目

# 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            ADDRESS                 METHOD
local   all             all                                     trust

# The same using local loopback TCP/IP connections.
#
# TYPE  DATABASE        USER            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

# The same over IPv6.
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             ::1/128                 trust

# The same using a host name (would typically cover both IPv4 and IPv6).
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             localhost               trust

# The same using a regular expression for DATABASE, that allows connection
# to any databases with a name beginning with "db" and finishing with a
# number using two to four digits (like "db1234" or "db12").
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    "/^db\d{2,4}$"  all             localhost               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            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            ADDRESS                 METHOD
host    postgres        all             192.168.12.10/32        scram-sha-256

# Allow any user from hosts in the example.com domain to connect to
# any database if the user's password is correctly supplied.
#
# Require SCRAM authentication for most users, but make an exception
# for user 'mike', who uses an older client that doesn't support SCRAM
# authentication.
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             mike            .example.com            md5
host    all             all             .example.com            scram-sha-256

# In the absence of preceding "host" lines, these three lines will
# reject all connections from 192.168.54.1 (since that entry will be
# matched first), but allow GSSAPI-encrypted 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.  Unencrypted GSSAPI connections
# (which "fall through" to the third line since "hostgssenc" only matches
# encrypted GSSAPI connections) are allowed, but only from 192.168.12.10.
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             192.168.54.1/32         reject
hostgssenc all          all             0.0.0.0/0               gss
host    all             all             192.168.12.10/32        gss

# 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            ADDRESS                 METHOD
host    all             all             192.168.0.0/16          ident map=omicron

# If these are the only four 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 users whose
# name end with "helpdesk", 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            ADDRESS                 METHOD
local   sameuser        all                                     md5
local   all             /^.*helpdesk$                           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