详解GaussDB(DWS)通信安全的小妙招:连接认证机制
本文分享自华为云社区《GaussDB(DWS)数据库安全系列之通信安全》,作者:yd_262982826。
1. 前言
适用版本:【8.1.3及以上】
网络是一个开放的环境,仅仅依靠用户名和密码难以应对复杂的网络环境,针对可能存在的身份伪造的欺骗行为,以及监听通信内容的窃听行为,为了确保通信双方身份的真实性和通信内容的私密性,防止非法用户对GaussDB(DWS)系统、其他用户造成不利影响,GaussDB(DWS)建立了一套完整而严密的防护机制——连接认证机制,可以有效防止非法用户入侵。
2. 证书校验&&秘钥协商
证书校验和秘钥协商在SSL的握手阶段实现,握手协议如下:

2.1 准备证书
在华为云CA认证中心申请到服务器、客户端的证书和密钥。(如:服务器的私钥为server.key,证书为server.crt,客户端的私钥为client.key,证书为client.crt,CA根证书名称为cacert.pem。)
为了安全性,私钥通常采用了密码保护,在此可以通过gs_guc encrypt工具生成私钥的两个密码保护文件(.key.rand、.key.cipher),命令如下:
gs_guc encrypt [-M keymode] -K password -D DATADIR
说明:
- -M是加密类型,服务端选择server,客户端选择client。默认值为server。
- -K是用户私钥的密码,密码需要满足要求:长度(8≤len≤16)、复杂度(需至少包含小写字母、大写字母、数字、特殊字符中的三种)
- -D生成的密码保护文件的存放地址
2.2 服务器参数配置
通过调用工具gs_guc实现服务器配置文件postgresql.conf有关参数设置,命令如下:
gs_guc set -Z coordinator -D ${BIGDATA_DATA_HOME}/mppdb/data1/coordinator -c "ssl=on"
说明:
- -Z coordinator表示实例类型为coordinator;
- -D 数据目录
- -c 指定设置postgresql.conf文件
服务器需设置SSL相关参数如下:
| 参数 | 描述 | 取值范围 | 
|---|---|---|
| ssl | 表示是否启动SSL功能 | on:开启SSL功能 off:关闭SSL功能 默认值: on | 
| require_ssl | 服务器是否强制要求SSL连接,只有当参数ssl为on时才有效 | on:强制要求SSL连接 off:不强制要求SSL连接 默认值: off | 
| ssl_cert_file | 指定服务器证书文件 | 请以实际证书名为准。必须使用相对路径(相对于数据目录 默认值: server.crt | 
| ssl_key_file | 指定服务器私钥文件 | 请以实际的私钥名称为准。必须使用相对路径(相对于数据目录 默认值: server.key | 
| ssl_ca_file | 服务器侧CA根证书,需验证客户端证书合法性时才配置 | 请以实际CA根证书名称为准 默认值: 空,表示不对客户端的合法性进行校验 | 
| ssl_crl_file | 证书吊销列表 | 请以实际证书吊销列表名称为准 默认值: 空,表示没有吊销列表 | 
| ssl_ciphers | SSL通讯使用的加密算法,目前已升级至TLS1.3 | TLS1_3_RFC_AES_128_GCM_SHA256 TLS1_3_RFC_AES_256_GCM_SHA384 TLS1_3_RFC_CHACHA20_POLY1305_SHA256 TLS1_3_RFC_AES_128_CCM_SHA256 TLS1_3_RFC_AES_128_CCM_8_SHA256 默认值: ALL,表示允许对端使用以上所有加密算法,在满足条件的算法中按照安全强度最高的匹配 | 
2.3 客户端参数配置
客户端设置SSL连接参数,按照模式分为:单向认证和双向认证。
- 单向认证,仅客户端验证服务器证书的合法性,设置参数:PGSSLMODE、PGSSLROOTCERT; 
- 双向认证,客户端验证服务器证书的合法性,同时客户端向服务器发送证书,由服务器验证客户端证书的合法性,设置参数:PGSSLCERT、PGSSLKEY、PGSSLMODE、PGSSLROOTCERT; 
客户端需设置SSL相关参数如下:
| 环境变量 | 描述 | 取值范围 | 
|---|---|---|
| PGSSLCERT | 指定客户端证书文件 | 绝对路径,如: export PGSSLCERT=’/home/omm/client.crt’ | 
| PGSSLKEY | 指定客户端私钥文件 | 必须包含文件的绝对路径,如: export PGSSLKEY=’/home/omm/client.key’ | 
| PGSSLMODE | 设置是否和服务器进行SSL连接协商,以及指定SSL连接的优先级 | 取值及含义: disable: 只尝试非SSL连接 allow: 首先尝试非SSL连接,如果连接失败,再尝试SSL连接 prefer: 首先尝试SSL连接,如果连接失败,将尝试非SSL连接 require: 只尝试SSL连接。如果存在CA文件,则按设置成verify-ca的方式验证 verify-ca: 只尝试SSL连接,并验证服务器是否具有由可信任证书机构签发的证书 verify-full: 只尝试SSL连接,并验证服务器是否具有由可信任的证书机构签发的证书,以及验证服务器主机名是否与证书中的一致 默认值: prefer | 
| PGSSLROOTCERT | 指定客户端侧根证书,验证服务器证书有效性 | 必须包含文件的绝对路径,如: export PGSSLROOTCERT=’/home/omm/certca.pem’ | 
| PGSSLCRL | 指定证书吊销列表文件 | 必须包含文件的绝对路径,如: export PGSSLCRL=’/home/omm/sslcrl-file.crl’ | 
备注:假设证书,私钥和根证书都放在“/home/omm”目录。
3. 用户名和密码验证
用户名和密码的验证在服务器侧进行,其逻辑如下:

如果某主机需要远程连接到GaussDB(DWS),必须在GaussDB(DWS)系统的配置文件中增加此主机的信息,并且进行客户端接入认证。配置文件(pg_hba.conf)存放在数据目录里。hba(host-based authentication)表示是基于主机的认证。
通过调用工具gs_guc实现服务器配置文件pg_hba.conf有关参数设置,每次向配置文件中增加一条连接认证规则,命令如下:
gs_guc set -Z coordinator -N all -I all -h "host all jack 10.10.0.30/32 sha256"
说明:
- -Z coordinator表示实例类型为coordinator;
- -N all 表示集群的所有主机
- -I all表示主机的所有实例
- -h 表示指定需要在“pg_hba.conf”增加的语句
- all 表示允许客户端连接到任意的数据库
- jack表示允许连接数据库的用户
- 10.10.0.30/32表示只允许IP地址为10.10.0.30的主机连接
- sha256表示连接时jack用户的密码使用sha256算法加密
配置文件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]
说明:
- local:只接受通过Unix域套接字进行的连接。
- host:既接受一个普通的TCP/IP套接字连接,也接受一个SSL加密的TCP/IP套接字连接。
- hostssl:只接受一个经过SSL加密的TCP/IP套接字连接。
- hostnossl:只接受一个普通的TCP/IP套接字连接。
- DATABASE:声明记录所匹配且允许访问的数据库:a) all:表示该记录匹配所有数据库;b) sameuser:表示如果请求访问的数据库和请求的用户同名,则匹配;c) samerole/ samegroup:表示请求的用户必须是与数据库同名角色中的成员;d) 一个包含数据库名的文件或者文件中的数据库列表:文件可以通过在文件名前面加前缀@来声明;e) 特定的数据库名称或者用逗号分隔的数据库列表;
- USER:声明记录所匹配且允许访问的数据库用户。a) all:表明该记录匹配所有用户;b) 用户角色:表示匹配任何直接或者间接属于这个角色的成员;c) 一个包含用户名的文件或者文件中的用户列表:文件可以通过在文件名前面加前缀@来声明;d) 特定的数据库用户名或者用逗号分隔的用户列表;
- ADDRESS:指定与记录匹配且允许访问的IP地址范围,支持IPv4和IPv6,可以使用如下两种形式来表示:a) IP地址/掩码长度。例如:10.10.0.0/24;b) IP地址子网掩码。例如:10.10.0.0 255.255.255.0
- METHOD:声明连接时使用的认证方法。a) trust:只完全信任从服务器本机使用gsql且不指定-U参数的连接,此时不需要口令;b) reject:无条件地拒绝连接。常用于过滤某些主机;c) md5:要求客户端提供一个md5加密的口令进行认证(不推荐使用);d) sha256:要求客户端提供一个sha256算法加密的口令进行认证;e) cert:客户端证书认证模式,必须是SSL连接且客户端须提供有效的SSL证书,用户名必须与证书所有者同名;f) gss:使用基于gssapi的kerberos认证;g) ldap:ldap认证;
4. 异常处理
| 问题现象 | 解决方法 | 
|---|---|
| 用户名或密码错误 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配置文件加入用户的信息 | 
| 证书校验失败 SSL error: certificate verify failed | 说明客户端CA校验服务器证书失败,请检查客户端CA证书配置是否有误 | 
| 无效CA SSL error: tlsv1 alert unknown ca | 说明客户端发送的证书,服务器侧CA校验失败,请检查客户端证书配置是否有误 | 
| 服务器不支持SSL,但客户端要求SSL连接 server does not support SSL, but SSL was required | 说明服务器关闭SSL建连,而客户端强制要求建连SSL连接,请联系管理员开启SSL连接(或客户端采用非SSL连接) | 
| 服务器强制要求SSL连接,客户端不支持 FATAL: SSL connection is required by the database system | 说明客户端不支持SSL建连,请检查客户端SSL建连相关参数配置是否有误 | 
| 服务端认证模式选择证书认证,校验失败 FATAL: certificate authentication failed for user “user01” | 说明服务端认证模式选择证书认证,而客户端登录用户user01与证书不匹配,请检查客户端证书配置是否有误 | 
| 校验服务端证书失败 server common name “server” does not match host name | 说明客户端认证模式选择verify-full,而校验的服务器主机名与服务器证书中名称不一致,请检查“/etc/hosts”中配置的服务器主机名是否有误 | 
| 错误的版本 SSL error: wrong version number | 说明服务器无法读取到服务器证书,请联系管理员检查服务器证书配置是否有误 | 
5. 总结
连接认证机制就是GaussDB(DWS)数据安全的一套有效防护机制,连接认证机制可以防止非法用户入侵GaussDB(DWS)系统内部。GaussDB(DWS)是基于客户端/服务器(C/S)架构的系统,通信过程是基于TPC/IP协议,为了确保用户访问的可信,建立了连接认证机制:通过安全套接字层(SSL)实现通信双方的证书校验和秘钥协商从而保护网络连接,通过服务端的认证模块确保用户名和密码合法。
关于SSL,SSL(及其继任者TLS)是在应用程序级实现的,位于应用层协议(HTTP、FTP)和传输层协议(TCP)之间。如果正确地配置了SSL,则第三方观察者最多只能获得连接参数、传输频率和大概数据量,但是无法读取或更改这些信息。基于SSL的证书校验可以确保通信双方(客户端和服务端)身份的真实性、秘钥协商可以确保数据的完整性和私密性。SSL/TLS在Internet协议栈中的位置如图所示:

