# 21.1.那个pg_hba。形态文件

客户端身份验证由一个配置文件控制,该文件通常被命名为pg_hba。形态并存储在数据库集群的数据目录中。(HBA代表基于主机的身份验证。)违约pg_hba。形态当数据目录由初始化时安装文件initdb。但是,可以将身份验证配置文件放在其他位置;看到了吗hba_文件配置参数。

文件的一般格式pg_hba。形态文件是一组记录,每行一条。空白行将被忽略,空格后面的任何文本也将被忽略#评论人物。记录可以通过以反斜杠结尾的方式继续到下一行。(反斜杠并不特别,除非在一行的末尾。)记录由许多字段组成,这些字段之间用空格和/或制表符隔开。如果字段值是双引号,则字段可以包含空格。引用数据库、用户或地址字段中的一个关键字(例如。,全部的复制)使这个词失去其特殊含义,只需将数据库、用户或主机与该名称匹配即可。即使在引用的文本或注释中,反斜杠行继续也适用。

每个记录指定连接类型、客户端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]

这些字段的含义如下:

地方的

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

主办

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

# 笔记

远程TCP/IP连接将不可能实现,除非服务器以适当的值启动听_地址配置参数,因为默认行为是仅在本地环回地址上侦听TCP/IP连接本地服务器.

hostssl

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

要使用此选项,必须使用SSL支持构建服务器。此外,必须通过设置ssl配置参数(参见第19.9节更多信息)。否则hostssl记录将被忽略,但会记录一条警告,指出它无法匹配任何连接。

诺斯酒店

此记录类型的行为与hostssl; 它只匹配通过不使用SSL的TCP/IP进行的连接尝试。

格森酒店

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

要使用此选项,必须使用GSSAPI支持构建服务器。否则格森酒店记录将被忽略,但会记录一条警告,指出它无法匹配任何连接。

诺格森酒店

此记录类型的行为与格森酒店; 它只匹配通过不使用GSSAPI加密的TCP/IP进行的连接尝试。

数据库

指定此记录匹配的数据库名称。价值全部的指定它匹配所有数据库。价值sameuser指定如果请求的数据库与请求的用户同名,则记录匹配。价值萨梅罗勒指定请求的用户必须是与请求的数据库同名的角色成员。(萨姆格鲁是一种过时但仍被接受的拼写萨梅罗勒)超级用户不被视为角色的成员萨梅罗勒除非他们是角色的明确成员,直接或间接,而不仅仅是因为他们是超级用户。价值复制指定如果请求物理复制连接,则记录匹配,但是,它与逻辑复制连接不匹配。请注意,物理复制连接不会指定任何特定的数据库,而逻辑复制连接会指定它。否则,这是特定PostgreSQL数据库的名称。通过用逗号分隔,可以提供多个数据库名称。可以通过在文件名前面加上@.

使用者

指定此记录匹配的数据库用户名。价值全部的指定它匹配所有用户。否则,这可能是特定数据库用户的名称,也可能是前面带有+(回想一下,PostgreSQL中的用户和组之间没有真正的区别+mark的真正意思是“匹配直接或间接属于该角色的任何角色”,而没有+mark只匹配该特定角色。)为此,仅当超级用户直接或间接明确地是角色的成员时,才将其视为角色的成员,而不仅仅是因为超级用户的身份。可以使用逗号分隔多个用户名。可以通过在文件名前面加上@.

住址

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

IP地址范围是用标准的数字符号表示范围的起始地址,然后是斜杠(/)和苹果酒口罩长度。掩码长度表示客户端IP地址中必须匹配的高位位数。在给定的IP地址中,它右边的位应该为零。IP地址和/,以及苹果酒面膜的长度。

以这种方式指定的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-in-IPv6范围内。请注意,如果系统的C库不支持IPv6地址,IPv6格式的条目将被拒绝。

你也可以写作全部的要匹配任何IP地址,samehost匹配任何服务器自己的IP地址,或萨米内匹配服务器直接连接到的任何子网中的任何地址。

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

以点开头的主机名规范(.)匹配实际主机名的后缀。所以实例通用域名格式会匹配福。实例通用域名格式(但不仅仅是实例通用域名格式).

