pg_hba.conf文件解读

pg_hba.conf文件的常用格式是一组记录,每行一条。 空白行将被忽略, #注释字符后面的任何文本也被忽略。 记录可以延续到下一行并以反斜线结束该行。(反斜线不是特定的的,除了在行尾。) 一条记录由若干用空格和/或制表符分隔的域组成。 如果域值用双引号包围,那么它可以包含空白。 在数据库、用户或地址域中引用一个关键字(例如,allreplication)将使该词失去其特殊含义,并且只是匹配一个有该名字的数据库、用户或主机。 反斜线行的延续在引用文本或注释中也可以使用。

每条记录指定一种连接类型、一个客户端 IP 地址范围(如果和连接类型相关)、一个数据库名、一个用户名以及对匹配这些参数的连接使用的认证方法。第一条匹配连接类型、客户端地址、连接请求的数据库和用户名的记录将被用于执行认证。这个过程没有“落空”或者“后备”的说法:如果选择了一条记录而且认证失败,那么将不再考虑后面的记录。如果没有匹配的记录,那么访问将被拒绝。

记录可以有多种格式:

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]

各个域的含义如下:

  • local :这条记录匹配企图使用 Unix 域套接字的连接。 如果没有这种类型的记录,就不允许 Unix 域套接字连接。

  • host: 这条记录匹配企图使用 TCP/IP 建立的连接。 host记录匹配SSL和非SSL的连接尝试, 此外还有GSSAPI 加密的或non-GSSAPI 加密的连接尝试。

  • hostssl:这条记录匹配企图使用 TCP/IP 建立的连接,但必须是使用SSL加密的连接。

  • hostnossl:这条记录的行为与hostssl相反;它只匹配那些在 TCP/IP上不使用SSL的连接企图。.

  • hostgssenc:这条记录匹配企图使用TCP/IP建立的连接,但仅当使用GSSAPI加密建立连接时。要使用这个选项,服务器必须具备GSSAPI支持。 否则,除了记录无法匹配任何连接的警告以外,hostgssenc记录将被忽略。

  • hostnogssenc:这个记录类型具有与hostgssenc相反的表现; 它仅匹配通过不使用GSSAPI加密的TCP/IP进行的连接尝试。

  • database:指定记录所匹配的数据库名称。值all指定该记录匹配所有数据库。

  • user:指定这条记录匹配哪些数据库用户名。值all指定它匹配所有用户。

  • address:指定这个记录匹配的客户端机器地址。这个域可以包含一个主机名、一个 IP 地址范围或下文提到的特殊关键字之一。

  • IP-mask:这两个域可以被用作IP-address/ mask-length记号法的替代方案。和指定掩码长度不同,实际的掩码被指 定在一个单独的列中。例如,255.0.0.0表示 IPv4 CIDR 掩码长度 8,而255.255.255.255表示 CIDR 掩码长度 32。

  • auth-method:要使用的认证方法。trust、reject、scram-sha-256、md5、password、gss、sspi、ident、peer、ldap、radius、cert、pam、bsd

示例 pg_hba.conf 项

# 允许本地系统上的任何用户
# 通过 Unix 域套接字以任意
# 数据库用户名连接到任意数据库(本地连接的默认值)。
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     trust
​
# 相同的规则,但是使用本地环回 TCP/IP 连接。
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             127.0.0.1/32            trust
​
# 和前一行相同,但是使用了一个独立的掩码列
#
# TYPE  DATABASE        USER            IP-ADDRESS      IP-MASK             METHOD
host    all             all             127.0.0.1       255.255.255.255     trust
​
# IPv6 上相同的规则
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             ::1/128                 trust
​
# 使用主机名的相同规则(通常同时覆盖 IPv4 和 IPv6)。
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             localhost               trust
​
# 允许来自任意具有 IP 地址192.168.93.x 的主机上任意
# 用户以 ident 为该连接所报告的相同用户名连接到
# 数据库 "postgres"(通常是操作系统用户名)。
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    postgres        all             192.168.93.0/24         ident
​
# 如果用户的口令被正确提供,允许来自主机 192.168.12.10
# 的任意用户连接到数据库 "postgres"。
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    postgres        all             192.168.12.10/32        scram-sha-256
​
# 如果用户的口令被正确提供,允许 example.com 中主机上
# 的任意用户连接到任意数据库。
#
# 为大部分用户要求SCRAM认证,但是用户'mike'是个例外,
# 他使用的是不支持SCRAM认证的旧客户端。
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             mike            .example.com            md5
host    all             all             .example.com            scram-sha-256
​
# 如果没有前面的 "host" 行,这三行
# 将拒绝所有来自 192.168.54.1的连接(因为那些项将首先被匹配),
# 但是允许来自互联网其他任何地方的
# GSSAPI-encrypted连接。零掩码导致主机IP 地址中的所有位都不会被考虑,
# 因此它匹配任意主机。未加密GSSAPI连接
# (which "跳转"到第三行是因为"hostgssenc" 仅匹配加密的 GSSAPI 连接) 是被允许的,但只能来自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
​
# 允许来自 192.168.x.x 主机的用户连接到任意数据库,如果它们能够
# 通过 ident 检查。例如,假设 ident说用户是 "bryanh" 并且他要求以
# PostgreSQL 用户 "guest1" 连接,如果在 pg_ident.conf 有一个映射
# "omicron" 的选项说 "bryanh" 被允许以 "guest1" 连接,则该连接将被允许。
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             192.168.0.0/16          ident map=omicron
​
# 如果这些是本地连接的唯一三行,它们将允许本地用户只连接到它们
# 自己的数据库(与其数据库用户名同名的数据库),不过管理员和角
# 色 "support" 的成员除外(它们可以连接到所有数据库)。文件
# $PGDATA/admins 包含一个管理员名字的列表。在所有情况下都要求口令。
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   sameuser        all                                     md5
local   all             @admins                                 md5
local   all             +support                                md5
​
# 上面的最后两行可以被整合为一行:
local   all             @admins,+support                        md5
​
# 数据库列也可以用列表和文件名:
local   db1,db2,@demodbs  all