关于认证模块,在建立的TCP/IP通道(SSL)的基础上,根据服务器配置文件pg_hba.conf中限定的合法用户名、数据库名、IP地址以及认证方式等信息,GaussDB(DWS)认证模块对用户名和密码进行校验,确保合法用户能正常连接到GaussDB(DWS)。
详解GaussDB(DWS)通信安全的小妙招:连接认证机制的更多相关文章
- 详解GaussDB(DWS) explain分布式执行计划
		摘要:本文主要介绍如何详细解读GaussDB(DWS)产生的分布式执行计划,从计划中发现性能调优点. 前言 执行计划(又称解释计划)是数据库执行SQL语句的具体步骤,例如通过索引还是全表扫描访问表中的 ... 
- 一文详解GaussDB(DWS) 的并发管控和内存管控
		摘要:DWS的负载管理分为两层,第一层为cn的全局并发控制,第二层为资源池级别的并发控制. 本文分享自华为云社区<GaussDB(DWS) 并发管控&内存管控>,作者: fight ... 
- 详解GaussDB(DWS) 资源监控
		摘要:本文主要着重介绍资源池资源监控以及用户资源监控. 本文分享自华为云社区<GaussDB(DWS)资源监控之用户.队列资源监控>,作者: 一只菜菜鸟. GaussDB(DWS)资源监控 ... 
