【PG】PostgreSQL客户端认证pg_hba.conf文件

目录

文件格式

 连接类型(TYPE)

数据库(database)

用户(user)

连接地址(address)

格式

IPv4

IPv6

字符

主机名

主机名后缀

IP-address/IP-mask

auth-method

trust

reject

scram-sha-256

md5

password

gss

sspi

ident

peer

ldap

radius

cert

pam

bsd

auth-options

示例


用户在连接到PG数据库之前首先要经过文件的验证,可以理解为建立连接之前的白名单或者客户端认证

客户端认证是由一个配置文件(通常名为pg_hba.conf并被存放在数据库集簇目录中)控制(HBA表示基于主机的认证)。在initdb初始化数据目录时,它会安装一个默认的pg_hba.conf文件。不过我们也可以把认证配置文件放在其它地方; 参阅hba_file配置参数。

文件格式

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

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

【PG】PostgreSQL客户端认证pg_hba.conf文件_第1张图片

 连接类型(TYPE)

第一个字段是客户端连接server的类型,分为:

含义
local

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

host

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

hostssl

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

要使用这个选项,编译服务器的时候必须打开SSL支持。此外,在服务器启动的时候必须通过设置ssl配置参数(详见第 18.9 节)打开SSL。否则,hostssl记录会被忽略,并且会记录一个警告说它无法匹配任何连接。

hostnossl

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

hostnogssenc

这条记录匹配企图使用TCP/IP建立的连接,但仅当使用GSSAPI加密建立连接时

要使用这个选项,服务器必须具备GSSAPI支持。 否则,除了记录无法匹配任何连接的警告以外,hostgssenc记录将被忽略。

注意使用GSSAPI加密时能够支持的authentication methods 包括 gss,reject,和 trust.

hostnogssenc

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

数据库(database)

指定记录所匹配的数据库名称。

  • all指定该记录匹配所有数据库
  • sameuser指定如果被请求的数据库和请求的用户同名,则匹配
  • samerole指定请求的用户必须是一个与数据库同名的角色中的成员samegroup是一个已经废弃了,但目前仍然被接受的samerole同义词)。 对于一个用于samerole目的的角色,超级用户不会被考虑为其中的成员,除非它们是该角色的显式成员(直接或间接),而不是由于超级用户的原因。
  • replication指定如果一个物理复制连接被请求则该记录匹配(注意复制连接不指定任何特定的数据库)。
  • 在其它情况里,这就是一个特定的PostgreSQL数据库名字。 可以通过用逗号分隔的方法指定多个数据库,也可以通过在文件名前面放@来指定一个包含数据库名的文件。

用户(user)

指定这条记录匹配哪些数据库用户名。

all指定它匹配所有用户。 否则,它要么是一个特定数据库用户的名字或者是一个有前导+的组名称(回想一下,在PostgreSQL里,用户和组没有真正的区别,+实际表示“匹配这个角色的任何直接或间接成员角色”,而没有+记号的名字只匹配指定的角色)。 出于这个目的,如果超级用户显式的是一个角色的成员(直接或间接),那么超级用户将只被认为是该角色的一个成员而不是作为一个超级用户。 多个用户名可以通过用逗号分隔的方法提供。一个包含用户名的文件可以通过在文件名前面加上@来指定。

连接地址(address)

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

格式

一个 IP 地址范围以该范围的开始地址的标准数字记号指定,然后是一个斜线(/) 和一个CIDR掩码长度。掩码长度表示客户端 IP 地址必须匹配的高序二进制位位数。 在给出的 IP 地址中,这个长度的右边的二进制位必须为零。 在 IP 地址、/和 CIDR 掩码长度之间不能有空白。

IPv4

这种方法指定一个 IPv4 地址范围的典型例子是: 172.20.143.89/32用于一个主机, 172.20.143.0/24用于一个小型网络, 10.6.0.0/16用于一个大型网络。

IPv6

一个单主机的 IPv6 地址范围看起来像这样:::1/128(IPv6 回环地址), 一个小型网络的 IPv6 地址范围则类似于:fe80::7a31:c1ff:0000:0000/96。 

0.0.0.0/0表示所有 IPv4 地址,并且::0/0表示所有 IPv6 地址。 要指定一个单一主机,IPv4 用一个长度为 32 的 CIDR 掩码或者 IPv6 用长度为 128 的 CIDR 掩码。在一个网络地址中,不要省略结尾的零。

一个以 IPv4 格式给出的项将只匹配 IPv4 连接并且一个以 IPv6 格式给出的项将只匹配 IPv6 连接,即使对应的地址在 IPv4-in-IPv6 范围内。 请注意如果系统的 C 库不支持 IPv6 地址,那么 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-address/IP-mask

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

这些域不适用于local记录。

auth-method

指定当一个连接匹配这个记录时,要使用的认证方法。下面对可能的选择做了概述,详见第 20.3 节。

trust

无条件地允许连接。这种方法允许任何可以与PostgreSQL数据库服务器连接的用户以他们期望的任意PostgreSQL数据库用户身份登入,而不需要口令或者其他任何认证。详见第 20.4 节。

reject

无条件地拒绝连接。这有助于从一个组中“过滤出”特定主机,例如一个reject行可以阻塞一个特定的主机连接,而后面一行允许一个特定网络中的其余主机进行连接。

scram-sha-256

执行SCRAM-SHA-256认证来验证用户的口令。详见第 20.5 节。

md5

执行SCRAM-SHA-256或MD5认证来验证用户的口令。详见第 20.5 节。

password

要求客户端提供一个未加密的口令进行认证。因为口令是以明文形式在网络上发送的,所以我们不应该在不可信的网络上使用这种方式。详见第 20.5 节。

gss

用 GSSAPI 认证用户。只对 TCP/IP 连接可用。详见第 20.6 节,它可以与 GSSAPI 加密一起结合使用。

sspi

用 SSPI 来认证用户。只在 Windows 上可用。详见第 20.7 节。

ident

通过联系客户端的 ident 服务器获取客户端的操作系统名,并且检查它是否匹配被请求的数据库用户名。Ident 认证只能在 TCIP/IP 连接上使用。当为本地连接指定这种认证方式时,将用 peer 认证来替代。详见第 20.8 节。

peer

从操作系统获得客户端的操作系统用户,并且检查它是否匹配被请求的数据库用户名。这只对本地连接可用。详见第 20.9 节。

ldap

使用LDAP服务器认证。详见第 20.10 节。

radius

用 RADIUS 服务器认证。详见第 20.11 节。

cert

使用 SSL 客户端证书认证。详见第 20.12 节。

pam

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

bsd

使用由操作系统提供的 BSD 认证服务进行认证。详见第 20.14 节。

auth-options

auth-method域的后面, 可以是形如name=value的域,它们指定认证方法的选项。 关于哪些认证方法可以用哪些选项的细节请见下文。

除了下文列出的与方法相关的选项之外,还有一个与方法无关的认证选项clientcert,它可以在任何hostssl记录中指定。 这个选项可以被设置到verify-caverify-full. 这两个选项都需要客户端提供有效的(受信任的)SSL证书,并且verify-full额外强制证书中的cn(通用名称)匹配用户名或适用的映射。 这种行为类似于cert认证方法 (参见 第 20.12 节), 但是允许客户端证书的验证与任何支持hostssl登记的认证方法相搭配。

示例

# 允许本地系统上的任何用户
# 通过 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                                   md5

你可能感兴趣的:(PG,postgresql,数据库)