ITPub博客

首页 > 数据库 > > 设置数据库连接-用SSL进行安全的TCP/IP连接

设置数据库连接-用SSL进行安全的TCP/IP连接

作者:GaussDB_数据库 时间:2020-01-07 17:19:57 0 删除 编辑

为了保护敏感数据在Internet上传输的安全性,GaussDB 100支持通过SSL加密客户端和服务器之间的通讯。

前提条件

从CA认证中心申请到正式的服务器、客户端的证书和密钥。当前只支持pem格式的SSL证书。(假设服务器的私钥为server.key,证书为server.crt,客户端的私钥为client.key,证书为client.crt,CA根证书名称为cacert.pem。)

背景信息

GaussDB 100支持SSL协议标准,SSL协议是一种安全性更高的协议标准,它加入了数字签名和数字证书来实现客户端和服务器的双向身份验证,保证了通信双方更加安全的数据传输。

GaussDB 100支持TLSv1.2协议标准,TLSv1.2协议是一种安全性更高的协议标准,他加入了数字签名和数字证书来实现客户端和服务器的双向身份验证,保证了通信双方更加安全的数据传输。

GaussDB 100支持TLSv1.3协议标准,TLSv1.3协议是在TLSv1.2版本基础上进行的升级和改造。相比于之前的版本,TLSv1.3协议具有更快的访问速度和更高的安全性。

注意事项

该配置只针对本节点生效,不能分发到其他节点,因此需要在分布式数据库的各个节点分别开启SSL功能。

操作步骤

