LightDB/PostgreSQL 设置LightDB访问白名单pg_hba.conf

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


请使用浏览器的分享功能分享到微信等