unvdb开启ssl双向认证登录
SSL双向认证:客户端和服务端相互校验,服务器需要校验每个客户端,每个客户端也需要校验服务器,只有服务器和用户双方都有证书才能正常通信,因此只能是服务端允许的客户才能访问服务器。
client: root.crt, postgresql.crt, postgresql.key server: root.crt, server.crt, server.key
安装数据库
参考之前的安装手册
创建证书
虽然可以使用自签名证书进行测试,但在实际生产中应该使用由证书颁发机构(CA)(通常是企业范围的根CA)签署的证书。
服务器端需生成三个文件:
root.crt(根证书)
server.crt(服务器证书)
server.key(服务器私钥)
生成根证书
由于没有公证机构提供,只能使用自签名证书. 如有正规根证书请使用正规证书。
#首先创建证书签名请求的公钥和私钥文件
[root@arm417 ca]# openssl req -new -nodes -text -out root.csr -keyout root.key -subj "/CN=192.168.2.84"
#注意这里的 “/CN=” 需要填写本机IP,在测试中填写用户名会导致客户端使用ssl连接报错证书未知。
Generating a RSA private key
............+++++
.........................................................+++++
writing new private key to 'root.key'
-----
#使用密钥对证书签名以创建证书颁发机构
[root@arm417 ca]# openssl x509 -req -in root.csr -text -days 3650 -extfile /etc/pki/tls/openssl.cnf -extensions v3_ca -signkey root.key -out root.crt
Signature ok
subject=CN = 192.168.4.17
Getting Private key
生成服务器私钥
[root@arm417 ca]# openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=dbhost.yourdomain.com"
Generating a RSA private key
......+++++
......................................................+++++
writing new private key to 'server.key'
-----
#这个cn就没有之前的问题了
生成服务器证书
[root@arm417 ca]# openssl x509 -req -in server.csr -text -days 365 -CA root.crt -CAkey root.key -CAcreateserial -out server.crt
Signature ok
subject=CN = dbhost.yourdomain.com
Getting CA Private Key
如有正规证书以上三步不需要做
客户端的公共root.crt可从libcurl - the multiprotocol file transfer library网站获取最新的pem文件,此文件含有目前世界已知所有CA的证书,将此文件改名为root.crt,并部署在客户端的/root/.postgresql目录下,若在sslmode=verify-ca模式登陆失败,可能是颁布者CA的证书不含在root.crt里。
将服务器证书复制到数据目录下
cp server.key /data/udb/
cp server.crt /data/udb/
cp root.crt /data/udb/
#修改权限
chown unvdb. /data/udb/server.key
chown unvdb. /data/udb/server.crt
chown unvdb. /data/udb/root.crt
修改配置文件
vim /data/udb/unvdbsvr.conf
ssl=on
ssl_cert_file='server.crt'
ssl_key_file='server.key'
ssl_ca_file='root.crt'
#将配置文件中的选项打开
#分布式部署ssl双向认证按需要部署在cn节点或者GTM节点路径为
/安装路径/data/cn1 或者 /安装路径/data/gc1
#配置文件为:
udbtx.conf
#以下选项的前面不要设置MD5和trust的检测规则否则不会优先检测ssl证书登录
vim /data/udb/ud_hba.conf
hostssl all all 0.0.0.0/0 cert
hostnossl all all 0.0.0.0/0 reject
#分布式,需要将规则加入最前面,其中对其他节点登录不需要密码的规则是无法删除的会追加至最后。
vim /安装路径/data/cn1/ud_hba.conf
hostssl all all 0.0.0.0/0 cert
hostnossl all all 0.0.0.0/0 reject
配置客户端证书
创建客户端私钥
[root@arm417 ca]# openssl req -new -nodes -text -out postgresql.csr -keyout postgresql.key -subj "/CN=unvdb"
Generating a RSA private key
...........................................................................................................................................................................................................................+++++
...............................+++++
writing new private key to 'postgresql.key'
-----
#创建多个用户
[root@arm417 ca]# openssl req -new -nodes -text -out postgresql.csr -keyout postgresql1.key -subj "/CN=test"
Generating a RSA private key
...........................................................................................................................................................................................................................+++++
...............................+++++
writing new private key to 'postgresql1.key'
-----
生成客户端签名
openssl req -new -key postgresql.key -out postgresql.csr -subj "/CN=unvdb"
#创建多个认证用户
openssl req -new -key postgresql1.key -out postgresql1.csr -subj "/CN=test"
如果要指定多个数据库用户的话,需要生成多个签名以及公钥。文件名称并不影响ssl的检测。
使用ca根证书对客户端证书签名生成公钥
openssl x509 -req -in postgresql.csr -text -days 365 -CA root.crt -CAkey root.key -CAcreateserial -out postgresql.crt
Signature ok
subject=/CN=unvdb
Getting CA Private Key
#创建多个认证用户
openssl x509 -req -in postgresql1.csr -text -days 365 -CA root.crt -CAkey root.key -CAcreateserial -out postgresql1.crt
Signature ok
subject=/CN=test
Getting CA Private Key
把相关证书拷贝到客户端
scp postgresql.key root@192.168.4.17:/root/.postgresql
scp postgresql.crt root@192.168.4.17:/root/.postgresql
scp root.crt root@192.168.4.17:/root/.postgresql
# /root/.postgresql是udb—tx“集中式”默认的检测路径 postgresql.xxx是集中式默认文件名
# /root/.udbtx/是udb—tx“分布式”默认检测路径 udbtx.xxx是分布式默认文件名
# 也可以将路径写入环境变量。集中式以及分布式变量名是一样的
export PGSSLROOTCERT=/root/ca/root.crt
export PGSSLCERT=/root/ca/postgresql.crt
export PGSSLKEY=/root/ca/postgresql.key
重启数据库
使用ssl连接
#默认检测路径和文件名
[root@arm417 ~]# ud_sql -U unvdb "host=192.168.4.18 dbname=unvdb port=5678 user=unvdb sslmode=verify-ca"
ud_sql (24.2, server 22.4)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
#使用本证书外的用户连接会报错
[root@arm417 ~]# ud_sql -U unvdb "host=192.168.4.18 dbname=unvdb port=5678 user=test1 sslmode=verify-ca"
ud_sql: error: connection to server at "192.168.4.18", port 5678 failed: FATAL: certificate authentication failed for user "test1"
#如果使用默认名称或默认路径之外的文件名或文件路径,则需要添加文件路径以及文件名。如下:
[root@arm18 .udbtx]# ud_sql -U unvdb "host=192.168.4.17 dbname=unvdb port=5678 user=unvdb sslmode=verify-ca sslrootcert=/root/.udbtx/root.crt sslkey=/root/.udbtx/postgresql.key sslcert=/root/.udbtx/postgresql.crt"
ud_sql (22.4 based on udb-tx)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.