连接数据库失败提示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 地址范围(如果和连接类型相关)、一个数据库名、一个用户名以及对匹配这些参数的连接所使用的认证方法。第一条匹配连接类型、客户端地址、连接请求的数据库和用户名的记录将被用于执行认证。这个过程没有“落空”或者“后备”的说法:如果选择了一条记录而且认证失败,那么将不再考虑后面的记录。如果没有匹配的记录,那么访问将被拒绝。
无论客户端以何种方式来登录数据库,都要有一个客户端可以访问的数据库用户或叫角色存在。如果是本地认证,则服务器会验证发起请求的客户端的系统用户名,系统用户名可能与数据库角色相同,也可能不同。
注意事项:
-
“#” 号注释会忽略后面的文本。
-
pg_hba.conf中的连接配置记录不能跨行。
-
一个客户端请求只会匹配pg_hba.conf中与连接类型,数据库,数据库用户和地址等信息匹配的第一行,无论登录成功或者失败都不会再去匹配其他行。
-
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 10月 21 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不符合的处理方法的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQ 连接问题 FATAL: no pg_hba.conf entry for host
PostgreSQL:pg_hba.conf中的MD5身份验证给我致命:用户“ postgres”的对等身份验证失败]] << [