假设以“/gaussdb/data/data_cn”路径为例,在实际操作中请使用实际路径进行替换。

  1. 以DBA身份登录GaussDB 100数据库。
    zsql
    conn omm/gaussdb_123@192.168.0.1:8000
    omm/gaussdb_123为安装后创建的系统管理员和其默认密码,192.168.0.1为CN所在的服务器IP地址,8000为连接的端口号。

  2. 配置SSL认证相关的数字证书参数,具体要求请参见表1。

    • 配置服务器端参数,参数设置完成后重启生效。
      alter system set SSL_CA = '/gaussdb/data/data_cn/cacert.pem';
      alter system set SSL_CERT = '/gaussdb/data/data_cn/server.crt';
      alter system set SSL_KEY = '/gaussdb/data/data_cn/server.key';
      alter system set SSL_VERIFY_PEER = TRUE;
    • 配置客户端参数。
      export ZSQL_SSL_CERT="/gaussdb/data/data_cn/client.crt"
      export ZSQL_SSL_KEY="/gaussdb/data/data_cn/client.key"
      export ZSQL_SSL_CA="/gaussdb/data/data_cn/cacert.pem"
      export ZSQL_SSL_MODE="preferred"
    • 从安全性考虑,建议使用双向认证方式。
    • 配置客户端环境变量,必须包含文件的绝对路径。
    • 配置客户端客户端参数时候,需要添加到用户shell初始化使用的.bashrc类似的配置文件中,且当次配置后,需要使用source .bashrc的方式使客户端参数生效。
    • 若服务器端参数SSL_VERIFY_PEER 设置为TRUE,需要强制配置客户端参数。
    表1 认证方式

    认证方式

    含义

    配置服务器端参数

    配置客户端环境变量

    维护建议

    双向认证(推荐)

    客户端验证服务器证书的有效性,同时服务器端也要验证客户端证书的有效性,只有认证成功,连接才能建立。

    将服务器证书、服务器私钥、废弃证书和根证书拷贝到$GAUSSHOME下,并设置如下参数:

    • SSL_CA
    • SSL_CERT
    • SSL_KEY
    • SSL_CRL(可选)
    • SSL_KEY_PASSWORD(可选)
    • SSL_VERIFY_PEER = TRUE

    设置如下环境变量:

    • ZSQL_SSL_CERT
    • ZSQL_SSL_KEY
    • ZSQL_SSL_CA
    • ZSQL_SSL_CRL(可选)
    • ZSQL_SSL_MODE

    该方式应用于安全性要求较高的场景。使用此方式时,建议设置客户端的ZSQL_SSL_MODE变量为VERIFY_CA或VERIFY_FULL,服务器端的认证方式设定为SSL_VERIFY_PEER=TRUE,这样只有某些授权的客户端和服务器才能使用GaussDB 100服务器进行数据通信,确保了网络数据的安全性。如果设置SSL_VERIFY_PEER=FALSE,表示允许客户端不提供设备证书创建SSL连接,不推荐使用。

    单向认证

    客户端只验证服务器证书的有效性,而服务器端不验证客户端证书的有效性。服务器加载证书信息并发送给客户端,客户端使用根证书来验证服务器端证书的有效性。

    将服务器端证书和私钥文件拷贝到$GAUSSHOME下,并设置如下参数:

    • SSL_CERT
    • SSL_KEY

    设置如下环境变量:

    • ZSQL_SSL_CA
    • ZSQL_SSL_CRL(可选)
    • ZSQL_SSL_MODE

    为防止基于TCP链接的欺骗,建议使用SSL证书认证功能。除配置服务器证书和私钥文件外,建议客户端使用ZSQL_SSL_MODE变量为VERIFY_CA或VERIFY_FULL方式连接。

  3. 以root用户身份登录GaussDB 100所在服务器,修改服务器密钥的权限。

    将证书server.crt、server.key、cacert.pem拷贝到/gaussdb/data/data_cn/目录下。需保证权限为600,属主为omm,属组为dbgrp。执行如下命令修改权限:
    cd /gaussdb/data/data_cn/
    chown omm:dbgrp server.crt server.key cacert.pem
    chmod 600 server.crt server.key cacert.pem

  4. 切换为omm。
    su - omm

  5. 如果配置了加密的私钥证书,还需要使用zencrypt工具生成加密密码密文(SSL_KEY_PASSWORD)。

    1. 执行如下命令,生成加密密码密文(SSL_KEY_PASSWORD)。
      zencrypt -e aes256 -f jQ4IAgxiJR1ezCPrvtZLUQ== -k 
      8Vw4Gm2Ktu7B8XIzTlVRK9EOH+lpSNbIlhfVbaJ0RDdbgyUyHsYT6UxYGSEbZg7BXki6gSP8slEU8haWxiUgNg==
      --输入私钥证书的显示密码(以Aa123456为例),生成密码加密密文。
      Please enter password to encrypt:
      ********
      Please input password again:
      ********
      Cipher: PLFJgfZwLSOJFRp6o7qsj604fFwPEu2MLxH7m/F/aMg=
      • -e指使用AES算法(256位密钥)对产生的私钥加密,-f指的是_FACTOR_KEY的值,-k指的是LOCAL_KEY的值。-f和-K的值可参考配置SSL私钥加密密钥章节。
      • 私钥证书属于安全敏感数据,强烈建议用户使用加密的私钥证书加密,并定期更新GaussDB 100加密密钥,保证数据安全性。
      • 加密密码复杂度与数据库密码要求一致。
      • 建议私钥加密长度不少于2048。
      • 重启集群操作会导致用户执行操作中断,请在操作之前规划好合适的执行窗口。
    2. 数据库实例运行时,更新SSL私钥证书密码密文(以Aa123456为例),或者更新配置文件对应的配置选项:
      alter system set SSL_KEY_PASSWORD = 'PLFJgfZwLSOJFRp6o7qsj604fFwPEu2MLxH7m/F/aMg=';

  6. 重启GaussDB 100服务器使配置生效。
    gs_om -t stop

    如果需要配置环境变量,则需要重启daemon进程,原因是daemon是父进程,后续拉起的agent,下发的shell命令都是继承daemon的环境变量。

    如果要重启daemon进程,可以kill -9 +PID,这里有crontab任务会定时拉起daemon进程,需等待所有集群环境上的daemon进程被拉起后(大约1分钟),再执行以下操作。

    输入“ps ux| grep daemon”命令,即可查看daemon进程是否被拉起。输出结果包含“/data/gaussdb/app/zcluster/cm/daemon ”字样,表示进程已经被拉起。

    gs_om -t start