- Java集合详解3:一文读懂Iterator,fail-fast机制与比较器
		<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ... 
- 详解JavaScript中的Event Loop(事件循环)机制
		前言 我们都知道,javascript从诞生之日起就是一门单线程的非阻塞的脚本语言.这是由其最初的用途来决定的:与浏览器交互. 单线程意味着,javascript代码在执行的任何时候,都只有一个主线程 ... 
- IM推送保障及网络优化详解(二):如何做长连接加推送组合方案
		对于移动APP来说,IM功能正变得越来越重要,它能够创建起人与人之间的连接.社交类产品中,用户与用户之间的沟通可以产生出更好的用户粘性. 在复杂的 Android 生态环境下,多种因素都会造成消息推送 ... 
- 在windows下详解:大端对齐和小端对齐
		计算机的内存最小单位是什么?是BYTE,是字节.一个大于BYTE的数据类型在内存中存放的时候要有先后顺序. 高内存地址放整数的高位,低内存地址放整数的低位,这种方式叫倒着放,术语叫小端对齐.电脑X86 ... 
- 详解GaussDB bufferpool缓存策略,这次彻底懂了!
		摘要:华为云GaussDB(for mysql)是华为云自主研发的最新一代云原生数据库,采用计算存储分离.日志即数据的架构设计.具备极致可靠.极致性价比.多为扩展.完全可信等诸多特性. 一 .Gaus ... 
