GaussDB(DWS)数据库安全系列之通信安全

举报
矛盾的盾 发表于 2020/10/29 15:29:46 2020/10/29
【摘要】 网络是一个开放的环境,仅仅依靠用户名和密码难以应对复杂的网络环境,针对可能存在的身份伪造的欺骗行为,以及监听通信内容的窃听行为,为了确保通信双方身份的真实性和通信内容的私密性,防止非法用户对GaussDB(DWS)系统、其他用户造成不利影响,GaussDB(DWS)建立了一套完整而严密的防护机制——连接认证机制,可以有效防止非法用户入侵。


1.   简介

网络是一个开放的环境,仅仅依靠用户名和密码难以应对复杂的网络环境,针对可能存在的身份伪造的欺骗行为,以及监听通信内容的窃听行为,如何保证通信双方身份的真实性和通信内容的私密性,防止非法用户对GaussDB(DWS)系统、其他用户造成不利影响,就需要一套完整而严密的防护机制。

连接认证机制就是GaussDB(DWS)数据安全的一套有效防护机制,连接认证机制可以防止非法用户入侵GaussDB(DWS)系统内部。GaussDB(DWS)是基于客户端/服务器(C/S)架构的系统,通信过程是基于TPC/IP协议,为了确保用户访问的可信,建立了连接认证机制:通过安全套接字层(SSL)实现通信双方的证书校验和秘钥协商从而保护网络连接,通过服务端的认证模块确保用户名和密码合法。

关于SSLSSL(及其继任者TLS)是在应用程序级实现的,位于应用层协议(HTTPFTP)和传输层协议(TCP)之间。如果正确地配置了SSL,则第三方观察者最多只能获得连接参数、传输频率和大概数据量,但是无法读取或更改这些信息。基于SSL的证书校验可以确保通信双方(客户端和服务端)身份的真实性、秘钥协商可以确保数据的完整性和私密性。SSL/TLSInternet协议栈中的位置如图所示:

关于认证模块,在建立的TCP/IP通道(SSL)的基础上,根据服务器配置文件pg_hba.conf中限定的合法用户名、数据库名、IP地址以及认证方式等信息,GaussDB(DWS)认证模块对用户名和密码进行校验,确保合法用户能正常连接到GaussDB(DWS)

2.   证书校验&&秘钥协商

证书校验和秘钥协商在SSL的握手阶段实现,握手协议如下:

1.1         准备证书

在华为云CA认证中心申请到服务器、客户端的证书和密钥。(如:服务器的私钥为server.key,证书为server.crt,客户端的私钥为client.key,证书为client.crtCA根证书名称为cacert.pem。)

为了安全性,私钥通常采用了密码保护,在此可以通过gs_guc encrypt工具生成私钥的两个密码保护文件(*.key.rand*.key.cipher),命令如下:

gs_guc encrypt [-M keymode] -K password -D DATADIR

说明:

        -M是加密类型,服务端选择server,客户端选择client。默认值为server

        -K是用户私钥的密码,密码需要满足要求:长度(8len16)、复杂度(需至少包含小写字母、大写字母、数字、特殊字符中的三种)

        -D生成的密码保护文件的存放地址

1.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连接,只有当参数sslon时才有效

·       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,表示允许对端使用以上所有加密算法,在满足条件的算法中按照安全强度最高的匹配

1.3         客户端参数配置

客户端设置SSL连接参数,按照模式分为:单向认证和双向认证

单向认证,仅客户端验证服务器证书的合法性,设置参数:PGSSLMODEPGSSLROOTCERT

双向认证,客户端验证服务器证书的合法性,同时客户端向服务器发送证书,由服务器验证客户端证书的合法性,设置参数:PGSSLCERTPGSSLKEYPGSSLMODEPGSSLROOTCERT

 

客户端需设置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)存放在数据目录里。hbahost-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地址范围,支持IPv4IPv6,可以使用如下两种形式来表示:

          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:使用基于gssapikerberos认证;

          g)         ldapldap认证;

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

说明服务器无法读取到服务器证书,请联系管理员检查服务器证书配置是否有误

 


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。