openGauss数据库客户端接入认证详解

语言: CN / TW / HK

目录

前言

认证方式

配置文件解析

示例

参数解释

如何配置

常见错误


前言

日常生活工作中,我们经常遇到需要接入认证的场景,如登录网站、服务器或连接wifi、vpn等等。当一个客户端应用连接一个数据库服务器时,比如使用各种JDBC/ODBC进行数据访问或者数据库迁移场景或从服务器本机使用gsql连接等,会需要指定以哪个数据库用户名连接。认证是数据库服务器建立客户端身份的过程,并且服务器决定客户端应用(或者运行客户端应用的用户)是否被允许以请求的数据库用户名来连接。比如下面一个简单的jdbc变量例子:

DB_URL = "jdbc:postgresql://192.168.x.x:26000/demo";

USER = "dbuser";

PASS = "Gauss#xxxxx";

认证方式介绍

openGauss提供多种不同的客户端认证方式。

  1. 基于主机的认证:服务器端根据客户端的IP地址、用户名及要访问的数据库来查看配置文件从而判断用户是否通过认证。主机鉴权允许主机鉴权部分或全部系统用户。适用于系统所有用户或者使用Match指令的子集。
  2. 口令认证:包括远程连接的加密口令认证和本地连接的非加密口令认证。使用帐号和口令登录到远程主机。所有传输的数据都会被加密,但是不能保证正在连接的服务器就是需要连接的服务器。可能会有其他服务器冒充真正的服务器,也就是受到“中间人”方式的攻击。
  3. 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 参数说明

参数名称

描述

取值范围

local

表示这条记录只接受通过Unix域套接字进行的连接。没有这种类型的记录,就不允许Unix域套接字的连接。

只有在从服务器本机使用gsql连接且在不指定-h参数的情况下,才是通过Unix域套接字连接。

-

host

表示这条记录既接受一个普通的TCP/IP套接字连接,也接受一个经过SSL加密的TCP/IP套接字连接。

-

hostssl

表示这条记录只接受一个经过SSL加密的TCP/IP套接字连接。

用SSL进行安全的连接,需要配置申请数字证书并配置相关参数,详细信息请参见产品文档用SSL进行安全的TCP/IP连接

hostnossl

表示这条记录只接受一个普通的TCP/IP套接字连接。

-

DATABASE

声明记录所匹配且允许访问的数据库。

  • all:表示该记录匹配所有数据库。
  • sameuser:表示如果请求访问的数据库和请求的用户同名,则匹配。
  • samerole:表示请求的用户必须是与数据库同名角色中的成员。
  • samegroup:与samerole作用完全一致,表示请求的用户必须是与数据库同名角色中的成员。
  • 一个包含数据库名的文件或者文件中的数据库列表:文件可以通过在文件名前面加前缀@来声明。文件中的数据库列表以逗号或者换行符分隔。
  • 特定的数据库名称或者用逗号分隔的数据库列表。

值replication表示如果请求一个复制链接,则匹配,但复制链接不表示任何特定的数据库。如需使用名为replication的数据库,需在database列使用记录“replication”作为数据库名。

USER

声明记录所匹配且允许访问的数据库用户。

  • all:表明该记录匹配所有用户。
  • +用户角色:表示匹配任何直接或者间接属于这个角色的成员。

+表示前缀符号。

  • 一个包含用户名的文件或者文件中的用户列表:文件可以通过在文件名前面加前缀@来声明。文件中的用户列表以逗号或者换行符分隔。
  • 特定的数据库用户名或者用逗号分隔的用户列表。

ADDRESS

指定与记录匹配且允许访问的IP地址范围。

支持IPv4和IPv6,可以使用如下两种形式来表示:

  • IP地址/掩码长度。例如,10.10.0.0/24
  • IP地址子网掩码。例如,10.10.0.0 255.255.255.0

以IPv4格式给出的IP地址会匹配那些拥有对应地址的IPv6连接,比如127.0.0.1将匹配IPv6地址 ::ffff:127.0.0.1。

典型例子: ​​172.20.143.89/32​​​用于一个主机,​​172.20.143.0/24​​​用于一个小型网络, 10.6.0.0/16用于一个大型网络。 0.0.0.0/0表示所有 IPv4 地址,并且::0/0表示所有 IPv6 地址。要指定一个单一主机,IPv4 用一个长度为 32 的 CIDR掩码或者 IPv6 用 长度为 128 的 CIDR 掩码。在一个网络地址中,不要省略结尾的零。

METHOD

声明连接时使用的认证方法。

本产品支持如下几种认证方式,详细解释请参见表2。