在中指定主机名时pg_hba。形态,您应该确保名称解析速度相当快。设置本地名称解析缓存(如nscd。此外,您可能希望启用配置参数日志主机名查看客户端的主机名,而不是日志中的IP地址。

这些字段不适用于地方的记录。

# 笔记

用户有时想知道为什么主机名会以这种看似复杂的方式处理,有两种名称解析,包括反向查找客户端的IP地址。如果客户端的反向DNS条目未设置或产生一些不需要的主机名,这会使该功能的使用变得复杂。这样做主要是为了提高效率:这样,一次连接尝试最多需要两次解析器查找,一次反向查找,一次正向查找。如果某个地址存在冲突解决程序问题,那么它只会成为该客户机的问题。一个只进行前向查找的假设替代实现必须解析本文中提到的每个主机名pg_hba。形态在每次连接尝试中。如果列出许多名字,这可能会非常缓慢。如果其中一个主机名存在冲突解决程序问题,它将成为每个人的问题。

此外,为了实现后缀匹配功能,需要进行反向查找,因为需要知道实际的客户机主机名,以便与模式匹配。

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

IP地址
IP屏蔽

这两个字段可以用作*IP地址/遮罩长度*符号不是指定掩码长度,而是在单独的列中指定实际掩码。例如255.0.0.0表示IPv4 CIDR掩码长度为8,并且255.255.255.255表示CIDR掩码长度为32.

这些字段不适用于地方的记录。

验证方法

指定连接与此记录匹配时要使用的身份验证方法。这里总结了可能的选择;详情见第21.3节.

相信

无条件允许连接。此方法允许任何可以连接到PostgreSQL数据库服务器的人以任何PostgreSQL用户的身份登录,而无需密码或任何其他身份验证。看见第21.4节详细信息。

拒绝

无条件拒绝连接。这对于从组中“过滤”某些主机非常有用,例如拒绝线路可能会阻止特定主机连接,而后面的线路则允许特定网络中的其余主机连接。

紧急停堆-sha-256

执行SCRAM-SHA-256身份验证以验证用户密码。看见第21.5节详细信息。

md5

执行SCRAM-SHA-256或MD5身份验证以验证用户密码。看见第21.5节详细信息。

暗语

要求客户端提供未加密的密码进行身份验证。由于密码通过网络以明文形式发送,因此不应在不受信任的网络上使用。看见第21.5节详细信息。

gss

使用GSSAPI对用户进行身份验证。这仅适用于TCP/IP连接。看见第21.6节详细信息。它可以与GSSAPI加密结合使用。

sspi

使用SSPI对用户进行身份验证。这仅在Windows上可用。看见第21.7节详细信息。

识别号

通过联系客户端上的Identit server获取客户端的操作系统用户名,并检查其是否与请求的数据库用户名匹配。身份验证只能在TCP/IP连接上使用。当为本地连接指定时,将使用对等身份验证。看见第21.8节详细信息。

同龄人

从操作系统获取客户端的操作系统用户名,并检查它是否与请求的数据库用户名匹配。这仅适用于本地连接。看见第21.9节详细信息。

ldap

使用LDAP服务器进行身份验证。看见第21.10节详细信息。

半径

使用RADIUS服务器进行身份验证。看见第21.11节详细信息。

证书

使用SSL客户端证书进行身份验证。看见第21.12节详细信息。

帕姆

使用操作系统提供的可插拔身份验证模块(PAM)服务进行身份验证。看见第21.13节详细信息。

bsd

使用操作系统提供的BSD身份验证服务进行身份验证。看见第21.14节详细信息。

授权选项

之后*验证方法字段,可以有表单的字段名称=价值*指定身份验证方法的选项。下面显示了有关哪些选项可用于哪些身份验证方法的详细信息。

除了下面列出的特定于方法的选项外,还有一个独立于方法的身份验证选项客户证书,可以在任何hostssl记录此选项可以设置为验证ca验证完整。这两个选项都要求客户端提供有效的(受信任的)SSL证书,而验证完整此外,还强制执行cn证书中的(通用名称)与用户名或适用的映射匹配。这种行为类似于证书身份验证方法(请参见第21.12节)但支持将客户端证书的验证与支持hostssl条目。

在任何使用客户端证书身份验证的记录上(即使用证书身份验证方法或使用客户证书选项),可以使用客户名称选项此选项可以有两个值之一。如果你指定clientname=CN,这是默认值,用户名与证书的通用名(CN).如果你指定clientname=DN用户名与整个可分辨名称(DN)证书的副本。此选项最好与用户名映射结合使用。比较是用DN在里面RFC 2253 (opens new window)总体安排去看电影DN对于此格式的客户端证书,请执行以下操作:

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

使用此选项时需要小心,尤其是对DN.

包含的文件@构造被读取为名称列表,可以用空格或逗号分隔。评论由#,就像pg_hba。形态,并嵌套@构造是允许的。除非下面的文件名@是一个绝对路径,它被视为相对于包含引用文件的目录。

自从pg_hba。形态每次连接尝试都会按顺序检查记录,记录的顺序是重要的。通常,较早的记录将具有紧密的连接匹配参数和较弱的身份验证方法,而较晚的记录将具有较松散的匹配参数和较强的身份验证方法。例如,您可能希望使用相信本地TCP/IP连接的身份验证,但远程TCP/IP连接需要密码。在本例中,记录指定相信127.0.0.1中连接的身份验证将出现在一条记录之前,该记录为更大范围的允许客户端IP地址指定密码身份验证。

这个pg_hba。形态文件在启动时以及主服务器进程接收到信号时读取信号如果在活动系统上编辑文件,则需要向邮政局长发出信号(使用pg_ctl重新加载,调用SQL函数pg_reload_conf(),或使用杀戮)让它重新读取文件。

# 笔记

在Microsoft Windows上,上述语句不正确:如果pg_hba。形态随后的新连接会立即应用该文件。

系统视图pg_hba_文件_规则有助于对更改进行预测试pg_hba。形态文件,或者在加载文件没有达到预期效果时诊断问题。视图中非空的行错误字段表示文件相应行中的问题。

# 提示

要连接到特定数据库,用户不仅必须通过pg_hba。形态支票,但必须有连接数据库的权限。如果您希望限制哪些用户可以连接到哪些数据库,通常通过授予/撤销来控制这一点会更容易连接特权,而不是把规则放进去pg_hba。形态条目。

一些例子pg_hba。形态条目如所示例21.1。有关不同身份验证方法的详细信息,请参阅下一节。

例21.1.范例pg_hba。形态条目

# 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

# 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 three 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 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             @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