PostgreSQL 教程: 配置 SSL 通信加密

十二月 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