trustrejectmd5sha256、sm3、cert、gss

表 2 认证方式

认证方式

说明

trust

采用这种认证模式时,本产品只完全信任从服务器本机使用gsql且不指定-U参数的连接,此时不需要口令。

trust认证对于单用户工作站的本地连接是非常合适和方便的,通常不适用于多用户环境。如果想使用这种认证方法,可利用文件系统权限限制对服务器的Unix域套接字文件的访问。要使用这种限制有两个方法:

设置参数unix_socket_permissionsunix_socket_group

设置参数unix_socket_directory,将Unix域套接字文件放在一个经过恰当限制的目录里。

设置文件系统权限只能Unix域套接字连接,它不会限制本地TCP/IP连接。为保证本地TCP/IP安全,openGauss不允许远程连接使用trust认证方法。

reject

无条件地拒绝连接。常用于过滤某些主机。

md5

要求客户端提供一个md5加密的口令进行认证。openGauss保留md5认证和密码存储,是为了便于第三方工具的使用。

MD5加密算法安全性低,存在安全风险,建议使用更安全的加密算法。

sha256

要求客户端提供一个sha256算法加密的口令进行认证,该口令在传送过程中结合salt(服务器发送给客户端的随机数)的单向sha256加密,增强了安全性。

sm3

要求客户端提供一个sm3算法加密口令进行认证,该口令在传送过程中结合salt(服务器发送给客户端的随机数)的单项sm3的加密,增加了安全性。

cert

客户端证书认证模式,此模式需进行SSL连接配置且需要客户端提供有效的SSL证书,不需要提供用户密码。

该认证方式只支持hostssl类型的规则。

gss

使用基于gssapi的kerberos认证。

该认证方式依赖kerberos server等组件,仅支持openGauss内部通信认证。当前版本暂不支持外部客户端通过kerberos认证连接。

开启openGauss内部kerberos认证会使增加内部节点建连时间,即影响首次涉及内部建连的SQL操作性能,内部连接建立好后, 后续操作不受影响。

peer

获取客户端所在操作系统用户名,并检查与数据库初始用户名是否一致。此方式只支持local模式本地连接,并支持通过配置pg_ident.conf建立操作系统用户与数据库用户映射关系。

假设操作系统用户名为omm,数据库初始用户为dbAdmin,在pg_hba.conf中配置local模式为peer认证:

""local   all    all        peer    map=mymap

其中map=mymap指定使用的用户名映射,并在pg_ident.conf中添加映射名称为mymap的用户名映射如下:

""# MAPNAME       SYSTEM-USERNAME         PG-USERNAME

mymap                omm                                  dbAdmin

说明:

通过gs_guc reload方式修改pg_hba.conf配置可以立即生效无需重启数据库。直接编辑修改pg_ident.conf配置后下次连接时自动生效无需重启数据库。

如何配置

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中设置规则更为简单。

常见错误

常见的用户认证失败错误提示请参见下表

问题现象

解决方法

用户名或密码错误:

""FATAL: invalid username/password,login denied

这条信息说明用户名或者密码错误,请检查输入是否有误。

连接的数据库不存在:

""FATAL: database "TESTDB" does not exist

这条信息说明尝试连接的数据库不存在,请检查连接的数据库名输入是否有误。

未找到客户端匹配记录:

""FATAL: no pg_hba.conf entry for host "10.10.0.60", user "ANDYM", database "TESTDB"

这条信息说明已经连接了服务器,但服务器拒绝了连接请求,因为没有在它的pg_hba.conf配置文件里找到匹配的记录。请联系数据库管理员在pg_hba.conf配置文件加入用户的信息。

在可信方法下禁止远程连接。

“FATAL: Forbid remote connection with trust method!”

使用推荐的sha256认证。

使用的连接工具不支持sha256

none of the server’s SASL authentication mechanisms are supported

修改为使用md5方式连接。

出于安全考虑,openGauss默认加密方式为sha256,因此需要同步修改数据库的加密方式:gs_guc set -N all -I all -c "password_encryption_type=1" ,即支持md5和sha256,重启openGauss生效后需要创建用md5方式加密口令的用户。同时修改pg_hba.conf,将客户端连接方式修改为md5。

没有复制连接的pg_hba.conf的配置

FATAL: no pg_hba.conf entry for replication connection from host "127.0.0.1", user "tuser", SSL off

修改pg_hba.conf的 replication privilege部分添加应记录. 然后重新reload

🍒如果您觉得博主的文章还不错或者有帮助的话,请关注一下博主,如果点赞评论收藏就更好啦!谢谢各位大佬给予的支持!