开启/关闭SSL功能

  • 开启SSL功能

参考操作步骤中配置服务端SSL相关参数,重启数据库之后会校验相关参数和证书有效性,校验成功之后会自动开启SSL功能。

检查SSL功能是否开启,可以用zsql工具以omm用户连接到服务器,执行“show parameter HAVE_SSL”命令,查询SSL状态,如果HAVE_SSL参数的RUNTIME_VALUE字段值为TRUE,则表明SSL开启成功,否则查看服务器运行日志文件,检查SSL开启失败原因。

SQL> SHOW PARAMETER HAVE_SSL
NAME DATATYPE VALUE RUNTIME_VALUE EFFECTIVE
---------------------------------------------------------------- -------------------- ---------------------------------------------------------------- -------------------- --------------------
HAVE_SSL GS_TYPE_BOOLEAN FALSE TRUE reboot
  • 关闭SSL功能

方式一:数据库实例运行时,更改SSL_CA、SSL_CERT、SSL_KEY和SSL_KEY_PASSWORD等参数,设置为空值,然后重启数据库,可以关闭服务端SSL功能。

alter system set SSL_CA = '';
alter system set SSL_CERT = '';
alter system set SSL_KEY = '';
alter system set SSL_KEY_PASSWORD = '';

方式二:删除配置文件中SSL相关参数,或者删除磁盘上的SSL证书,然后重启数据库也可以关闭SSL功能。

相关参考

在GaussDB 100服务器端的zengine.ini文件中配置相关参数,详细信息请参见表2。

表2 服务器参数

参数

描述

取值范围

SSL_VERIFY_PEER

表示是否允许无证书客户端建立SSL连接。该参数需要和SSL_CA配合使用,配置SSL_CA时,会请求客户端证书,如果客户端未提供证书,则根据SSL_VERIFY_PEER参数决定是否拒绝连接。

  • TRUE:客户端必需提供有效的证书来创建SSL连接。
  • FALSE:客户端可以不提供SSL证书。

默认值:FALSE,表示允许无证书客户端建立SSL连接。

SSL_CERT

指定服务器证书文件,包含服务器端的公钥。服务器证书用以表明服务器身份的合法性,公钥将发送给对端用来对数据进行加密。

请以实际的证书名为准。建议设置为设备证书的绝对路径,否则可能导致证书加载失败。

默认值:空,表示没有设备证书。

SSL_KEY

指定服务器私钥文件,用以数字签名和对公钥加密的数据进行解密。

请以实际的服务器私钥名称为准。建议设置为私钥文件的绝对路径,否则可能导致私钥加载失败。

默认值:空,表示没有私钥。

SSL_CA

CA服务器的根证书。此参数可选择配置,需要验证客户端证书的合法性时才需要配置。

请以实际的CA服务器根证书名称为准。建立设置为CA证书的绝对路径,否则可能导致证书加载失败。

默认值:空,表示不对客户端的身份进行校验。

说明:CA证书要求是X.509V3数字证书,且“基本限制”扩展域标明为“CA”,“密钥用法”扩展域包含“证书签名”,如果该CA证书还用于证书吊销,“密钥用法”扩展域还要包含“吊销签名”。

SSL_CRL

证书吊销列表,如果客户端证书在该列表中,则当前客户端证书被视为无效证书。

请以实际的证书吊销列表名称为准。建议设置为吊销证书的绝对路径,否则可能导致证书加载失败。

默认值:空,表示没有吊销列表。

SSL_CIPHER

SSL通讯使用的加密算法。

GaussDB 100支持的加密算法的详细信息请参见表4。

默认值:空,表示允许对端使用GaussDB 100支持的所有加密算法,最后满足条件的算法按照安全强度进行排序。

SSL_KEY_PASSWORD

服务器私钥密码密文,如果私钥加密存储,通过该参数设置密文。

请以实际加密密文为准。

默认值:空,表示私钥文件没有加密。

