十二月 13, 2023
摘要:在本教程中,您将学习如何在 PostgreSQL 中使用 SSL 设置通信数据加密。
目录
介绍
在处理关键金融级数据库时,需要启用客户端和服务器之间的通信加密,并满足一定的合规性,这些可能是最重要的要求之一。PostgreSQL 允许连接使用 SSL,来满足此项安全要求。在本教程中,我们将讨论对网络传输的数据设置加密涉及到哪些步骤。
准备工作
若要启用 SSL,必须具有由证书颁发机构(CA)签名的服务器和客户端证书文件。这通常由大多数组织中的安全团队执行。管理员可以使用 OpenSSL 生成证书。创建它们后,我们应该在 PostgreSQL 中设置以下参数:
-
ssl_ca_file
: 指定包含 SSL 服务器 CA 的文件名称 -
ssl_cert_file
: 指定包含 SSL 服务器证书的文件名称 -
ssl_key_file
: 指定包含 SSL 服务器私钥的文件名称
我们还必须在服务器上安装 OpenSSL:
$ sudo yum install openssl
操作步骤
让我们使用以下步骤开始:
1. 确保为文件设置适当的权限。仅向运行数据库的postgres
系统用户授予读取访问权限:
$ cd $PGDATA
$ chmod 0400 server.crt server.key rootCA.crt
2. 在 PostgreSQL 中启用 SSL 相关参数:
$ psql -c "ALTER SYSTEM SET ssl TO 'ON'"
$ psql -c "ALTER SYSTEM SET ssl_ca_file TO 'rootCA.crt'"
$ psql -c "ALTER SYSTEM SET ssl_cert_file TO 'server.crt'"
$ psql -c "ALTER SYSTEM SET ssl_key_file TO 'server.key'"
3. 执行重新加载以使参数更改生效:
$ psql -c "select pg_reload_conf()"
4. 通过为套接字上的连接启用 SSL 进行验证。将以下条目添加到该文件中。请确保将其添加到顶部,以避免使用已存在的条目,从而使其生效:
$ vi $PGDATA/pg_hba.conf
hostssl all all 127.0.0.1/32 trust
执行重新加载以使更改生效:
$ psql -c "select pg_reload_conf()"
使用psql
进行验证:
$ psql -h localhost
psql (13.1)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCMSHA384, bits: 256, compression: off)
Type "help" for help.
postgres=# \q
5. 要为远程连接启用 SSL,请将远程主机的 IP 添加到pg_hba.conf
文件中并指定hostssl
。在此示例中,数据库服务器的 IP 是192.168.130.70
,远程服务器的 IP 是192.168.130.1
。
将以下条目添加到pg_hba.conf
文件中:
$ vi $PGDATA/pg_hba.conf
hostssl postgres postgres 192.168.130.1 md5
执行重新加载以使更改生效:
$ psql -c "select pg_reload_conf()"
从远程主机进行验证:
$ psql -h 192.168.130.70 -d postgres -U postgres
Password for user postgres:
psql (13.1 (Ubuntu 13.1-1.pgdg18.04+1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCMSHA384, bits: 256, compression: off)
Type "help" for help.
postgres=# \q
怎么做到的…
如前面的步骤所示,必须使用由 CA 签名的服务器和客户端证书文件才能启用 SSL。一旦它们就位,就需要将它们复制到postgres
用户可访问且只能由postgres
用户读取的位置。一旦证书文件可用,我们可以设置步骤 2 中看到的参数,设置 SSL 为ON
并设置证书的位置。它需要重新加载以使更改生效,但并不需要重新启动。因此,可以在现有数据库服务器上启用 SSL 模式,而无需重新启动。
为了验证 SSL,如步骤 4 和 5 所示,我们可以在pg_hba.conf
文件中,添加hostssl
前缀,而不是添加host
。我们还需要添加适当的 IP,从那里应该对数据库的通信进行 SSL 加密。
默认情况下,启用 SSL 后,所有连接都会通过 SSL 发送数据。若要避免特定实例通过 SSL 建立通信,请使用hostnossl
作为前缀,而不是hostssl
,如下面日志所示:
hostnossl postgres postgres 192.168.130.1 md5