PostgreSQL 用户及授权管理 06:启用 SSL 及验证
外国公司非常重视安全性,通常要求在任何可以使用的地方都使用加密。在本部分中,您将为PostgreSQL 启用SSL 加密连接并执行数据包捕获验证。
SSL 连接加密
安全套接字层(SSL) 允许PostgreSQL 接受加密的网络连接。这意味着每个数据包中的所有数据都经过加密,因此您需要管理密钥和适当的证书。
要启用SSL 扩展,您必须首先配置服务器,然后接受传入的SSL 连接,最后检测并验证客户端是否以SSL 模式连接。
生成相关的证书
证书分为手动创建的证书、自签名证书和从证书供应商购买的证书。手动创建的证书适合在测试环境中使用。对于生产环境,我们建议购买付费证书。证书有有效期。免费证书的有效期通常约为三个月,付费证书的有效期通常为一年。下面解释这两种类型的证书。
通过 openssl 的方式创建证书
接下来,使用openssl 生成证书或从证书网站购买专业证书。
[root@development ~]# su – lavenliu
# 进入PGDATA目录。您这里的目录可能与我的不同。
#可根据实际情况更改
[lavenliu@开发中~]$ cd $PGDATA
[lavenliu@开发数据]$ mkdir ssl
[lavenliu@data 正在开发中]$ cd ssl
[lavenliu@开发SSL]$ openssl req -new -x509 -nodes -out mypg.lavenliu.cn.pem -keyout mypg.lavenliu.cn.key -days 365
.+.+.++++++++++++++++++++++++++++++++++ + +++++ +++++++++++++++++++++++++++*.+.+.+.+.+ 。+.+.+.+.+.+.+.+.+.+. +.+.+.+.++++++++++++++++ +++++++++++++++++++++ +++++++++++++++++++++*.+ .+.+.+ .+. +.+.+.+.+.+.+.+.+..+.+.+.+.+.+.+..+.+ .+.+.+.+.+.+.+. +.+.+.+.+.+.+.+.+.+.+. ……+. +.+..+.+.+.+.++++++++++ + ++++++++ +++++++++++++++++++++++++++++++++++++++ +++++ +++
.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ *.+.+.+.+.+.++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++*.+.+. +.+. +.+.+.+.+.+.+ .+.+.+。++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++ +++
—–
系统将要求您输入要包含的信息。
添加到证书请求。
您要输入的内容称为专有名称或DN。
有很多字段,但您也可以将某些字段留空
某些字段具有默认值。
如果输入“.”,该字段将保持空白。
—–
# 下面将以交互方式提示您输入信息。
国家名称(2个字母代码)[XX]:CN
国家名称(全名)[]: 上海
地区名称(如城市)[默认城市] : 上海
组织名称(如公司)[默认有限公司]:川达集团
组织单位名称(例如部门)[]:DevOps Team
通用名称(例如您的姓名或服务器主机名)[]:mypg.lavenliu.cn
邮箱地址[]:lcc@lavenliu.cn
通过云厂商申请免费证书
现在很多云厂商都提供免费的SSL证书,有效期为3个月和1年,非常方便。通过公共云供应商的控制台免费申请也非常快,通常只需几分钟。喜欢:
申请完成后,您可以将证书下载到本地。这里我们选择下载Nginx格式。喜欢:
为集群配置 SSL
要启用SSL 加密,您的服务器必须具有私有证书和公共证书。获得证书后,您所需要做的就是将证书和密钥文件导入到PostgreSQL 服务器中。
假设证书和密钥文件分别命名为mypg.lavenliu.cn.pem和mypg.lavenliu.cn.key,则需要在postgresql.conf配置文件中设置以下参数:
SSL=开启
# 设置绝对路径
ssl_key_file=\’/home/lavenliu/.pgenv/pgsql/data/ssl/mypg.lavenliu.cn.key\’
ssl_cert_file=\’/home/lavenliu/.pgenv/pgsql/data/ssl/mypg.lavenliu.cn.pem\’
# 也可以使用相对路径来设置。相对位置是PGDATA 环境变量的值。
ssl_key_file=\’ssl/mypg.lavenliu.cn.key\’
ssl_cert_file=\’ssl/mypg.lavenliu.cn.pem\’
第一行告诉PostgreSQL 启用SSL,另外两行告诉服务器在哪里可以找到建立加密连接所需的文件。当然,这些文件必须能够被运行PostgreSQL 集群的用户(通常是postgres 操作系统用户)读取。
启用SSL 后,您必须调整pg_hba.conf 文件,以便基于主机的访问机制可以处理基于SSL 的连接。特别是,如果您不想接受常规连接,则必须将每个主机条目替换为hostssl。例如:
Hostssl 所有lavenliu myunixhost scram-sha-256
Hostssl 所有论坛192.168.56.0/24 scram-sha-256
如果您想同时接受明文和加密连接,则可以保持主机模式。
通过 SSL 连接集群
连接到PostgreSQL 时,如果存在与基于主机的访问规则匹配的hostssl 条目,客户端会自动切换到SSL 连接。否则,默认使用标准常规连接。
如果pg_hba.conf 有主机规则行,则意味着它可以接受SSL 连接以及常规连接。因此,启动连接时必须强制使用SSL。在psql 中,这只能使用连接字符串并通过指定和启用sslmode=require 参数来实现。如果服务器接受连接,它将打印出正在使用的SSL 协议。
[lavenliu@Developing ~]$ psql \’postgresql: //forum@localhost:5432/forumdb?sslmode=require\’
psql (16.2)
SSL 连接(协议: TLSv1.3,密码: TLS_AES_256_GCM_SHA384,压缩: 关闭)
键入help 以获得帮助。
论坛数据库=
如果省略sslmode 参数或使用标准psql 连接参数,并且pg_hba.conf 文件中有匹配的Hostssl 行,则连接将转换为SSL。例如,以下三个连接产生相同的结果(加密连接):
$ psql -h localhost -U forum forumdb
psql (16.2)
SSL 连接(协议: TLSv1.3,密码: TLS_AES_256_GCM_SHA384,压缩: 关闭)
键入help 以获得帮助。
论坛数据库=\\q
$ psql \’postgresql: //forum@localhost:5432/forumdb\’
psql (16.2)
SSL 连接(协议: TLSv1.3,密码: TLS_AES_256_GCM_SHA384,压缩: 关闭)
键入help 以获得帮助。
论坛数据库=\\q
$ psql \’postgresql: //forum@localhost:5432/forumdb?sslmode=require\’
psql (16.2)
SSL 连接(协议: TLSv1.3,密码: TLS_AES_256_GCM_SHA384,压缩: 关闭)
键入help 以获得帮助。
论坛数据库=
同样,您可以通过设置sslmode=disable 来指定禁用SSL 连接。如果pg_hba.conf有hostssl模式,连接将被拒绝,如果pg_hba.conf文件有host行,它将作为未加密的连接进行连接。
$ psql \’postgresql://forum@localhost:5432/forumdb?sslmode=disable\’
psql (16.2)
键入help 以获得帮助。
论坛数据库=
最后,如果您在连接字符串中使用SSL,但PostgreSQL 服务器未配置为使用SSL,则PostgreSQL 将打印一条错误消息,指出不支持SSL。
$ psql \’postgresql://forum@localhost:5432/forumdb?sslmode=disable\’
psql: 错误: 无法连接到服务器: 服务器不支持SSL,但需要SSL
附录
PostgreSQL 不支持 SSL 问题解决
如何检查我当前的PostgreSQL 服务是否支持SSL?您可以通过运行以下命令进行检查:
[lavenliu@数据开发]$ postgres -c ssl=on
2024-05-02 08:47:45.215 GMT [47322] FATAL: 此版本不支持SSL
从上面的输出中可以看出,您当前通过pgenv 安装的PostgreSQL 服务不支持SSL。或者运行以下命令:
[root@developing ~]# ldd `which postgres` |grep ssl
如果没有输出,则您当前安装的PostgreSQL 也不支持SSL。如果支持SSL,上面的命令将输出:
[lavenliu@developing ~]$ ldd /opt/pgsql-16.2/bin/postgres |grep ssl
libssl.so.3=/lib64/libssl.so.3 (0x00007f7469790000)
如果上面编译的版本不支持SSL怎么办?您可以简单地重新编译以支持SSL并替换postgres二进制程序并继续使用您以前的数据。
[!暗示]
通过YUM 或APT 安装的PostgreSQL 支持SSL。我们再次强调,日常操作中不建议使用编译的方式安装PostgreSQL。
抓包验证连接是否加密
我们将使用tcpdump 捕获数据包并检查启用和禁用SSL 之间的差异。
没开启 SSL 的连接验证
打开两个终端并使用第一个终端上的操作系统管理员帐户捕获数据包。
[root@developing ~]# tcpdump -nX -i lo 端口5432
第二个终端执行数据库连接和建表操作。
[postgres@developing ~]$ /opt/pgsql-16.2/bin/psql \’postgresql://postgres@localhost:5432/forumdb?sslmode=disable\’
psql (16.2)
键入help 以获得帮助。
forumdb=# 如果表不存在则创建demo(name text);
NOTICE: 关系“演示”已存在。跳过
创建表
forumdb=# insert into demo value (\’你能看到我吗?\’);
插入0 1
forumdb=# 从演示中选择*;
姓名
——————
你可以看到我吗?
你可以看到我吗?
你可以看到我吗?
你可以看到我吗?
你可以看到我吗?
你可以看到我吗?
(6行)
此时第一终端显示如下内容(仅截取部分内容):
[root@developing ~]# tcpdump -nX -i lo 端口5432
tcpdump: 详细输出被抑制。使用-v[v]. 进行完整协议解码
监听lo,链路类型EN10MB(以太网),快照长度262144 字节
11:55:09.651463 IP6 :1.44496 :1.noadmin: 标志[S],序列1958056583,win 33280,选项[mss 65476,sackOK,TS val 319203163] 2 cr 0,nop,wscale 7],长度0
.我将在这里省略很多内容。
0x0000: 6006 fa3e 0020 0640 0000 0000 0000 0000`.@.
0x0010: 0000 0000 0000 0001 0000 0000 0000 0000 .
0x0020: 0000 0000 0000 0001 add0 0781 74b5 92db.t.
0x0030: d9e0 19ce 8010 0101 0028 0000 0101 080a .(.
0x0040: be42 8994 be42 8994 .B.B.
11:55:16.843364 IP6 :1.44496 :1.noadmin:标志[P.],序列84:133,ack 422,win 260,选项[nop,nop,TS val 3192038824 31 92 031636],长度49
0x0000: 6006 fa3e 0051 0640 0000 0000 0000 0000`.Q.@.
0x0010: 0000 0000 0000 0001 0000 0000 0000 0000 .
0x0020: 0000 0000 0000 0001 add0 0781 74b5 92db.t.
0x0030: d9e0 19ce 8018 0104 0059 0000 0101 080a .是.
0x0040: be42 a5a8 be42 8994 5100 0000 3063 7265 .B.B.Q.0cre # 这是建表语句
0x0050: 6174 6520 7461 626c 6520 6966 206e 6f74ate.表.if.not
0x0060: 2065 7869 7374 7320 6465 6d6f 286e 616d .exists.demo(nam
0x0070: 6520 7465 7874 293b 00 电子文本);
.
.
11:55:34.603291 IP6 :1.44496 :1.noadmin: 标志[P.],序列133:158,ack 560,win 260,选项[nop,nop,TS val 3192056584 cr 31 92038824],长度25
0x0040: be42 eb08 be42 a5a8 5100 0000 1873 656c .B.B.Q.sel # 这是查询语句
0x0050: 6563 7420 2a20 6672 6f6d 2064 656d 6f3b 等*.from.demo;
0x0060: 00。
11:55:34.612985 IP6 :1.noadmin :1.44496: 标志[P.],序列560:766,ack 158,win 260,选项[nop,nop,TS val 3192056593 cr 31 92056584],长度206
0x0070: 0f43 616e 2079 6f75 2073 6565 206d 653f .Can.you.see.me # 这是查询到的数据吗?
0x0080: 4400 0000 1900 0100 0000 0f43 616e 2079 D.Can.y
0x0090: 6f75 2073 6565 206d 653f 4400 0000 1900 ou.see.me?D.
0x00a0: 0100 0000 0f43 616e 2079 6f75 2073 6565 .我明白
0x00b0: 206d 653f 4400 0000 1900 0100 0000 0f43 .me?D.C
0x00c0: 616e 2079 6f75 2073 6565 206d 653f 4400 你看到我了吗?
0x00d0: 0000 1900 0100 0000 0f43 616e 2079 6f75 .你可以
0x00e0: 2073 6565 206d 653f 4400 0000 1900 0100 .看我吗?D.
0x00f0: 0000 0f43 616e 2079 6f75 2073 6565 206d .你可以看到它。
0x0100: 653f 4300 0000 0d53 454c 4543 5420 3600 e?C.选择.6。
0x0110: 5a00 0000 0549 Z.我
从上面的抓包可以看到,所有的信息都是明文的。在有严格安全要求的公司中不允许这种类型的纯文本通信。
已开启 SSL 的连接验证
打开两个终端并使用第一个终端上的操作系统管理员帐户捕获数据包。
[root@developing ~]# tcpdump -nX -i lo 端口5432
第二个终端执行数据库连接和建表操作。
[postgres@developing ~]$ psql \’postgresql: //forum@localhost:5432/forumdb?sslmode=require\’
用户论坛:密码
psql (16.2)
SSL 连接(协议: TLSv1.3,密码: TLS_AES_256_GCM_SHA384,压缩: 关闭)
键入help 以获得帮助。
forumdb=如果表不存在则创建表demo(name text);
forumdb=插入演示值(\’你能看到我吗?\’);
插入0 1
论坛数据库=>
; select * from demo;
name
—————–
Can you see me?
(1 rows)
此时,第一个终端里面将会显示如下内容(只截取了部分内容):
11:15:39.716066 IP 192.168.26.164.58914 > 192.168.26.164.noadmin: Flags [P.], seq 428722790:428722817, ack 442865350, win 512, options [nop,nop,TS val 2232602189 ecr 2232530665], length 27
0x0000: 4500 004f 2e23 4000 4006 55ed c0a8 1aa4 E..O.#@.@.U…..
0x0010: c0a8 1aa4 e622 0781 198d ca66 1a65 96c6 …..\”…..f.e..
0x0020: 8018 0200 b6da 0000 0101 080a 8512 ce4d ……………M
0x0030: 8511 b6e9 1703 0300 1689 269b d9de 66b3 ……….&…f.
0x0040: 1e25 ac6a dc3d 2f21 48d0 a346 3430 97 .%.j.=/!H..F40.
11:15:39.716099 IP 192.168.26.164.58914 > 192.168.26.164.noadmin: Flags [P.], seq 27:51, ack 1, win 512, options [nop,nop,TS val 2232602189 ecr 2232530665], length 24
0x0000: 4500 004c 2e24 4000 4006 55ef c0a8 1aa4 E..L.$@.@.U…..
0x0010: c0a8 1aa4 e622 0781 198d ca81 1a65 96c6 …..\”…….e..
0x0020: 8018 0200 b6d7 0000 0101 080a 8512 ce4d ……………M
0x0030: 8511 b6e9 1703 0300 13d0 5baf ec18 278d ……….[…\’.
0x0040: 2c4f 45c6 11a2 b909 e125 c543 ,OE……%.C
11:15:39.716193 IP 192.168.26.164.58914 > 192.168.26.164.noadmin: Flags [F.], seq 51, ack 1, win 512, options [nop,nop,TS val 2232602189 ecr 2232530665], length 0
0x0000: 4500 0034 2e25 4000 4006 5606 c0a8 1aa4 E..4.%@.@.V…..
0x0010: c0a8 1aa4 e622 0781 198d ca99 1a65 96c6 …..\”…….e..
0x0020: 8011 0200 b6bf 0000 0101 080a 8512 ce4d ……………M
0x0030: 8511 b6e9 ….
。。。。。。省略很多输出
11:15:41.422926 IP 192.168.26.164.noadmin > 192.168.26.164.56030: Flags [P.], seq 2:101, ack 311, win 512, options [nop,nop,TS val 2232603896 ecr 2232603896], length 99
0x0000: 4500 0097 25c1 4000 4006 5e07 c0a8 1aa4 E…%.@.@.^…..
0x0010: c0a8 1aa4 0781 dade 94d8 74b2 b503 ba93 ……….t…..
0x0020: 8018 0200 b722 0000 0101 080a 8512 d4f8 …..\”……….
0x0030: 8512 d4f8 1603 0300 5802 0000 5403 03cf ……..X…T…
0x0040: 21ad 74e5 9a61 11be 1d8c 021e 65b8 91c2 !.t..a……e…
0x0050: a211 167a bb8c 5e07 9e09 e2c8 a833 9c20 …z..^……3..
0x0060: 08e2 4768 d975 7b24 7855 635e 9790 458f ..Gh.u{$xUc^..E.
0x0070: b388 db86 9f44 f04d 81c1 ed87 bf26 d68c …..D.M…..&..
0x0080: 1302 0000 0c00 2b00 0203 0400 3300 0200 ……+…..3…
0x0090: 1714 0303 0001 01 …….
11:15:41.423139 IP 192.168.26.164.56030 > 192.168.26.164.noadmin: Flags [P.], seq 311:652, ack 101, win 512, options [nop,nop,TS val 2232603896 ecr 2232603896], length 341
0x0000: 4500 0189 27cd 4000 4006 5b09 c0a8 1aa4 E…\’.@.@.[…..
0x0010: c0a8 1aa4 dade 0781 b503 ba93 94d8 7515 …………..u.
由上面的输出可以看到,打印的内容已经加密了。
总结
最后,如果配置得当,服务器可以通过 SSL 处理网络连接,从而加密所有网络流量和数据。如果在外企工作的话,那么他们对安全要求是非常严格的,在他们那里:安全第一,业务第二。在国内的企业可能要求的就没那么高了。这一节里面介绍的内容在国内企业用的虽然不多,但是这节的内容非常重要,推荐大家掌握。虽然国内企业不那么重视安全,但我们却不能不重视。
#以上关于PostgreSQL 用户及授权管理 06:启用 SSL 及验证的相关内容来源网络仅供参考,相关信息请以官方公告为准!
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92319.html