SSL_EXPIRE_ALERT_THRESHOLD

SSL证书过期告警阈值,若启用SSL,在过期时间小于此阈值的时候会有日志提醒。数据库启动后会周期性(7天)检查SSL证书过期情况。

取值范围[7-180]。

默认值:30,单位:天

在GaussDB 100客户端配置SSL认证相关的环境变量,详细信息请参见表3。

客户端环境变量的路径以“/gaussdb/data/data_cn”为例,在实际操作中请使用实际路径进行替换。

表3 客户端参数

环境变量

描述

取值范围

ZSQL_SSL_CERT

指定客户端证书文件,包含客户端的公钥。客户端证书用以表明客户端身份的合法性,公钥将发送给对端用来对数据进行加密。

必须包含文件的绝对路径,如:
复制
export ZSQL_SSL_CERT='/gaussdb/data/xxx/client.crt'

默认值:空

ZSQL_SSL_KEY

指定客户端私钥文件,用以数字签名和对公钥加密的数据进行解密。

必须包含文件的绝对路径,如:
复制
export ZSQL_SSL_KEY='/gaussdb/data/xxx/client.key'

默认值:空

ZSQL_SSL_MODE

设置是否和服务器进行SSL连接协商,以及指定SSL连接的优先级。

取值及含义:

  • disabled:只尝试非SSL连接。
  • preferred:如果服务端支持SSL连接,优先选择SSL连接,否则选择非SSL连接。
  • required:只尝试SSL连接。如果存在CA文件,则按设置成verify_ca的方式验证。
  • verify_ca:只尝试SSL连接,并且验证服务器是否具有由可信任的证书机构签发的证书。
  • verify_full:只尝试SSL连接,并且验证服务器是否具有由可信任的证书机构签发的证书,以及验证服务器主机名是否与证书中的一致。

默认值:preferred

ZSQL_SSL_CA

指定为客户端颁发证书的根证书文件,根证书用于验证服务器证书的有效性。

必须包含文件的绝对路径,如:
复制
export ZSQL_SSL_CA='/gaussdb/data/xxx/root.crt'

默认值:空

ZSQL_SSL_CRL

指定证书吊销列表文件,用于验证服务器证书是否在废弃证书列表中,如果在,则服务器证书将会被视为无效证书。

必须包含文件的绝对路径,如:
复制
export ZSQL_SSL_CRL='/gaussdb/data/xxx/root.crl'

默认值:空

ZSQL_SSL_CIPHER

SSL通讯使用的加密算法。

GaussDB 100支持的加密算法的详细信息请参见表4。

默认值:空,表示允许对端使用GaussDB 100支持的所有加密算法,最后满足条件的算法按照安全强度进行排序。

ZSQL_SSL_KEY_PASSWD

客户端私钥密码密文,如果私钥加密存储,通过该参数设置密文。

请以实际加密密文为准。

默认值:空,表示私钥文件没有加密。

GaussDB 100 SSL传输支持一系列不同强度的加密和认证算法。用户可以通过修改zengine.ini中的SSL_CIPHER参数指定数据库服务器使用的加密算法。目前GaussDB 100 SSL支持的加密算法如表4所示。

表4 加密算法

加密强度

安全程度

加密算法描述

支持版本

说明

stronger

high

DHE-RSA-AES256-GCM-SHA384

TLS1.2及其以下版本

适用于RSA加密算法生成的证书

stronger

high

DHE-RSA-AES128-GCM-SHA256

TLS1.2及其以下版本

stronger

high

ECDHE-ECDSA-AES256-GCM-SHA384

TLS1.2及其以下版本

适用于ECDSA加密算法生成证书

stronger

high

ECDHE-ECDSA-AES128-GCM-SHA256

TLS1.2及其以下版本

stronger

high

ECDHE-RSA-AES256-GCM-SHA384

TLS1.2及其以下版本

适用于RSA加密算法生成的证书

stronger

high

ECDHE-RSA-AES128-GCM-SHA256

TLS1.2及其以下版本

stronger

high

