客户端访问KingbaseES数据库,需要建立身份的认证,sys_hba.conf相当于认证的黑白名单,可以通过配置sys_hba.conf允许或拒绝客户端对数据库服务器的访问。
sys_hba.conf原理:
- 客户端认证是由一个配置文件(通常名为sys_hba.conf并被存放在数据库集簇目录中)控制(HBA表示基于主机的认证)。
- 在initdb初始化数据目录时,它会安装一个默认的sys_hba.conf文件。
- sys_hba.conf文件的常用格式是一组记录,每行一条。空白行将被忽略, #注释字符后面的任何文本也被忽略。记录不能跨行。
- 每条记录指定一种连接类型、一个客户端 IP 地址范围(如果和连接类型相关)、一个数据库名、一个用户名
- 以及对匹配这些参数的连接使用的认证方法。第一条匹配连接类型、客户端地址、连接请求的数据库和用户名的记录将被用于执行认证。
- 如果选择了一条记录而且认证失败,那么将不再考虑后面的记录。如果没有匹配的记录,那么访问将被拒绝。
案例一:
拒绝客户端本地socket和127.0.0.1连接登录,只能通过本机ip以TCP/IP连接方式登录:
1)sys_hba.conf配置
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all reject
# IPv4 local connections:
host all all 127.0.0.1/32 reject
host all all 10.8.3.20/24 scram-sha-256
host all all 0.0.0.0/0 scram-sha-256
2)数据库服务reload后登录
如下所示,本地socket和127.0.0.1连接被拒绝,通过本地ip连接登录成功。
[kingbase@node1 bin]$ ./ksql -h 10.8.3.20 -U system test
ksql (V8.0)
Type "help" for help.[kingbase@node1 bin]$ ./ksql -h 127.0.0.1 -U system test
ksql: error: could not connect to server: FATAL: no sys_hba.conf entry for host "127.0.0.1", user "system", database "test", SSL off[kingbase@node1 bin]$ ./ksql -U system test
ksql: error: could not connect to server: FATAL: no sys_hba.conf entry for host "[local]", user "system", database "test", SSL off
案例二:
只允许主备节点访问数据库服务:
1)sys_hba.conf配置
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all scram-sha-256
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
host all all 10.8.3.20/24 scram-sha-256
host all all 10.8.3.21/24 scram-sha-256
#host all all 0.0.0.0/0 scram-sha-256
2)数据库服务reload后登录
如下所示,本地ip访问和远程客户端访问数据库成功:
# 本节点连接数据库访问
[kingbase@node1 bin]$ ./ksql -h 10.8.3.20 -U system test
ksql (V8.0)
Type "help" for help.test=# # 远程节点连接数据库访问[kingbase@node2 bin]$ ./ksql -h 10.8.3.20 -U system test
ksql (V8.0)
Type "help" for help.test=#
案例三:
拒绝所有的客户端通过TCP/IP连接数据库访问:
1)sys_hba.conf配置
# TYPE DATABASE USER ADDRESS METHOD# "local" is for Unix domain socket connections only
local all all scram-sha-256
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
#host all all 0.0.0.0/0 scram-sha-256
host all all 10.8.3.0/24 scram-sha-256
host all all 0.0.0.0/0 reject
---如上所示,增加(0.0.0.0/0)的reject条目。
虽然在拒绝所有客户端访问前,有允许访问的客户端ip。
2)数据库服务reload后登录
如下所示,本地socket连接登录成功,TCP/IP连接访问失败:(包括在sys_hba.conf中允许访问的客户端)
[kingbase@node1 bin]$ ./ksql -U system test
ksql (V8.0)
Type "help" for help.test=#[kingbase@node1 bin]$ ./ksql -h 127.0.0.1 -U system test
ksql: error: could not connect to server: FATAL: no sys_hba.conf entry for host "127.0.0.1", user "system", database "test", SSL off
[kingbase@node101 bin[kingbase@node1 bin]$ ./ksql -h 10.8.3.20 -U system test
ksql: error: could not connect to server: FATAL: no sys_hba.conf entry for host "10.8.3.20", user "system", database "test", SSL off
远程节点访问:(10.8.3.22/24)
[kingbase@node2 bin]$ ./ksql -h 10.8.3.20 -U system test
ksql: error: could not connect to server: FATAL: no sys_hba.conf entry for host "10.8.3.22", user "system", database "test", SSL off
下面来看一个具体的案例
应用程序在连接数据库时报下列信息
The authentication type 10 is not supported. Check that you have configured the sys_hba.conf file to include the client's IP address or subnet, and that it is using an authentication scheme supported by the driver.
1.查看sys_hba.conf文件
[root@localhost ~]# cd /opt/Kingbase/ES/V8/data/
[root@localhost data]# ls
[root@localhost data]# cat sys_hba.conf
# Kingbase客户端认证配置文件
# ===================================================
#
# 参考《KingbaseES安全指南》手册中的“强身份验证”章节,获取该文件的完整描述。下面是一个简短的介绍。
#
# 本文件控制: 允许哪些主机连接,可以使用哪些用户名,以及可以访问哪些数据库。
# 记录采用以下形式之一:
# local DATABASE USER METHOD [OPTIONS]
# host DATABASE USER ADDRESS METHOD [OPTIONS]
# hostssl DATABASE USER ADDRESS METHOD [OPTIONS]
# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]
# (大写项必须用实际值替换)
#
# 第一个字段是连接类型:"local"是unix域套接字,"host"是普通或ssl加密的TCP/IP套接字,
# "hostssl"是ssl加密的TCP/IP套接字,"hostnossl"是普通的TCP/IP套接字。
#
# DATABASE 可以是"all"、"sameuser"、"samerole"、"replication"、一个数据库名、
# 或者是一个逗号分隔的列表。"all" 关键字不匹配流复制 "replication"项。必须在单独的
# 记录中启用对replication流复制的访问(参见下面的示例)。
#
# USER 可以是"all"、用户名、以"+"为前缀的组名或者是一个逗号分隔的组名列表。在DATABASE和USER字段中,
# 您可以编写一个以"@"为前缀的文件名,以包含来自单独文件的用户名称。
#
# ADDRESS 指定记录匹配的主机集,它可以是一个主机名,也可以由IP地址和CIDR掩码组成。
# CIDR掩码是一个整数(0到32(IPv4)或0到128(IPv6))。以点(.)开头的主机名与实际主机名后缀匹配。
# 或者,您也可以在单独的列中写入IP地址和网络掩码,或者使用"samenet"来匹配服务器直接连接
# 到的所有子网中的所有地址。
#
# METHOD 取值为"trust"、"reject"、"md5"、"password"、"scram-sha-256"、
# "gss"、"sspi"、"ident"、"peer"、"pam"、"ldap"、"radius" 或者"cert"。
# 注意,"password"以明文发送密码;"md5" 或者"scram-sha-256"发送加密密码。
#
# OPTIONS 是一组用于身份认证的选项,格式为 NAME=VALUE。可用的选项取决于不同的验证方法,
# 我们添加了关于IP、MAC、日期时间的验证方法,可以通过设定各个值的范围来对用户登录场景进行细化限制,
# 其他身份认证选项请参考文档中的“强身份验证”章节,了解哪些选项用于哪些身份验证方法。
#
# 包含空格、逗号、引号等其他特殊字符的数据库名和用户名必须加引号。引用关键字"all"、"sameuser"、
# "samerole" 或 "replication" 会使名称失去其特殊意义,而仅仅将数据库名或用户名与该名称匹配。
#
# 本文件在服务器启动和接收到SIGHUP信号时被读取,如果你在运行的系统上编辑了本文件,必须向服务器
# 发送SIGHUP信号以使其生效,通过运行sys_ctl reload 或者执行"SELECT sys_reload_conf()"来完成。
#
# 实际配置填写在这里
# ----------------------------------
#
# 如果希望允许非本地连接,则需要添加更多的host记录。在这种情况下,还需要通过listen_addressess
# 监听配置参数,或通过-i或ih命令开关,使Kinagbase在非本地接口上监听。# TYPE DATABASE USER ADDRESS METHOD# "local" 只能用于UNIX域套接字
local all all scram-sha-256
# IPv4 本地连接:
host all all 127.0.0.1/32 scram-sha-256
host all all 0.0.0.0/0 scram-sha-256
# IPv6 本地连接:
host all all ::1/128 scram-sha-256
host all all ::0/0 scram-sha-256
# 允许具有流复制权限的用户使用localhost进行流复制连接
local replication all scram-sha-256
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256# 下面的部分是为限制连接的设置(limit to connection)
默认使用更安全的scram-sha-256加密方式,这种加密方式需要客户端支持。
2.修改sys_hba.conf文件
[root@localhost data]# vi sys_hba.conf
3.重启KingBase数据库
root@Kylin:~# systemctl restart kingbased
4.查看KingBase数据库状态
root@Kylin:~# systemctl status kingbased
总结:
1、可以通过sys_hba.conf建立客户端访问数据库服务的黑白名单。
2、在sys_hba.conf中的条目,从上到下按顺序匹配,如果有匹配记录,按照匹配记录处理;如果没有匹配记录,在没有配置( 0.0.0.0/0 )允许所有客户端时,则默认拒绝访问数据库服务。
3、在sys_hba.conf中不支持(0.0.0.0/0)reject的配置项,将会拒绝所有的tcp/ip的连接,包括已经匹配的条目。