连接数据库失败提示hba.conf不符合的处理方法

Posted 瀚高PG实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连接数据库失败提示hba.conf不符合的处理方法相关的知识,希望对你有一定的参考价值。

瀚高数据库
目录
环境
文档用途
详细信息

环境
系统平台:N/A
版本:6.0,5.6.5,5.6.4,5.6.3,5.6.1,4.5.2,4.5,4.3.4.9,4.3.4.8,4.3.4.7,4.3.4.6,4.3.4.5,4.3.4.4,4.3.4.3,4.3.4.2,4.3.4,4.7.8,4.7.7,4.7.6,4.7.5,4.3.2,4.1.1
文档用途
本文主要介绍如何对 hba.conf 进行合理的配置,以防止因hba.conf文件配置不合理从而连接不上数据库。

详细信息

1. 客户端认证文件介绍

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

pg_hba.conf 文件的常用格式是一组记录,每行一条。空白行将被忽略, “#” 注释字符后面的任何文本也被忽略。记录不能跨行。一条记录由若干用空格 或制表符分隔的域组成。如果域值用双引号包围,那么它可以包含空。在数据库、用户或地址域中引用一个关键字(例如 all 或 replication)将使该词失去其特殊含义,将会只匹配一个有该名字的数据库、用户或主机。每条记录指定一种连接类型、一个客户端 IP 地址范围(如果和连接类型相关)、一个数据库名、一个用户名以及对匹配这些参数的连接所使用的认证方法。第一条匹配连接类型、客户端地址、连接请求的数据库和用户名的记录将被用于执行认证。这个过程没有“落空”或者“后备”的说法:如果选择了一条记录而且认证失败,那么将不再考虑后面的记录。如果没有匹配的记录,那么访问将被拒绝。

无论客户端以何种方式来登录数据库,都要有一个客户端可以访问的数据库用户或叫角色存在。如果是本地认证,则服务器会验证发起请求的客户端的系统用户名,系统用户名可能与数据库角色相同,也可能不同。

注意事项:

  1. “#” 号注释会忽略后面的文本。

  2. pg_hba.conf中的连接配置记录不能跨行。

  3. 一个客户端请求只会匹配pg_hba.conf中与连接类型,数据库,数据库用户和地址等信息匹配的第一行,无论登录成功或者失败都不会再去匹配其他行。

  4. pg_hba.conf读取顺序是从上往下,来读取第一个符合条件的记录。

2. pg_hba.conf配置说明

2.1 pg_hba.conf 配置格式

pg_hba.conf文件路径

1)允许本地系统上的任何用户通过 Unix 域套接字以任意数据库用户名连接到任意数据库(本地连接的默认值)。

[root@hgv4 data]# ls -l $PGDATA/pg_hba.conf

-rw------- 1 root root 4298 1021 11:39 /opt/HighGo4.5.2-see/data/pg_hba.conf

2)任意数据库用户名连接到任意数据库,使用本地环回 TCP/IP 连接。

pg_hba.conf文件 7 种配置

#request_mode  db_name   db_role  address  mask   method    options 

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]

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]

2.2 pg_hba.conf各列释义:

第一列(request_mode)

local:匹配使用 Unix 域套接字(unix domain socket)的连接。 如果没有这种类型的记录,则不允许 Unix 域套接字连接。

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

hostssl:匹配使用 TCP/IP 建立的连接,但必须是使用SSL加密的连接。要使用这个选项,编译服务器的时候必须打开SSL支持。此外,在服务器启动的时候通过将postgresql.conf中的ssl 设置为on,打开的SSL支持。否则,hostssl记录会被忽略,并且会记录一个警告说它无法匹配任何连接。

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

host/hostssl/hostnossl总结: 认证方法通过TCP/IP连接,带有ssl后缀的认证方式使用SSL连接,带有nossl后缀的认证方式不使用SSL连接。

第二列(db_name)

database:指定要访问的数据库sameuser表示如果请求的数据库名与角色名相同则匹配。replication表示允许replication连接请求,此时不指定任何特定的数据库。可以用逗号分隔来指定多个数据库,值 all 匹配所有的数据库。

第三列(db_role)

user:指定访问数据库使用的数据库角色名,值 all 匹配所有存在的数据库角色。

第四列(address)

IP-address:声明这条记录匹配的客户端机器的地址。可以是主机名或者ip地址。ip地址可以以常用的两种方式指定。0.0.0.0/0代表全部IPv4地址,::/0代表全部IPv6地址。

第五列(mask)

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

第六列(method:auth-method)

trust:无条件的允许连接。这个方法允许任何人用任意一个用户登录到数据库。

md5:要求客户端提供一个MD5加密的口令进行认证。

password:要求客户提供一个未加密的密码进行身份验证,不安全。

ident:使用ident服务器认证用户。

ldap:用LDAP服务器进行认证

sm3:执行 sm3 认证来验证用户的口令。sm3 算法是国家密码算法的一种散列算法,在用户认证过程中,和 md5 的过程一致,但是算法的安全度比 md5 安全的多,并且 sm3 算法自主可控,当然,sm3 也是以散列值的形式存在于数据库的用户表

pam:使用PAM认证。

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

第七列(options)

auth-options :以name=value的形式为这些认证方法指定一些选项。比较常用的是指定用户名映射,格式为map=map-name,map-name指定pg_ident.conf文件中的一条命名用户名映射记录。此列一般极少配置。

2.3 pg_hba.conf 配置示例

说明:pg_hba.conf配置格式,我们可以简化为以下两种方式:

远程客户端访问记录的格式:

host   database   role   address   auth-method

本地UNIX-域套接字记录的格式:

local   database   role   auth-method

1)允许本地系统上的任何用户通过 Unix 域套接字以任意数据库用户名连接到任意数据库(本地连接的默认值)。

# TYPE  DATABASE   USER       ADDRESS       METHOD

local   all      all                    trust

2)任意数据库用户名连接到任意数据库,使用本地环回 TCP/IP 连接。

# TYPE  DATABASE   USER       ADDRESS        METHOD

host    all      all      127.0.0.1/32       trust

3)任意数据库用户名连接到任意数据库,使用独立的掩码列

# TYPE  DATABASE    USER  IP-ADDRESS   IP-MASK        METHOD

host    all      all    127.0.0.1  255.255.255.255    trust

4) 任意数据库用户名连接到任意数据库,IPv6 上相同的规则

# TYPE  DATABASE    USER    ADDRESS                METHOD

host    all       all    ::1/128                trust

5)任意数据库用户名连接到任意数据库,使用主机名的相同规则(通常同时覆盖 IPv4 和 IPv6)。

# TYPE  DATABASE    USER    ADDRESS                METHOD

host    all       all    localhost               trust

6)允许来自任意具有 IP 地址192.168.93.x 的主机上任意用户以 ident 为该连接所报告的相同用户名连接到数据库 “highgo”。

# TYPE  DATABASE    USER    ADDRESS                METHOD

host    highgo     all    192.168.93.0/24           ident

7)如果用户的口令被正确提供,允许来自主机 192.168.12.10 的任意用户连接到数据库 “highgo”

# TYPE  DATABASE   USER     ADDRESS               METHOD

host    highgo     all    192.168.12.10/32           md5

8)如果没有前面的 “host” 行,这两行表示将拒绝所有来自 192.168.54.1的连接(因为那些项将首先被匹配),允许来自网络中其他任何地方的 md5 口令方式的认证连接,零掩码匹配任意主机。

# TYPE  DATABASE   USER      ADDRESS               METHOD

host    all      all      192.168.54.1/32           reject

host    all      all       0.0.0.0/0              md5

9)无条件的允许来自网络中其他任何地方的 md5 口令方式的认证连接。

# TYPE  DATABASE   USER      ADDRESS                METHOD

host    all      all       0.0.0.0/0              md5

2.4 配置注意事项:

1)数据库名与用户名注意大小写。

2)address(用户的IP范围)的值的格式是:IP/数值

数值取值范围为:0,8,16,24,32 即表示掩码bit的个数。例:

32  ->  192.168.1.1/32 表示必须是来自这个IP地址的访问才合法。

24  ->  192.168.1.0/24 表示只要来自192.168.1.0 ~ 192.168.1.255的都合法。

16  ->  192.168.0.0/16 表示只要来自192.168.0.0 ~ 192.168.255.255的都合法。

8  ->  192.0.0.0/16 表示只要来自192.0.0.0 ~ 192.255.255.255的都合法。

0  ->  0.0.0.0/0  表示全部IP地址都合法,/左边的IP地址随便了只要是合法的IP地址即可。

3)完成上面两个配置文件的修改以后,为了让配置生效,需要重新启动或 reload 数据库服务。

4)要考虑下是否要支持ssl 协议,在需要的时候添加添加ssl 选项。

3. 常见问题处理方法

3.1 无法连接到服务器:不支持 13 认证方式

psql -U syssso -d highgo -p 5866 -h 192.168.0.131

psql: 错误: 无法连接到服务器:不支持 13 认证方式.

处理方法:

1)如果数据库默认使用 sm3 (highgodb安全版中的认证方式) 身份验证算法,需要改为 md5,步骤如下:

2)修改 postgresql.conf 文件 password_encryption 参数由 sm3 修改为 md5

3)重启数据库 pg_ctl restart

4)sysdba 登陆,修改密码为 1qaz!QAZ;syssao、syssso 及其他用户同理。

5)修改 pg_hba 文件加密方式改为 md5

6)重启数据库 pg_ctl restart

7)登录数据库,输入密码 1qaz!QAZ 进行验证。

说明:密码可根据自己的环境进行修改。

3.2 FATAL: no pg_hba.conf entry for host “123.123.123.123”, user “andym”, database “testdb”

处理方法:

表示已和服务器进行通信,但服务器拒绝了连接请求,没有在其 pg_hba.conf 配置文件里找到匹配项,需要在pg——hba.conf中添加匹配选项。

3.3 FATAL: password authentication failed for user “andym”

处理方法:

这样的消息表示已和服务器进行通信,但是必须通过pg_hba.conf文件中指定的认证方法。检查你提供的口令,认证类型。
3.4 FATAL: user “andym” does not exist

处理方法:

指示的数据库用户没有被找到,需检查数据库名称是否正确。
3.5 FATAL: database “testdb” does not exist

处理方法:

你试图连接的数据库不存在。请注意如果你没有声明数据库名。

以上是关于连接数据库失败提示hba.conf不符合的处理方法的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 允许远程访问设置方法

PostgreSQ 连接问题 FATAL: no pg_hba.conf entry for host

PostgreSQL 允许远程访问设置方法

PostgreSQL 允许远程访问设置方法

你好,我的电脑显示数据连接失败,请检查数据配置是啥原因

PostgreSQL:pg_hba.conf中的MD5身份验证给我致命:用户“ postgres”的对等身份验证失败]] << [