DHE-DSS-AES256-GCM-SHA384

TLS1.2及其以下版本

适用于DSA加密算法生成的证书

stronger

high

DHE-DSS-AES128-GCM-SHA256

TLS1.2及其以下版本

stronger

medium

DHE-RSA-AES256-SHA256

TLS1.2及其以下版本

适用于RSA加密算法生成的证书

stronger

medium

DHE-RSA-AES128-SHA256

TLS1.2及其以下版本

stronger

medium

DHE-DSS-AES256-SHA256

TLS1.2及其以下版本

适用于DSA加密算法生成的证书

stronger

medium

DHE-DSS-AES128-SHA256

TLS1.2及其以下版本

stronger

high

DHE-RSA-AES256-CCM

TLS1.2及其以下版本

适用于RSA加密算法生成的证书

stronger

high

DHE-RSA-AES128-CCM

TLS1.2及其以下版本

stronger

high

TLS_AES_256_GCM_SHA384

TLS1.3

适用于RSA或者ECDSA加密算法生成的证书

stronger

high

TLS_CHACHA20_POLY1305_SHA256

TLS1.3

适用于RSA或者ECDSA加密算法生成的证书

stronger

high

TLS_AES_128_GCM_SHA256

TLS1.3

适用于RSA或者ECDSA加密算法生成的证书

stronger

high

TLS_AES_128_CCM_8_SHA256

TLS1.3

适用于RSA或者ECDSA加密算法生成的证书

stronger

high

TLS_AES_128_CCM_SHA256

TLS1.3

适用于RSA或者ECDSA加密算法生成的证书

  • GaussDB 100 SSL目前只支持加密强度在strong以上的加密算法。
  • GaussDB 100 1.0.1 版本之后SSL支持TLS1.3版本,TLS1.3版本不支持DSA加密算法生成的证书。
  • TLS1.3算法适用于RSA或者ECDSA加密算法生成的证书:

    (1)当客户端和服务端同时支持TLS1.3时,混合配置TLS1.2和TLS1.3算法,此时TLS1.2算法不实际生效,SSL会优先选择使用TLS1.3协议;

    (2)当客户端和服务端同时支持TLS1.3时,只配置TLS1.2算法,SSL会优先选择使用TLS1.2协议;

    (3)当客户端或者服务端任何一方不支持TLS1.3时,SSL会协商为TLS1.2协议,此时配置的TLS1.3算法不实际生效。

  • 配置参数SSL_CIPHER的默认值为空,表示支持上表中的所有加密算法。如果对加密算法没有特殊要求,建议用户使用该默认值。
  • 如指定以上多种加密,加密算法之间需要使用冒号分割。如在zengine.ini设置SSL_CIPHER=DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256。

创建自认证证书

介绍如何使用openssl创建自认证数字证书,在测试环境下,用户可以用此数字证书进行测试。在客户的运行环境中,请使用从CA认证中心申请的数字证书。

如果操作系统默认安装了openssl组件,则支持创建自认证证书;如果操作系统未安装openssl组件,则需要用户先安装openssl组件后,才能创建自认证证书。

