配置客户端接入认证
背景信息
如果主机需要远程连接数据库,必须在数据库系统的配置文件中增加此主机的信息,并且进行客户端接入认证。配置文件(默认名称为pg_hba.conf)存放在数据库的数据目录里。hba(host-based authentication)表示是基于主机的认证。
本产品支持如下三种认证方式,这三种方式都需要配置“pg_hba.conf”文件。
- 基于主机的认证:服务器端根据客户端的IP地址、用户名及要访问的数据库来查看配置文件从而判断用户是否通过认证。
- 口令认证:包括远程连接的加密口令认证和本地连接的非加密口令认证。
- SSL加密:使用OpenSSL(开源安全通信库)提供服务器端和客户端安全连接的环境。
“pg_hba.conf”文件的格式是一行写一条信息,表示一个认证规则,空白和注释(以#开头)被忽略。
每个认证规则是由若干空格和/,空格和制表符分隔的字段组成。如果字段用引号包围,则它可以包含空白。一条记录不能跨行存在。
操作步骤
1.以操作系统用户omm登录数据库主节点。
2.配置客户端认证方式,允许客户端以“jack”用户连接到本机,此处远程连接禁止使用“omm”用户(即数据库初始化用户)。
例如,下面示例中配置允许IP地址为10.10.0.30的客户端访问本机。
gs_guc set -N all -I all -h "host all jack 10.10.0.30/32 sha256"
说明:
- 使用“jack”用户前,需先本地连接数据库,并在数据库中使用如下语句建立“jack”用户:
CREATE USER jack PASSWORD 'Test@123';
>
>- -N all表示openGauss的所有主机。
>
>- -I all表示主机的所有实例。
>
>- -h表示指定需要在“pg_hba.conf”增加的语句。
>
>- all表示允许客户端连接到任意的数据库。
>
>- jack表示连接数据库的用户。
>
>- 10.10.0.30/32表示只允许IP地址为10.10.0.30的主机连接。此处的IP地址不能为openGauss内的IP,在使用过程中,请根据用户的网络进行配置修改。32表示子网掩码为1的位数,即255.255.255.255。
>
>- sha256表示连接时jack用户的密码使用sha256算法加密。
这条命令在数据库主节点实例对应的“pg_hba.conf”文件中添加了一条规则,用于对连接数据库主节点的客户端进行鉴定。
“pg_hba.conf”文件中的每条记录可以是下面四种格式之一,四种格式的参数说明请参见[配置文件参考](配置文件参考.md)。
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”里的记录的,所以这些记录的顺序是非常关键的。
>![](public_sys-resources/icon-note.gif) **说明:**
>在配置“pg_hba.conf”文件时,请依据通讯需求按照格式内容从上至下配置记录,优先级高的需求需要配置在前面。openGauss和扩容配置的IP优先级最高,用户手动配置的IP请放在这二者之后,如果已经进行的客户配置和扩容节点的IP在同一网段,请在扩容前删除,扩容成功后再进行配置。
因此对于认证规则的配置建议如下:
靠前的记录有比较严格的连接参数和比较弱的认证方法。
靠后的记录有比较宽松的连接参数和比较强的认证方法。
>![](public_sys-resources/icon-note.gif) **说明:**
>- 一个用户要想成功连接到特定的数据库,不仅需要通过pg_hba.conf中的规则检查,还必须要有该数据库上的CONNECT权限。如果希望控制某些用
户只能连接到指定数据库,赋予/撤销CONNECT权限通常比在pg_hba.conf中设置规则更为简单。
>- 对应openGauss外部客户端连接,trust为不安全的认证方式,请将认证方式设置为sha256。
## 异常处理<a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_s8e3246e8f8a749679fddc812719380b9"></a>
用户认证失败有很多原因,通过服务器返回给客户端的提示信息,可以看到用户认证失败的原因。常见的错误提示请参见[表1](#zh-cn_topic_0237121090_zh-cn_topic_0059778856_t451d737a3917467b9691ba1306766cdb)。
**表 1** 错误提示
<a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_t451d737a3917467b9691ba1306766cdb"></a>
<table><thead align="left"><tr id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_r9b3ab3881ff84930b74136d5bce3e1ee"><th class="cellrowborder" valign="top" width="50.23%" id="mcps1.2.3.1.1"><p id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_a116106eff28b4f7f958971720e7f74d8"><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_a116106eff28b4f7f958971720e7f74d8"></a><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_a116106eff28b4f7f958971720e7f74d8"></a>问题现象</p>
</th>
<th class="cellrowborder" valign="top" width="49.769999999999996%" id="mcps1.2.3.1.2"><p id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_ac5d55da7f96a4485beee9fbec12a69e9"><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_ac5d55da7f96a4485beee9fbec12a69e9"></a><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_ac5d55da7f96a4485beee9fbec12a69e9"></a>解决方法</p>
</th>
</tr>
</thead>
<tbody><tr id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_r70a8d7b07c7445a4b5cbfb02eb90a9f1"><td class="cellrowborder" valign="top" width="50.23%" headers="mcps1.2.3.1.1 "><p id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_aaf294286227d4eb4bb17535e3268436d"><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_aaf294286227d4eb4bb17535e3268436d"></a><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_aaf294286227d4eb4bb17535e3268436d"></a>用户名或密码错误:</p>
<pre class="screen" id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_s44fb7ea02c7448cf984be0ac82238605"><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_s44fb7ea02c7448cf984be0ac82238605"></a><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_s44fb7ea02c7448cf984be0ac82238605"></a>FATAL: invalid username/password,login denied</pre>
</td>
<td class="cellrowborder" valign="top" width="49.769999999999996%" headers="mcps1.2.3.1.2 "><p id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_ac98f9b22e2f647159c924583e5704413"><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_ac98f9b22e2f647159c924583e5704413"></a><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_ac98f9b22e2f647159c924583e5704413"></a>这条信息说明用户名或者密码错误,请检查输入是否有误。</p>
</td>
</tr>
<tr id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_r3aff35e802b449ecaf22ee38ecbdacfd"><td class="cellrowborder" valign="top" width="50.23%" headers="mcps1.2.3.1.1 "><p id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_aa14376fd6e3446e0a49ff0a09bd7582c"><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_aa14376fd6e3446e0a49ff0a09bd7582c"></a><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_aa14376fd6e3446e0a49ff0a09bd7582c"></a>连接的数据库不存在:</p>
<pre class="screen" id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_s2f245ea33081497a8c2115dcc1bad132"><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_s2f245ea33081497a8c2115dcc1bad132"></a><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_s2f245ea33081497a8c2115dcc1bad132"></a>FATAL: database "TESTDB" does not exist</pre>
</td>
<td class="cellrowborder" valign="top" width="49.769999999999996%" headers="mcps1.2.3.1.2 "><p id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_afa4bfedb62f94c90bef9e836e51d72a0"><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_afa4bfedb62f94c90bef9e836e51d72a0"></a><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_afa4bfedb62f94c90bef9e836e51d72a0"></a>这条信息说明尝试连接的数据库不存在,请检查连接的数据库名输入是否有误。</p>
</td>
</tr>
<tr id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_r995569b284de488798e7226eafd08919"><td class="cellrowborder" valign="top" width="50.23%" headers="mcps1.2.3.1.1 "><p id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_a301ff52d43ed435c98046dd360a8aec5"><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_a301ff52d43ed435c98046dd360a8aec5"></a><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_a301ff52d43ed435c98046dd360a8aec5"></a>未找到客户端匹配记录:</p>
<pre class="screen" id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_s41849e5ee04042d19c3e4143a5361eb9"><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_s41849e5ee04042d19c3e4143a5361eb9"></a><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_s41849e5ee04042d19c3e4143a5361eb9"></a>FATAL: no pg_hba.conf entry for host "10.10.0.60", user "ANDYM", database "TESTDB"</pre>
</td>
<td class="cellrowborder" valign="top" width="49.769999999999996%" headers="mcps1.2.3.1.2 "><p id="zh-cn_topic_0237121090_zh-cn_topic_0059778856_aa9c25283ca1c45c4a9387c5c0a63ca9c"><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_aa9c25283ca1c45c4a9387c5c0a63ca9c"></a><a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_aa9c25283ca1c45c4a9387c5c0a63ca9c"></a>这条信息说明已经连接了服务器,但服务器拒绝了连接请求,因为没有在它的pg_hba.conf配置文件里找到匹配的记录。请联系数据库管理员在pg_hba.conf配置文件加入用户的信息。</p>
</td>
</tr>
</tbody>
</table>
## 示例<a name="zh-cn_topic_0237121090_zh-cn_topic_0059778856_s6ea1dd5218564334b1c8b6a343273c40"></a>
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 #表示允许任何用户从10.10.0.0/24网段的主机上连接到任意数据库,使用Kerberos认证方式,当前版本暂不支持客户端kerberos认证。 host all all 10.10.0.0/24 gss include_realm=1 krb_realm=HADOOP.COM