- 详解GaussDB(for MySQL)服务:复制策略与可用性分析
		摘要:本文通过介绍GaussDB(for MySQL)读写路径,分析其可用性. 简介 数据持久性和服务可用性是数据库服务的关键特征. 在实践中,通常认为拥有 3 份数据副本,就足以保证持久性. 但是 ... 
- 图文详解:阿里宠儿【小兔】RabbitMQ的养成攻略
随机推荐
- 自学一周python做的一个小游戏《大球吃小球》
			需求 1,显示一个窗口. 2,我们要做到的功能有鼠标点击屏幕生成小球. 3,生成的小球大小随机,颜色随机,向随机方向移动,速度也随机. 4,大的球碰到小球时可以吃掉小球,吃掉后会变大. 5,球碰到边界 ... 
- 探索Redis与MySQL的双写问题
			本文已收录至GitHub,推荐阅读 Java随想录 微信公众号:Java随想录 原创不易,注重版权.转载请注明原作者和原文链接 目录 双写一致问题 缓存读写策略 Cache-Aside Pattern ... 
- 【Unity3D】水面特效
			1 前言  水波特效 中通过屏幕后处理实现了环形水波效果,本文通过 Shader Graph 实现了模拟水面特效,包含以下特效细节.Shader Graph 基础知识详见→Shader Graph简 ... 
- CSS 还原拉斯维加斯球数字动画
			我的小册 <CSS 技术揭秘与实战通关>上线了,想了解更多有趣.进阶.系统化的 CSS 内容,可以猛击 - LINK. 最近大家刷抖音,是否有刷到拉斯维加斯的新地标 「Sphere」: 场 ... 
- Streamlit 快速构建交互式页面的python库
			基础介绍 streamlit 是什么 Streamlit是一个面向机器学习和数据科学团队的开源应用程序框架,通过它可以用python代码方便快捷的构建交互式前端页面.streamlit特别适合结合大模 ... 
- 【uniapp】【微信小程序】【外包杯】如何创建分包
			意义:分包可以减少小程序数次启动时的加载时间 1.创建分包的根目录 2.在page.json中,和pages节点平级的位置声明节点,用来定义分包的相关结构 3.在subpkg目录上新建页面 4.完成了 
- 一步解决Cannot resolve symbol 'WebServlet'(@WebServlet注解标红)
			右键项目名(javaweb01)->Open Module Settings Modules->Dependencies->点击Export上面的,添加Tomcat即可 
- 洛谷5789	[TJOI2017]可乐(矩阵快速幂,Floyd思想)
			题意:可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆.它每一秒都会随机触发一种行为.现在给加里敦星球城市图,在第 0秒时可乐机器人在 1号城市,问经过了 t秒,可乐机器人的行为方案数是多少 ... 
- Net 高级调试之十一:托管堆布局架构和对象分配机制
			一.简介 今天是<Net 高级调试>的第十一篇文章,这篇文章来的有点晚,因为,最近比较忙,就没时间写文章了.现在终于有点时间,继续开始我们这个系列.这篇文章我们主要介绍托管堆的架构,对象的 ... 
- windows中MySQL忘记密码
			前言: 一直都是连接公司项目数据库,许久未连接本地的数据库,密码忘记了 步骤: 进入本机安装mysql的bin目录下 暂停mysql服务 net stop mysql 设置跳过密码授权登录 my ... 