SUSE 10/11默认安装了openssl组件,下面以SUSE介绍创建服务器自认证证书的相关操作。SUSE操作系统openssl默认安装路径是“/usr/share/ssl”。

  • 创建自认证证书失败时,删除/usr/share/ssl/misc/demoCA下的index.txt,并使用“touch index.txt”命令重新创建index.txt文件。
  • 生成客户端证书时,请执行9-15,同时需要在9、12和14的操作命令中,以“client”代替“server”。
  1. 以root用户登录操作系统。
  2. 修改ssl配置文件openssl.cnf中“[v3_ca]”的“keyUsage”值。openssl.cnf文件路径是“/etc/ssl/openssl.cnf”。
    keyUsage = cRLSign, keyCertSign

  3. 进入misc目录,查看当前目录中文件。
    cd /usr/share/ssl/misc
    ls
    CA.pl c_hash c_issuer CA.sh c_info c_name

  4. 输入如下命令,创建CA,系统会在当前目录下生成demoCA文件夹。

    ./CA.sh -newca

  5. 设置根证书的保护密码,最少要求4个字符,以1234为例。

    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:

  6. 依次输入如下参数值。

    1. 以下输入参数值。

      Country Name (2 letter code) [AU]:cn
      State or Province Name (full name) [Some-State]:shanxi
      Locality Name (eg, city) []:xian
      Organization Name (eg, company) [Internet Widgits Pty Ltd]:company-A
      Organizational Unit Name (eg, section) []:Unit-A
      ##Common Name可以随意命名
      Common Name (eg, YOUR name) []:john


    2. 如下参数值可选择输入。
      Email Address []:
      A challenge password []:
      An optional company name []: company-A

  7. 输入根证书的保护密码,最少要求4个字符,假设为1234。

    Enter pass phrase for ./demoCA/private/./cakey.pem:

  8. 输入如下命令,为根证书增加CA扩展项。

    openssl x509 -req -in ./demoCA/careq.pem -extfile /etc/ssl/openssl.cnf -extensions v3_ca -signkey ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem -CAcreateserial -days 365

  9. 输入如下命令,根据不同的加密算法,生成相应的服务器证书请求文件server.req和服务器私钥server.key。

    • 基于RSA加密算法:
      openssl req -newkey rsa:2048 -out server.req -keyout server.key
    • 基于DSA加密算法:
      1. 生成DSA参数文件和私钥文件。
        openssl dsaparam -out dsakey.par 2048
        openssl gendsa dsakey.par -out server-dsa.key
      2. 根据DSA私钥文件创建证书签名请求文件。
        openssl req -new -key server-dsa.key -out server-dsa.req
    • 基于ECDSA加密算法:
      1. 生成ECDSA私钥文件。
        openssl ecparam -name secp384r1 -genkey -out server-ecc.key
      2. 根据ECDSA私钥创建ECDSA证书签名请求。
        openssl req -new -key server-ecc.key -out server-ecc.req

  10. 仅基于RSA加密算法时,输入服务器私钥的保护密码,密码要求大于等于8个字符,小于64个字符,以Aa123456为例。

    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:

  11. 依次输入如下参数值。

    1. 以下填写的信息与创建CA(6输入参数)时的信息一致。
      Country Name (2 letter code) [AU]:cn
      State or Province Name (full name) [Some-State]:shanxi
      Locality Name (eg, city) []:xian
      Organization Name (eg, company) [Internet Widgits Pty Ltd]:company-A
      Organizational Unit Name (eg, section) []:Unit-A
    2. 以下信息可随意命名。
      ##Common Name可以随意命名
      Common Name (eg, YOUR name) []:rose
    3. 如下参数值可选择输入。
      Email Address []:
      A challenge password []:
      An optional company name []: company-A

  12. 输入如下命令,对生成的服务器证书请求文件进行签发,签发后将生成正式的服务器证书server.crt。

    openssl ca -in server.req -out server.crt

  13. 选择是否签发证书,并选择是否提交已通过认证的证书请求。

    • 选择“是”:签发证书/提交请求。
    • 选择“否”:终止签发证书/不提交请求。

  14. 输入如下命令,去除服务器私钥的密码保护。

    • 基于RSA加密算法:
      openssl rsa -in server.key -out server.key
    • 基于DSA加密算法:
      openssl dsa -in server.key -out server.key
      基于ECDSA加密算法:
    • openssl ec -in server.key -out server.key

    如果不去除服务器私钥的密码保护,则需要使用zencrypt工具对存储密码进行加密保护。

    zencrypt -e aes256 -k work_key -f factor_key
    加密用的工作密钥(LOCAL_KEY)work_key和密钥因子(_FACTOR_KEY)factor_key需从服务器参数视图读取,用生成的密文配置SSL_KEY_PASSWORD参数。

  15. 仅基于RSA加密算法时,输入服务器私钥密码,以Aa123456为例。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3146656/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-01-06

  • 博文量
    2907
  • 访问量
    19192