目录
前言
日常生活工作中,我们经常遇到需要接入认证的场景,如登录网站、服务器或连接wifi、vpn等等。当一个客户端应用连接一个数据库服务器时,比如使用各种JDBC/ODBC进行数据访问或者数据库迁移场景或从服务器本机使用gsql连接等,会需要指定以哪个数据库用户名连接。认证是数据库服务器建立客户端身份的过程,并且服务器决定客户端应用(或者运行客户端应用的用户)是否被允许以请求的数据库用户名来连接。比如下面一个简单的jdbc变量例子:
DB_URL = "jdbc:postgresql://192.168.x.x:26000/demo";
USER = "dbuser";
PASS = "Gauss#xxxxx";
认证方式介绍
openGauss提供多种不同的客户端认证方式。
- 基于主机的认证:服务器端根据客户端的IP地址、用户名及要访问的数据库来查看配置文件从而判断用户是否通过认证。主机鉴权允许主机鉴权部分或全部系统用户。适用于系统所有用户或者使用Match指令的子集。
- 口令认证:包括远程连接的加密口令认证和本地连接的非加密口令认证。使用帐号和口令登录到远程主机。所有传输的数据都会被加密,但是不能保证正在连接的服务器就是需要连接的服务器。可能会有其他服务器冒充真正的服务器,也就是受到“中间人”方式的攻击。
- SSL加密:使用OpenSSL(开源安全通信库)提供服务器端和客户端安全连接的环境。用户必须为自己创建一对密钥,并把公用密钥放在需要访问的服务器上。这种级别的认证不仅加密所有传送的数据,而且避免“中间人”攻击方式。但是整个登录的过程可能需要10秒。
以上三种认证方式都需要配置“pg_hba.conf”文件。数据库安装后会自动生成默认的这个配置文件一般安装在$GAUSSHOME/data目录下,下面我们在介绍一下这个关键的配置文件。
配置文件解析
客户端认证是由一个配置文件pg_hba.conf控制,其中的hba即为host-based authentication缩写,表示基于主机的认证)。可对IPV4、IPV6 和replication privilege(逻辑复制相关,比如从openGauss迁移数据到其他数据库)的客户端接入进行设置.
示例
TYPE DATABASE USER ADDRESS METHOD
"local" is for Unix domain socket connections only
#表示只允许以安装时-U参数指定的用户从服务器本机进行连接。
local all all trust
IPv4 local connections:
#表示允许jack用户从10.10.0.50主机上连接到任意数据库,使用sha256算法对密码进行加密。
host all jack 10.10.0.50/32 sha256
#表示允许任何用户从10.10.0.0/24网段的主机上连接到任意数据库,使用sha256算法对密码进行加密,并且经过SSL加密传输。
hostssl all all 10.10.0.0/24 sha256
pg_hba.conf文件的常用格式是一组记录,每行一条。记录不能跨行。每条记录指定一种连接类型、一个客户端 IP 地址范围(如果和连接类型相关)、一个数据库名、一个用户名以及对匹配这些参数的连接使用的认证方法。
一条记录由若干用空格 和/或制表符分隔的域组成。如果域值用双引号包围,那么它可以包含空白。
在数据库、用户或地址域中 引用一个关键字(例如,all或replication)将使该词失去其特殊 含义,并且只是匹配一个有该名字的数据库、用户或主机。
第一条匹配连接类型、客户端地址、连接请求的数据库和用户名的记录将被用于执行认证。这个过程没有“落空”或者“后备”的说法:如果选择了一条记录而且认证失败,那么将不再考虑后面的记录。如果没有匹配的记录,那么访问将被拒绝。
参数解释
下面两个表对配置参数进行说明。
表 1 参数说明
表 2 认证方式
如何配置
1.以操作系统用户omm登录数据库主节点。
2.配置客户端认证方式,允许客户端以“jack”用户(需提前创建)连接到本机,此处远程连接禁止使用“omm”用户(即数据库初始化用户)。使用gs_guc 或者直接修改配置文件均可。
例如,下面示例中配置允许IP地址为10.10.0.30的客户端访问本机。
gs_guc set -N all -I all -h "host all jack 10.10.0.30/32 sha256"
-N all表示openGauss的所有主机。-I all表示主机的所有实例。-h表示指定需要在“pg_hba.conf”增加的语句。10.10.0.30/32表示只允许IP地址为10.10.0.30的主机连接。此处的IP地址不能为openGauss内的IP,在使用过程中,请根据用户的网络进行配置修改。32表示子网掩码为1的位数,即255.255.255.255。
这条命令在数据库主节点实例对应的“pg_hba.conf”文件中添加了一条规则,用于对连接数据库主节点的客户端进行鉴定。
“pg_hba.conf”文件中的每条记录可以是下面四种格式之一。
local DATABASE USER METHOD [OPTIONS]
host DATABASE USER ADDRESS METHOD [OPTIONS]
hostssl DATABASE USER ADDRESS METHOD [OPTIONS]
hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]
因为认证时系统是为每个连接请求顺序检查“pg_hba.conf”里的记录的,所以这些记录的顺序是非常关键的。在配置“pg_hba.conf”文件时,请依据通讯需求按照格式内容从上至下配置记录,优先级高的需求需要配置在前面。openGauss和扩容配置的IP优先级最高,用户手动配置的IP请放在这二者之后,如果已经进行的客户配置和扩容节点的IP在同一网段,请在扩容前删除,扩容成功后再进行配置。
pg_hba.conf中的认证策略越靠前优先级越高,使用gs_guc工具配置时会按一定规则排序将新策略插入到原有认证策略中。配置字段比较顺序为:IPADDR/HOSTNAME > HOSTTYPE > DATABASE > USERNAME,即优先比较IPADDR或HOSTNAME,如果无法区分优先级则继续比较HOSTTYPE,以此类推。对于每个配置字段,通常越严格的配置参数优先级越高、排序越靠前,越宽松的配置参数优先级越低、排序越靠后,具体如下:
IPADDR:当配置为全0时表示不限制IP,会放在指定具体某个IP地址的策略后面。
DATABASE:当配置为all时表示不限制数据库,会放在指定具体某个数据库的策略后面;当数据库配置为replication时会放在其他策略后面。
USERNAME:当配置为all时表示不限制用户,会放在指定具体某个用户的策略后面。
HOSTTYPE:local > hostssl > hostnossl > host。
因此对于认证规则的配置建议如下: 靠前的记录有比较严格的连接参数和比较弱的认证方法。靠后的记录有比较宽松的连接参数和比较强的认证方法。
一个用户要想成功连接到特定的数据库,不仅需要通过pg_hba.conf中的规则检查,还必须要有该数据库上的CONNECT权限。如果希望控制某些用户只能连接到指定数据库,赋予/撤销CONNECT权限通常比在pg_hba.conf中设置规则更为简单。
常见错误
常见的用户认证失败错误提示请参见下表。
????如果您觉得博主的文章还不错或者有帮助的话,请关注一下博主,如果点赞评论收藏就更好啦!谢谢各位大佬给予的支持!