KingbaseES

KingbaseES 基线安全
KingbaseES配置数据库SSL加密



前言

基础概念

openssl

1.对称加密

2.非对称加密

3.密钥

3.证书

4.CA certificate authority 认证中心

5.根证书

根证书是证书链的最顶层,用来证明服务端证书和客户端证书的真伪,CA证书由权威机构发布,权威机构的根证书会内置于浏览器和操作系统中,基本不太可能会被篡改,根证书的作用,用来证明服务器或者客户端的真伪

服务端证书和客户端证书是用来进行对链路中传输的数据进行加密的

证书生成过程

1.根证书CA密钥

openssl genrsa 2048 > root.key

–genrsa 生成2048长度的rsa格式的非对称加密算法密钥

2.CA私钥生成自签名数字证书,其它都保持默认即可

openssl req -new -x509 -nodes -days 3600 -key root.key -out root.crt

–req request请求
–new new request
–x509 生成这种格式的证书
–nodes 不适用des加密算法加密输出的文件
–days 整数的有效天数
–key 密钥
–out 输出文件

3.生成服务器证书请求和私钥,COMMAN NAME代表的是哪个主机或者域名等要申请证书,证书被签署后只能应用于common name所指定的地址

openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr

–req request
–newkey rsa:2048 生成2048长度的rsa的key
–nodes 不适用des加密密钥
–out 整数签名请求文件
–keyout 私钥

common name*

***其它参数都可以留空,但是要注意common name的设置

如果客户端ssl的sslmode方式为verify-full的话,那么common name这里的配置名字必须要和服务器的名字hostname一致,需要将ip,hostname配置到hosts文件中,比如说服务器的名字叫servera,而客户端连接的时候指定了sslmode=verify-full的话, 那么此时common name必须要设置的和服务器名字一致

4.不需要

–openssl rsa -in server-key.pem -out server-key.pem

5.使用根证书来签署一个服务器证书

openssl x509 -req -in server.csr -days 3600 -CA root.crt -CAkey root.key -set_serial 01 -out server.crt

6.生成客户端证书请求和私钥

openssl req -newkey rsa:2048 -nodes -keyout kingbase.key -out kingbase.csr

common name*

***其它参数都可以留空,但是要注意common name参数要注意

如果ssl的验证方式为verify-full的话,那么common name这里的配置名字必须要和客户端使用证书登录的用户名一致,

比如客户端使用system这个账号登录,那么common name这里必须配置为system

如果是使用其它用户,那么common name这里同样也要设置为对应的用户

7.如果在生成密钥的时候加了des参数使用des加密算法加密了密钥的话,那么这个密钥在被使用的时候,则会提示要求输入对应的密码,如果不想要每次都输入密码的话,则可以使用下面的命令去掉des加密,直接明文的方式保存密钥

–openssl rsa -in client-key.pem -out client-key.pem

8.使用根证书来签署一个客户端证书

openssl x509 -req -in kingbase.csr -days 3600 -CA root.crt -CAkey root.key -set_serial 02 -out kingbase.crt

9.生成pkcs8格式的客户端私钥

为什么不能直接使用pem格式的私钥,而必须要pkcs8格式的

查阅了很多资料,最终在google上看到一篇文章比较可信,是因为目前java只提供了对pk8这种格式的读取接口

openssl pkcs8 -topk8 -outform DER -in kingbase.key -out kingbase.pk8 -nocrypt

数据库配置SSL过程

1.将上一步生成的根证书和服务端证书拷贝到data目录

root.crt
server.crt
server.key

****server.key 私钥文件需要单独赋予权限,否则数据库启动报错

chmod og-rwx server.key

2.配置kingbase.conf文件

ssl = on # (change requires restart)
ssl_cert_file = ‘server.crt’ # (change requires restart)
ssl_key_file = ‘server.key’ # (change requires restart)
ssl_ca_file = ’ root.crt ’ # (change requires restart)

3.配置sys_hba.conf文件(如果前面有相同配置的ip地址,需注释掉,否则解析不到ssl认证方式)

注意,集群环境的话,需要为集群的用户单独开辟不走ssl的入口***************************

host all SYSTEM 172.96.0.0/24 md5
host all SUPERMANAGER_V8ADMIN 172.96.0.0/24 md5


hostssl all all 0.0.0.0/0 md5 clientcert=verify-full

clientcert=1的意思其实就是相当于verify-ca,也就是说连接必须要求提供证书,并且会验证证书签发机构
但是并不会对common name等信息进行验证

客户端配置过程

1.ksql 方式

使用ksql方式验证ssl的话,需要在当前操作系统家目录下创建.kingbase 的隐藏文件夹,然后将前面生成的root根证书和client客户端证书以及密钥等拷贝到这个目录下

***注意, 客户端证书,客户端密钥,客户端pkcs8格式的密钥等文件的名字必须是kingbase,例如:kingbase.crt,kingbase.key,kingbase.pk8 否则识别不到证书

2.通过客户端管理工具

只需要将root根证书,客户端证书client.crt, 客户端pk8格式密钥拷贝到运行客户端管理工具的电脑上,可以放置在任何可以访问到的位置,然后客户端通过ssl选项选择对应的证书即可

3.通过jdbc

需要用JDBC时SSL的配置如下

jdbc:
通过参数sslmode配置证书验证方式,该参数支持四个值:disable(禁用SSL)、require、verify-ca、verify-full。使用verify-ca和verify-full时,

需通过连接参数sslrootcert指定根证书文件的位置,如不指定,Linux默认路径为$HOME/.kingbase8/root.crt,

Windows默认路径为%APPDATA%\kingbase8\root.crt,将服务器data目录下的root.crt放到对应目录下即可。

举例:jdbc:kingbase8://192.168.222.128:54321/TEST?usessl=true&sslmode=verify-ca&sslrootcert=root.crt&sslcert=kingbase8.crt&sslkey=kingbase8.pk8

sslmode参数的配置选项:

disable

不使用SSL安全连接。

allow

如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。

prefer

如果数据库支持,那么首选使用SSL安全加密连接,但不验证数据库服务器的真实性。

require

必须使用SSL安全连接,但是只做了数据加密,而并不验证数据库服务器的真实性。

verify-ca

必须使用SSL安全连接,并且验证数据库是否具有可信证书机构签发的证书。

verify-full

必须使用SSL安全连接,在verify-ca的验证范围之外,同时验证数据库所在主机的主机名是否与证书内容一致。如果不一致,需要使用root用户修改/etc/hosts文件,将连接的数据库节点的IP地址和主机名加入

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