1、基本环境:
自行搭建环境,并对比ssl和nossl的抓包信息
SSL环境:
server: centos2 (192.168.0.10)
client: centos2 (单向 192.168.0.10), ubuntu (双向. 192.168.0.13)
2、相关概念、背景与使用
为了保证数据库连接的安全性能,PostgreSQL允许使用SSL证书的方式去连接数据库,这无疑大大加强了数据访问的安全性能。
在讲解PostgreSQL中SSL的使用前,我们先来了解下什么是SSL证书。
2.1、数据加密
首先我们先来聊聊什么是数据加密。
2.1.1、对称加密
数据加密这也是和我们生活中息息相关的,可能你不清楚什么是加密算法,不过你可能有过这样的经历:在读书的时候,每当考试的时候总会有人想尽办法去作弊,当然我想总不会有人蠢到考试的时候在监考老师眼皮地下像平时说话一样,第一题选A,第二题选B这样交流。这种蠢办法就是我们常说的”明文“。
那经常见到的方式是什么呢?比方说A同学和B同学考试前先相互约定好”暗号”——“摸头表示选A,摸下巴表示选B等等”。那这个暗号就是“密钥”,通过这个密钥我们将想要传递的信息“ABCD”转化成了“摸头摸下巴”,有了这个密钥,那就可以光明正大的作弊了。
这种加密方式便是对称加密,即A通过密钥将数据加密,而B也是通过同样的密钥将数据解密。
2.1.2、非对称加密
通过刚刚的方法我们已经可以把数据进行加密进行传递了,但是有个问题,万一A同学和B同学在考试前偷偷约定“暗号”的时候,不小心被监控老师听到了,那么等到考试的时候他们”摸头摸下巴“进行数据传递时,监控老师一眼就能看出他们是在作弊了。
前面这种通过”公钥“进行加密的方式显然安全性很低,只要被第三者知道了密钥那么数据便相当于是”明文“传输了。
既然这种方式安全性不足,那么人们就想到了另一种通过”公钥“和”私钥“的方式进行数据加密。即每个人都会生成一个自己的”公钥“和”私钥“对,”私钥“由自己保管,”公钥“用来发送给别人。
例如:
A说:”我的公钥是sdsfj$&!sds,请用这个公钥进行加密”
B说:”好的,加密后的信息为hsdb!*&sds,请查收“
A说:”收到“
那么对于其它人来看显然是不明白A和B两个人说的是啥,虽然A将公钥发了出来,所有人都可以看见,但是用A的公钥加密的信息只能通过A自己的私钥才能解密,所以这样就保证了数据的安全。
这便是非对称加密,通过这种方式,只要保证自己的私钥安全,那么信息就不会被别人破解。必将常见的SSH、HTTPS等都是通过这种方式进行加密的。
2.1.3、电子证书
上面我们说的非对称加密看上去似乎信息不会被破解,但是仍然存在漏洞。如果A和B的对话被第三个人C看到了,那么C完全可以这么做:
C:“hi,B兄,我换了新的公钥hsdb$%wew,请用这个公钥将数据加密发给我”
B:“好的,兄弟,我要说的是sdh!**iop”
C:“收到”
可以看到,非对称加密存在的问题是:对于B用户来说他并不知道和他对话的人究竟是不是A,别人完全可以冒充A,然后将自己的公钥发给B,然后B利用这个公钥去加密再把信息发出去,自然信息就泄露了。
这个时候你可能想这个好办,A和B既然认识,那么他们不会想个“暗号”吗?于是有了下面的对话:
A:“hi,B兄,这是我的公钥ljbd%^&sqwe”
B:“好的,歪比歪比?”
A:“外比巴卜”
B:“好兄弟,你确实是A,我要传给你的信息是iubs!*Fsw”
A:“好的,收到”
通过上面的方式我们可以看到,A和B约定了一个暗号,B在发送信息前先通过暗号确认了A的身份。但是这种方式C看到了就想”当我是傻子吗?我也知道你们的暗号了”,接着C也可以通过这个暗号和B进行对话。
C:“hi,B兄,这是我的公钥mnbd%^&ooqwe”
B:“好的,歪比歪比?”
C:“外比巴卜”
B:“好兄弟,你确实是A,我要传给你的信息是iuops!*Fsw”
C:“好的,收到”
接着B又被骗了,于是B痛定思痛,想到了一个办法,当C再次和B对话时:
C:“hi,B兄,这是我的公钥mnbd%^&ooqwe”
B:“好的,把你的证书拿出来我看下”
C:“啊?啥证书?”
B:“你这个死骗子!”
原来B想到了一个办法,去找另一个人D,D和他说”我做一张证书发给A,这样你看到这个证书就知道是A了“。
但是B经过这么多次上当受骗之后显然也变机灵了,对D说“现在办假证的这么多,我咋知道证书是真是假呢?”
D告诉他”这个好办,我给你一样东西,你用这个就知道证书是真是假了“
B忙问”啥宝贝,验钞机吗???“
D说”我自己的公钥!“
原来D也有自己的公钥和私钥,D在证书上将A的信息用他的私钥制作成签名,然后把公钥给了B,这样B通过D给的公钥就知道证书上的信息是不是正确的了。
这里显然D的公钥是至关重要的一样东西,这便是我们常说的”根证书“!
大家可以想想,是不是我们在访问某些安全级别高的网站时,网页都会弹出一个对话框然你先去下载证书。这里的网页就是B,我们自己的客户端就是A,我们想要去B传输信息给我们,B首先会找我们要证书,所以我们只有下载了证书之后B才会允许和我们之间进行信息传输。
2.2、SSL证书使用
2.2.1、SSL证书简介
当我们使用SSL证书访问数据库也是如此,数据库会需要我们客户端提供证书才允许访问。
而SSL证书认证也分为单向和双向两种认证方式:双向认证 SSL 协议要求服务器和用户双方都有证书。单向认证 SSL 协议不需要客户拥有CA证书,服务器端不会验证客户证书,以及在协商对称密码方案,对称通话密钥时,服务器发送给客户的是没有加过密的(这并不影响 SSL 过程的安全性)密码方案。
1、服务端的SSL验证:用SSL连接代替明文连接以防止网络包被窃听和防止他人伪装成服务器。
2、客户端的SSL验证:用客户端SSL证书登录代替密码登录。
2.2.2、服务端证书类型(三类):
1、自签名证书
证书颁发者和主题是一样,自己给自己颁发,此类证书不需要根证书认证,所以是不安全的,是无法防止他人伪装成服务器,但如果服务器是按IP地址连接的,也许对这项要求不是很注重,所以自签名证书就够了。
openssl req -new -x509 -days 365 -nodes -text -out server.crt -keyout server.key -subj "/CN=xx.xx.xx"
CN=后面是 证书主题如域名或IP地址,此命令生成证书文件server.crt 和私钥文件 server.key ,请将它们部署在数据库服务器上,并设好ssl_cert_file、ssl_key_file参数。
2、建立本地根CA,再由根CA签发服务器证书
-
建立本地根CA
openssl req -new -nodes -text -out root.csr -keyout root.key -subj "/CN=XX.XX.XX"
openssl x509 -req -in root.csr -text -days 3650 -extfile openssl.cfg -extensions v3_ca -signkey root.key -out root.crt生成两个有用的文件 root.key (根CA的私钥,请离线保存), root.crt(根CA证书)
-
由根CA颁发服务器证书
openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=XX.XX.XX"
openssl x509 -req -in server.csr -text -days 365 -CA root.crt -CAkey root.key -CAcreateserial -out server.crt生成两个有用的文件 server.key(服务器私钥),server.crt(服务器证书)。
请将server.key和server.crt部署在服务器,本地根证书root.crt部署在客户端,PostgreSQL客户端不依赖操作系统的证书,需要自行制定根证书的存放地方,所以即使是自行发行的根证书,也认为是合法的。在windows下根证书默认存放目录是appdata/postgresql目录下。
3、公共CA签署的证书
由知名CA签署的证书,大部分要收使用费,一般用在有域名的服务器上。申请后一般会得三个文件服务器私钥server.key、服务器证书server.crt、颁布者CA自己的证书。请将server.key和server.crt部署在服务器。客户端的公共root.crt可从 libcurl网站获取最新的pem文件,此文件含有目前世界已知所有CA的证书,将此文件改名为root.crt,并部署在客户端的$appdata/postgresql目录下,若在sslmode=verify-ca模式登陆失败,可能是颁布者CA的证书不含在root.crt里,可将颁布者CA的证书连接到root.crt(文本格式可编辑),也可连接到部署在服务器的服务器证书server.crt,建议后者。
2.2.3、SSL双向认证和SSL单向认证的区别
双向认证 SSL 协议要求服务器和用户双方都有证书。单向认证 SSL 协议不需要客户拥有CA证书,服务器端不会验证客户证书,以及在协商对称密码方案,对称通话密钥时,服务器发送给客户的是没有加过密的(这并不影响 SSL 过程的安全性)密码方案。
这样,双方具体的通讯内容,都是加过密的数据,如果有第三方攻击,获得的只是加密的数据,第三方要获得有用的信息,就需要对加密的数据进行解密,这时候的安全就依赖于密码方案的安全。而幸运的是,目前所用的密码方案,只要通讯密钥长度足够的长,就足够的安全。这也是我们强调要求使用128位加密通讯的原因。
一般Web应用都是采用SSL单向认证的,原因很简单,用户数目广泛,且无需在通讯层对用户身份进行验证,一般都在应用逻辑层来保证用户的合法登入。但如果是企业应用对接,情况就不一样,可能会要求对客户端(相对而言)做身份验证。这时就需要做SSL双向认证。
由于单向认证和双向认证的区别仅在于创建连接阶段,数据的传输均为加密的,因此客户端与PG服务端的连接采取SSL单向认证即可,即仅在PG Server端配置SSL证书。
2.2.4、PostgreSQL配置单向SSL认证连接
想要我们的pg数据库支持SSL连接,首先需要确保服务器有安装openssl:
yum -y install openssl openssl-devel
./configure --prefix=/usr/pgsql-14build --with-openssl
常见错误是:
configure: error: library 'crypto' is required for OpenSSL
解决方法:
yum -y install openssl-devel
当然,这个我们通过pg_config --configure 也可以得到验证和证实你编译的系统是否带openssl。
[23:43:35-postgres@centos2:/var/lib/pgsql]$ pg_config --configure | grep openssl
'--enable-rpath' '--prefix=/usr/pgsql-14' '--includedir=/usr/pgsql-14/include' '--mandir=/usr/pgsql-14/share/man' '--datadir=/usr/pgsql-14/share' '--libdir=/usr/pgsql-14/lib' '--with-lz4' '--with-icu' '--with-llvm' '--with-perl' '--with-python' '--with-tcl' '--with-tclconfig=/usr/lib64' '--with-openssl' '--with-pam' '--with-gssapi' '--with-includes=/usr/include' '--with-libraries=/usr/lib64' '--enable-nls' '--enable-dtrace' '--with-uuid=e2fs' '--with-libxml' '--with-libxslt' '--with-ldap' '--with-selinux' '--with-systemd' '--with-system-tzdata=/usr/share/zoneinfo' '--sysconfdir=/etc/sysconfig/pgsql' '--docdir=/usr/pgsql-14/doc' '--htmldir=/usr/pgsql-14/doc/html' 'CFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' 'LLVM_CONFIG=/usr/lib64/llvm5.0/bin/llvm-config' 'CLANG=/opt/rh/llvm-toolset-7/root/usr/bin/clang' 'PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig' 'PYTHON=/usr/bin/python3'
-- 明确看到上边带有:'--with-openssl'
1、为服务器创建一个有效期为365天的简单自签名证书
openssl req -new -x509 -days 365 -nodes -text -out server.crt \
-keyout server.key -subj "/CN=pgccc.centos2"
修改权限:
chmod og-rwx server.key
或者 chmod 0600 server.key
server.crt文件需不需要也设定权限,好像不需要。
[23:46:56-postgres@centos2:/var/lib/pgsql]$ openssl req -new -x509 -days 365 -nodes -text -out server.crt \
-keyout server.key -subj "/CN=pgccc.centos2"
Generating a 2048 bit RSA private key
................................................................................+++
............+++
writing new private key to 'server.key'
-----
ls -la server.key
-rw-r--r-- 1 postgres postgres 1704 Dec 11 23:46 server.key
[23:46:56-postgres@centos2:/var/lib/pgsql]$ chmod og-rwx server.key
[23:47:25-postgres@centos2:/var/lib/pgsql]$ ls -la server.key
-rw------- 1 postgres postgres 1704 Dec 11 23:46 server.key
openssl req 相关参数说明
-new :创建一个证书请求文件,会交互式提醒输入一些信息,这些交互选项以及交互选项信息的长度值以及其他一些扩展属性在配置文件(默认为
:openssl.cnf,还有些辅助配置文件)中指定了默认值。如果没有指定"-key"选项,则会自动生成一个RSA私钥,该私钥的生成位置
:也在openssl.cnf中指定了。如果指定了-x509选项,则表示创建的是自签署证书文件,而非证书请求文件
-x509 :指定该选项时,将生成一个自签署证书,而不是创建证书请求。一般用于测试或者为根CA创建自签名证书
-days n :指定自签名证书的有效期限,默认30天,需要和"-x509"一起使用。
-nodes :默认情况下,openssl req自动创建私钥时都要求加密并提示输入加密密码,指定该选项后则禁止对私钥文件加密
-text :以文本格式打印证书请求
-out filename :证书请求或自签署证书的输出文件,也可以是其他内容的输出文件,不指定时默认stdout
-keyout filename :指定自动创建私钥时私钥的存放位置,若未指定该选项,则使用配置文件中default_keyfile指定的值,默认该值为privkey.pem
-subj args :替换或自定义证书请求时需要输入的信息,并输出修改后的请求信息。args的格式为"/type0=value0/type1=value1...",
:如果value为空,则表示使用配置文件中指定的默认值,如果value值为".",则表示该项留空。其中可识别type(man req)有:
:C是Country、ST是state、L是localcity、O是Organization、OU是Organization Unit、CN是common name等
2、接着修改postgreql.conf及pg_hba.conf配置文件
修改如下:
vim postgresql.conf
ssl=on
ssl_cert_file='/var/lib/pgsql/server.crt'
ssl_key_file='/var/lib/pgsql/server.key'
也可以不指定绝对路径 ,放到PGDATA下边,如:
[23:46:56-postgres@centos2:/var/lib/pgsql]$ cp server.crt $PGDATA
[23:46:56-postgres@centos2:/var/lib/pgsql]$ cp server.key $PGDATA
pg_hba.conf文件可改,也可不改
--修改pg_hba.conf,新增ssl认证连接规则
vim pg_hba.conf
hostssl all all 0.0.0.0/0 scram-sha-256
#hostssl all all 0.0.0.0/0 cert
hostnossl all all 0.0.0.0/0 reject
注意,这里认证方式是:scram-sha-256, 不是cert. 要与后边的双向认证相区别。
3、验证连接是否成功
需要重启数据库让前边的配置生效。
关于连接的命令行:
https://www.postgresql.org/docs/14/libpq-connect.html#LIBPQ-PARAMKEYWORDS
示例:
postgresql://
postgresql://localhost
postgresql://localhost:5433
postgresql://localhost/mydb
postgresql://user@localhost
postgresql://user:secret@localhost
postgresql://other@localhost/otherdb?connect_timeout=10&application_name=myapp
postgresql://host1:123,host2:456/somedb?target_session_attrs=any&application_name=myapp
[23:51:01-postgres@centos2:/var/lib/pgsql/14/data]$ psql "host=localhost user=postgres dbname=postgres sslmode=require"
psql (14.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=#
或者:
[23:52:12-postgres@centos2:/var/lib/pgsql/14/data]$ psql "host=localhost user=postgres dbname=postgres sslmode=require password=Pgccc789"
psql (14.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
来个高级点儿和完整的psql连接串:
psql postgresql://test:test123@localhost:5555/internals?sslmode=require
[23:59:48-postgres@centos2:/var/lib/pgsql/14/data]$ psql postgresql://test:test123@localhost:5555/internals?sslmode=require
psql (14.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
internals=>
4、通过sslinfo插件来印证是否使用了SSL
服务端ssl配置好之后,使用客户端连接数据库会有ssl 提示信息。语句:
create extension sslinfo;
select ssl_is_used();
select ssl_ciper();
select ssl_version();
请看下边的实例:
[00:16:11-postgres@centos2:/var/lib/pgsql/14/data]$ psql postgresql://localhost:5555/internals?sslmode=require
Password for user postgres:
psql (14.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
internals=# create extension sslinfo;
CREATE EXTENSION
internals=# select ssl_is_used();
ssl_is_used
-------------
t
(1 row)
internals=# select ssl_cipher();
ssl_cipher
-----------------------------
ECDHE-RSA-AES256-GCM-SHA384
(1 row)
internals=# select ssl_version();
ssl_version
-------------
TLSv1.2
(1 row)
2.2.5、PostgreSQL配置双向SSL认证连接
双向SSL认证配置我们需要根服务器来为客户端、数据库颁发证书。服务器端需生成三个文件:
root.crt(根证书)
server.crt(服务器证书)
server.key(服务器私钥)
1、生成服务器私钥
-- 需要输入密码
[07:37:30-postgres@centos2:/var/lib/pgsql/14/data]$ openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
............+++
...........................................................................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
--去掉密码,不然数据库启动会有问题
[07:37:38-postgres@centos2:/var/lib/pgsql/14/data]$ openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:
writing RSA key
创建私钥server.key,使用des3算法,有效期2048天。
2、生成服务器证书
由于没有公证机构提供,只能使用自签名证书,因此可以将服务器证书作为根证书。CN值设为testcert
[07:39:43-postgres@centos2:/var/lib/pgsql/14/data]$ openssl req -new -key server.key -days 2650 -out server.crt -x509
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Haidian
Organization Name (eg, company) [Default Company Ltd]:pgccc
Organizational Unit Name (eg, section) []:pg
Common Name (eg, your name or your server's hostname) []:testcert
Email Address []:pgccc@pg.cn
3、生成根证书
由于没有公证机构提供,只能使用自签名证书,因此可以将服务器证书作为根证书。
[07:41:50-postgres@centos2:/var/lib/pgsql/14/data]$ cp server.crt root.crt
4、复制认证文件到数据目录下及设置权限
cp server.key $PGDATA
cp server.crt $PGDATA
cp root.crt $PGDATA
chmod 600 $PGDATA/server.key
5、修改配置文件
postgresql.conf增加ssl_ca_file;pg_hba.conf认证模式改成cert并且是hostssl连接,这才是双向认证的配置。
vim postgresql.conf, 添加
ssl=on
ssl_cert_file='server.crt'
ssl_key_file='server.key'
ssl_ca_file='root.crt'
vim pg_hba.conf, 添加修正:
hostssl all all 0.0.0.0/0 cert
hostnossl all all 0.0.0.0/0 reject
6、配置客户端证书
1)、创建客户端私钥
--要求输入密码
[07:46:20-postgres@centos2:/var/lib/pgsql/14/data]$ openssl genrsa -des3 -out postgresql.key 2048
Generating RSA private key, 2048 bit long modulus
............................................................................+++
.......................................+++
e is 65537 (0x10001)
Enter pass phrase for postgresql.key: (输入"password")
Verifying - Enter pass phrase for postgresql.key:
--去除密码
[08:00:25-postgres@centos2:/var/lib/pgsql/14/data]$ openssl rsa -in postgresql.key -out postgresql.key
Enter pass phrase for postgresql.key:
writing RSA key
2)、生成客户端证书签名请求
[postgres@centos2:/var/lib/pgsql/14/data]$ openssl req -new -key postgresql.key -out postgresql.csr -subj "/CN=testcert"
/CN=testcert, testcert是连接数据库的用户名,需要指定,不然会报错
3)、使用ca根证书对客户端证书签名生成公钥
[08:03:33-postgres@centos2:/var/lib/pgsql/14/data]$ openssl x509 -req -days 3650 -in postgresql.csr -CA root.crt -CAkey server.key -out postgresql.crt -CAcreateserial
Signature ok
subject=/CN=testcert
Getting CA Private Key
为此可以建一个专门的用户来着.
postgres=# create user testcert with password 'test123';
CREATE ROLE
postgres=# grant all privileges on database internals to testcert;
GRANT
4)、把相关证书拷贝到客户端
命令:scp local_file remote_ip:remote_file
要让它好使:提前直接生成对应的id_rsa文件:
[23:22:37-postgres@centos1:/var/lib/pgsql]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/pgsql/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
文件传输:
scp postgresql.key postgres@192.168.0.13:/var/lib/postgresql/.postgresql
Enter passphrase for key '/var/lib/pgsql/.ssh/id_rsa': ("password")
postgresql.key 100% 1679 1.0MB/s 00:00
scp postgresql.crt postgres@192.168.0.13:/var/lib/postgresql/.postgresql
scp root.crt postgres@192.168.0.13:/var/lib/postgresql/.postgresql
5)、重启数据库
7、客户端连接
没有证书情况下,提示需要ca证书来连接
[08:23:44-postgres@ubuntu-linux:/var/lib/postgresql/.postgresql]$ psql -U 192.168.0.10 "host=192.168.0.10 dbname=internals port=5555 user=test"
psql: error: connection to server at "192.168.0.10", port 5555 failed: private key file "/var/lib/postgresql/.postgresql/postgresql.key" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root
connection to server at "192.168.0.10", port 5555 failed: FATAL: pg_hba.conf rejects connection for host "192.168.0.13", user "test", database "internals", no encryption
7.1、修改文件权限
chmod 600 postgresql.key
7.2、使用ssl连接
sslmode=verify-ca (双向)
psql -U testcert "host=192.168.0.10 dbname=internals port=5555 user=testcert sslmode=verify-ca"
[08:26:48-postgres@ubuntu-linux:/var/lib/postgresql/.postgresql]$ psql "host=192.168.0.10 dbname=internals port=5555 user=testcert sslmode=verify-ca"
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
internals=>
或者:
[postgres@ubuntu-linux:/var/lib/postgresql]$ psql postgresql://testcert@192.168.0.10:5555/internals?sslmode=verify-ca
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
postgres@ubuntu-linux:/var/lib/postgresql]$ psql postgresql://test:test123@192.168.0.10:5555/internals?sslmode=verify-ca
psql: error: connection to server at "192.168.0.10", port 5555 failed: FATAL: certificate authentication failed for user "test"
// 这个是说test用户是不能用cert进行认证的。
7.3、使用证书外用户连接会失败
[08:25:02-postgres@ubuntu-linux:/var/lib/postgresql/.postgresql]$ psql -U 192.168.0.10 "host=192.168.0.10 dbname=internals port=5555 user=postgres sslmode=verify-ca"
psql: error: connection to server at "192.168.0.10", port 5555 failed: FATAL: certificate authentication failed for user "postgres"
2.3、验证传输是否加密
我们可以使用tcpdump以及wireshark或fiddler进行分析。
具体使用方法可以参考下文:使用tcpdump抓包,并用Wireshark和Fiddler工具分析
2.3.1、SSL方式的抓包验证
(root用户, 在centos2 DB server上)
[08:48:43-root@centos2:/pgccc/tmp]$ tcpdump -i ens33 -w ./ssl.cap
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
^C792 packets captured
805 packets received by filter
0 packets dropped by kernel
将ssl.cap下载到客户端机器上,用wireshark看看:
2.3.2、non-ssl方式的抓包验证
修改一下防火墙,允许non-ssl
vim pg_hba.conf
hostssl all all 0.0.0.0/0 cert
# hostnossl all all 0.0.0.0/0 reject
pg_ctl restart
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
^C1201 packets captured
1203 packets received by filter
0 packets dropped by kernel
开启一个客户端,以non-ssl方式连接:
[09:03:24-postgres@ubuntu-linux:/var/lib/postgresql/.postgresql]$ psql -h 192.168.0.10 -U test internals
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
Type "help" for help.
internals=> drop table tsmall;
DROP TABLE
internals=> create table tsmall(id int, col2 varchar(32));
CREATE TABLE
internals=> insert into tsmall values(2, 'Beijing');
INSERT 0 1
internals=> insert into tsmall values(2, 'Beijing'), (3, 'Beijing');
INSERT 0 2
把non-ssl.cap拿下来,分析下,如下图:
参考:
[1] 从数据加密到PostgreSQL SSL认证连接
: https://blog.csdn.net/weixin_39540651/article/details/117426295
[2] http://postgres.cn/docs/14/ssl-tcp.html
: http://postgres.cn/docs/14/ssl-tcp.html
[3] https://segmentfault.com/a/1190000004461428
: https://segmentfault.com/a/1190000004461428
[4] 含抓包过程:https://www.modb.pro/db/111308
: https://www.modb.pro/db/111308
[5] https://mp.weixin.qq.com/s/cToLxIEMLrJH3UXTiD5F3Q
: https://mp.weixin.qq.com/s/cToLxIEMLrJH3UXTiD5F3Q
[6] https://blog.csdn.net/Loiterer_Y/article/details/106683660
: https://blog.csdn.net/Loiterer_Y/article/details/106683660