ltsql登陆的时候被拒绝了,其实这个问题比较简单,限制了用户ip登陆
[lightdb@hs-10-19-36-28 ~]$ PGPASSWORD=benchmarksql ltsql -U benchmarksql -d benchmarksql1000 -h 10.20.30.231 -p 5678 ltsql: error: FATAL: no pg_hba.conf entry for host "10.19.36.28", user "benchmarksql", database "benchmarksql1000", SSL off
LightDB客户端认证是由配置文件pg_hba.conf控制的。HBA的意思是"host-based authentication", 也就是基于主机的认证。
相比于MySQL和Oracle,访问控制策略MySQL使用'user'@'ip'中的ip控制允许用户从哪里创建连接登陆,而Oracle是配置sqlnet.ora中配置白名单来允许哪些IP访问。
tcp.validnode_checking=yes tcp.invited_nodes=(10.0.0.109,127.0.0.1) #必须包含数据库所在服务器ip,否则监听无法启动 tcp.excluded_nodes=(192.168.220.1) #黑名单
而Oracle中监听中配置0.0.0.0是允许外界通过本机所有ip创建连接访问,这是另外一个事情。
LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = cdb1) (ORACLE_HOME = /u01/oracle/products/19.3) (SID_NAME = cdb) ) (SID_DESC = (GLOBAL_DBNAME = cdb2) (ORACLE_HOME = /u01/oracle/products/19.3) (SID_NAME = cdb2) ) )
pg_hba.conf配置文件如下
# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust host all all 0.0.0.0/0 trust # IPv6 local connections: host all all ::1/128 trust # Allow replication connections from localhost, by a user with the # replication privilege. local replication all trust host replication all 127.0.0.1/32 trust host replication all ::1/128 trust
该配置文件有5个参数,分别为:
TYPE(主机类型)
DATABASE(数据库名)
USER(用户名)
ADDRESS(IP地址/掩码)
METHOD(加密方法)
TYPE有4个值
-
local:使用Unix-domainsocket
-
host:使用TCP/IP连接,可以是SSL的,也可以不是
-
hostssl:必须是SSL的
-
hostnossl:必须是非SSL的
DATABASE(数据库名)
-
all,all表示所有,但不包括replication。多个数据库用“,”隔开。
-
sameuser
-
samerole
-
replication
USER(用户名)
-
可以为"all",表示所有,也可以具体指定一个用户。多个用户用“,”隔开。和DATABASE一样,也可以将配置放到文件中,文件名加上前缀@
ADDRESS
可以是为一个主机名,或者由IP地址和CIDR掩码组成。掩码可以为0-32(IPv4)或者0-128(IPv6)间的一个整数,32表示子网掩码为255.255.255.255,24表示子网掩码为255.255.255.0。主机名以“.”开头。
samehost可以匹配所有主机
samenet可以匹配同一个掩码内的所有主机。
例:192.168.10.122/32表示单一主机,192.168.10.0/24表示192.168.0.1~192.168.0.255网段内所有主机,0.0.0.0/0表示所有主机。
METHOD(密码加密策略)
-
password表示以明文方式发送密码
-
md5和scram-sha-256会以对应的方式加密再发送密码
测试,配置如下hba.conf文件,数据库231服务器上
# TYPE DATABASE USER ADDRESS METHOD #"local" is for Unix domain socket connections only # local all all trust # IPv4 local connections: # host all all 127.0.0.1/32 trust host all all 10.20.30.193/32 md5 host all all 10.20.30.231/32 md5 # IPv6 local connections: #host all all ::1/128 trust # Allow replication connections from localhost, by a user with the # replication privilege. local replication all trust host replication all 127.0.0.1/32 trust host replication all ::1/128 trust
通过231的127.0.0.1 地址登录,如下可以看到不在白名单内
[lightdb@HS-10-20-30-231 data]$ PGPASSWORD=benchmarksql ltsql -U benchmarksql -d benchmarksql1000 -h 127.0.0.1 -p 5678 ltsql: error: FATAL: no pg_hba.conf entry for host "127.0.0.1", user "benchmarksql", database "benchmarksql1000", SSL off
通过231地址登录,可以登录,在白名单内,同样
[lightdb@HS-10-20-30-231 data]$ PGPASSWORD=benchmarksql ltsql -U benchmarksql -d benchmarksql1000 -h 10.20.30.231 -p 5678 ltsql (13.3-22.1) Type "help" for help. benchmarksql@benchmarksql1000=> [lightdb@hs-10-20-30-193 ~]$ PGPASSWORD=benchmarksql ltsql -U benchmarksql -d benchmarksql1000 -h 10.20.30.231 -p 5678 ltsql (13.3-22.1) Type "help" for help. benchmarksql@benchmarksql1000=>
通过28服务器无法登录
[lightdb@hs-10-19-36-28 ~]$ PGPASSWORD=benchmarksql ltsql -U benchmarksql -d benchmarksql1000 -h 10.20.30.231 -p 5678 ltsql: error: FATAL: no pg_hba.conf entry for host "10.19.36.28", user "benchmarksql", database "benchmarksql1000", SSL off