Are you an LLM? You can read better optimized documentation at /zh/docs/latest-lite/database_administration_guide/establishing_secure_tcp_ip_connections_in_ssl_mode.md for this page in Markdown format
用SSL进行安全的TCP/IP连接 背景信息 openGauss支持SSL标准协议(TLS 1.2),SSL协议是安全性更高的协议标准,它们加入了数字签名和数字证书来实现客户端和服务器的双向身份验证,保证了通信双方更加安全的数据传输。
openGauss支持TLCP协议,TLCP采用国密算法进行身份认证和安全传输,它采用SM2双证书体系,分别用于签名认证和传输数据的加密。
前提条件 从CA认证中心申请到正式的服务器、客户端的证书和密钥。(假设服务器的私钥为server.key,证书为server.crt,客户端的私钥为client.key,证书为client.crt,CA根证书名称为cacert.pem。)
对于TLCP连接,需要配置双证书。(假设服务器用于签名认证的证书私钥对为server.crt、server.key,用于数据加密传输的证书私钥对为server_enc.crt、server_enc.key ;客户端用于签名验签的证书私钥对为client.crt,client.key,用于数据加密传输的证书私钥对为 client_enc.crt,client_enc.key; CA根证书名称为cacert.pem。)
注意事项 当用户远程连接到数据库主节点时,需要使用sha256的认证方式。 当内部服务器之间连接时,需要使用trust的认证方式,支持IP白名单认证。 操作步骤 openGauss在数据库部署完成后,默认已开启SSL认证模式。服务器端证书,私钥以及根证书已经默认配置完成。用户需要配置客户端的相关参数。
配置SSL认证相关的数字证书参数,具体要求请参见表1 。
须知
从安全性考虑,建议使用双向认证方式。 配置客户端环境变量,必须包含文件的绝对路径。
表 1 认证方式
认证方式
含义
配置客户端环境变量
维护建议
双向认证-TLS(推荐)
客户端验证服务器证书的有效性,同时服务器端也要验证客户端证书的有效性,只有认证成功,连接才能建立。
设置如下环境变量:
PGSSLCERT PGSSLKEY PGSSLROOTCERT PGSSLMODE 该方式应用于安全性要求较高的场景。使用此方式时,建议设置客户端的PGSSLMODE变量为verify-ca。确保了网络数据的安全性。
双向认证-TLCP(推荐)
客户端验证服务器证书的有效性,同时服务器端也要验证客户端证书的有效性,只有认证成功,连接才能建立。
设置如下环境变量:
PGSSLTLCP PGSSLCERT PGSSLKEY PGSSLENCCERT PGSSENCLKEY PGSSLROOTCERT PGSSLMODE 该方式应用于安全性要求较高的场景。使用此方式时,建议设置客户端的PGSSLMODE变量为verify-ca。确保了网络数据的安全性。
单向认证
客户端只验证服务器证书的有效性,而服务器端不验证客户端证书的有效性。服务器加载证书信息并发送给客户端,客户端使用根证书来验证服务器端证书的有效性。
设置如下环境变量:
为防止基于TCP链接的欺骗,建议使用SSL证书认证功能。除配置客户端根证书外,建议客户端使用PGSSLMODE变量为verify-ca方式连接。
相关参考 在服务器端的postgresql.conf文件中配置相关参数,详细信息请参见表2 。
表 2 服务器参数
参数
描述
取值范围
ssl
表示是否启动SSL功能。
默认值: off
require_ssl
设置服务器端是否强制要求SSL连接。该参数只有当参数ssl为on时才有效。
on:服务器端强制要求SSL连接。 off:服务器端对是否通过SSL连接不作强制要求。 默认值: off
ssl_use_tlcp
设置是否使用TLCP连接。该参数只有当参数ssl为on时才有效。
on:服务器端启用TLCP连接功能。 off:服务器端不启用TLCP连接功能,仍使用TLS连接。 默认值: off
ssl_cert_file
对于TLS连接,该参数指定服务器证书文件,包含服务器端的公钥。服务器证书用以表明服务器身份的合法性,公钥将发送给对端用来对数据进行加密。
对于TLCP连接,该参数指定服务器用于验证签名的证书文件,包含验证签名所用的公钥。公钥将发送给客户端用来对服务器的签名进行验签,用以表明服务器身份的合法性
请以实际的证书名为准,其相对路径是相对于数据目录的。
默认值 :server.crt
ssl_enc_cert_file
仅在TLCP连接中生效。
指定服务器加密证书文件,包含服务器端用于加密的公钥。公钥将发送给对端用来对数据进行加密
请以实际的证书名为准,其相对路径是相对于数据目录的。
默认值 :server_enc.crt
ssl_key_file
对于TLS连接,该参数指定服务器私钥文件,用以对公钥加密的数据进行解密。
对于TLCP连接,该参数指定服务器的签名私钥文件,包含签名所用的私钥。
请以实际的服务器私钥名称为准,其相对路径是相对于数据目录的。
默认值 :server.key
ssl_enc_key_file
仅在TLCP连接中生效。
指定服务器解密私钥文件,用以对公钥加密的数据进行解密。
请以实际的服务器私钥名称为准,其相对路径是相对于数据目录的。
默认值 :server_enc.key
ssl_ca_file
CA服务器的根证书。此参数可选择配置,需要验证客户端证书的合法性时才需要配置。
请以实际的CA服务器根证书名称为准。
默认值 :cacert.pem
ssl_crl_file
证书吊销列表,如果客户端证书在该列表中,则当前客户端证书被视为无效证书。
请以实际的证书吊销列表名称为准。
默认值 :空,表示没有吊销列表。
ssl_ciphers
SSL通讯使用的加密算法。
本产品支持的加密算法的详细信息请参见表4 ,表5 。
默认值: ALL,表示允许对端使用产品支持的所有加密算法,但不包含ADH、LOW、EXP、MD5算法。
ssl_cert_notify_time
SSL服务器证书到期前提醒的天数。
请按照需求配置证书过期前提醒天数。
默认值: 90
在客户端配置SSL认证相关的环境变量,详细信息请参见表3 。
说明
客户端环境变量的路径以“/home/omm ”为例,在实际操作中请使用实际路径进行替换。
表 3 客户端参数
环境变量
描述
取值范围
PGSSLTLCP
客户端是否使用TLCP连接。
取值及含义:
默认值: 0
PGSSLCERT
对于TLS连接,该变量指定客户端证书文件,包含客户端的公钥。客户端证书用以表明客户端身份的合法性,公钥将发送给对端用来对数据进行加密。
对于TLCP连接,该变量指定客户端用于验签的证书文件,包含验证签名所用的公钥。公钥将发送给服务器用来对客户端的签名进行验签,从而验证客户端身份的合法性。
必须包含文件的绝对路径,如:
export PGSSLCERT=' /home/ omm /client.crt ' 默认值 :空
PGSSLENCCERT
该变量仅在TLCP连接时生效。指定客户端用于加密的证书文件,包含客户端用于加密的公钥。公钥将发送给对端用来对数据进行加密。
必须包含文件的绝对路径,如:
export PGSSLENCCERT=' /home/ omm /client_enc.crt ' 默认值 :空
PGSSLKEY
对于TLS连接,该变量指定客户端私钥文件,用以对公钥加密的数据进行解密。
对于TLCP连接,该参数指定客户端用于签名的私钥文件,包含签名所用的私钥。
必须包含文件的绝对路径,如:
export PGSSLKEY=' /home/ omm /client.key ' 默认值 :空
PGSSLENCKEY
该变量仅在TLCP连接时生效。
指定客户端用于解密的私钥文件,用于对公钥加密的数据进行解密。
必须包含文件的绝对路径,如:
export PGSSLENCKEY=' /home/ omm /client_enc.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 ' 默认值: 空
服务器端参数ssl、require_ssl与客户端参数sslmode配置组合结果如下:
ssl(服务器)
sslmode(客户端)
require_ssl(服务器)
结果
on
disable
on
由于服务器端要求使用SSL,但客户端针对该连接禁用了SSL,因此无法建立连接。
disable
off
连接未加密。
allow
on
连接经过加密。
allow
off
连接未加密。
prefer
on
连接经过加密。
prefer
off
连接经过加密。
require
on
连接经过加密。
require
off
连接经过加密。
verify-ca
on
连接经过加密,且验证了服务器证书。
verify-ca
off
连接经过加密,且验证了服务器证书。
verify-full
on
连接经过加密,且验证了服务器证书和主机名。
verify-full
off
连接经过加密,且验证了服务器证书和主机名。
off
disable
on
连接未加密。
disable
off
连接未加密。
allow
on
连接未加密。
allow
off
连接未加密。
prefer
on
连接未加密。
prefer
off
连接未加密。
require
on
由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。
require
off
由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。
verify-ca
on
由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。
verify-ca
off
由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。
verify-full
on
由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。
verify-full
off
由于客户端要求使用SSL,但服务器端禁用了SSL,因此无法建立连接。
SSL传输支持一系列不同强度的加密和认证算法。用户可以通过修改postgresql.conf中的ssl\_ciphers参数指定数据库服务器使用的加密算法。
目前本产品TLS连接支持的加密算法如表4 所示。
表 4 加密算法套件-TLS
OpenSSL套件名
IANA套件名
安全程度
ECDHE-RSA-AES128-GCM-SHA256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
HIGH
ECDHE-RSA-AES256-GCM-SHA384
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
HIGH
ECDHE-ECDSA-AES128-GCM-SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
HIGH
ECDHE-ECDSA-AES256-GCM-SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
HIGH
DHE-RSA-AES128-GCM-SHA256
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
HIGH
DHE-RSA-AES256-GCM-SHA384
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
HIGH
目前本产品TLCP连接支持的加密算法如表5 所示。
表 5 加密算法套件-TLCP
国密套件名
安全程度
ECDHE-SM4-SM3
HIGH
ECDHE-SM4-GCM-SM3
HIGH
ECC-SM4-SM3
HIGH
ECC-SM4-GCM-SM3
HIGH
说明
目前只支持表4和表5中的10种加密算法套件。
配置参数ssl_ciphers的默认值为ALL,表示支持表4和表5中的所有加密算法。为保持前向兼容保留了DHE算法套件,即DHE-RSA-AES128-GCM-SHA256和DHE-RSA-AES256-GCM-SHA384,根据CVE-2002-20001漏洞披露DHE算法存在一定安全风险,非兼容场景不建议使用,可将ssl_ciphers参数配置为仅支持ECDHE类型算法套件。
如需指定以上加密算法套件,可以设置ssl_ciphers为表4中OpenSSL套件名称或表5中的国密套件名称,加密算法套件之间需要使用分号分割,如在postgresql.conf设置:
ssl_ciphers='ECDHE-RSA-AES128-GCM-SHA256;ECDHE-ECDSA-AES128-GCM-SHA256' 服务端参数 ssl_ciphers、ssl_use_tlcp与实际证书生成算法、客户端参数PGSSLTLCP配置需要组合正确才能正常建立ssl连接:
ssl_use_tlcp与ssl_ciphers的值需要互相匹配,否则数据库无法启动。即ssl_use_tlcp开启时,ssl_ciphers需要包含国密算法套件,ssl_use_tlcp关闭时,ssl_ciphers需包含TLS相关套件。
ssl_use_tlcp 与 实际证书生成算法、客户端参数PGSSLTLCP配置组合结果如下:
服务端ssl_use_tlcp 证书生成算法 客户端参数PGSSLTLCP 结果 on sm2 1 成功建立使用TLCP协议的连接 on sm2 0 ssl连接失败 on 非sm2 1 ssl连接失败 on 非sm2 0 ssl连接失败 off sm2 1 ssl连接失败 off sm2 0 ssl连接失败 off 非sm2 1 ssl连接失败 off 非sm2 0 成功建立使用TLS协议的连接
上表中,默认以下条件:
服务器ssl = on 客户端sslmode 为verify-ca 或verify-full sm2算法生成证书时,服务器默认配置了ssl_cert_file、ssl_enc_cert_file、ssl_key_file、ssl_enc_key_file参数,客户端默认配置了PGSSLCERT、PGSSLENCCERT、PGSSLKEY、PGSSLENCKEY参数; 非sm2算法生成证书时,服务器默认配置了ssl_cert_file、ssl_key_file参数,客户端默认配置了PGSSLCERT、PGSSLKEY参数。