在 Ubuntu 20.04 上对 PostgreSQL 使用 SSL 加密

介绍

默认情况下,大多数 PostgreSQL 安装使用不安全连接而不是加密连接。 本指南解释了如何使用免费的 Let’s Encrypt 证书来保护与 PostgreSQL 服务器的连接。

先决条件

在开始本指南之前:

在 Vultr 部署一个 Ubuntu 20.04 LTS 云服务器。 创建指向服务器 IP 地址的完全限定域名(DNS“A”记录)。

1.安装PostgreSQL

安装主要的 PostgreSQL 包。

$ sudo apt install postgresql postgresql-contrib

设置密码 postgres 帐户。

$ sudo -u postgres psql -c "ALTER USER postgres PASSWORD '<new_password>';"

2.安装Certbot和证书

Certbot 是自动请求 Let’s Encrypt 证书的免费工具。

按照我们的指南使用 Snap 安装 Certbot。

为您的服务器申请证书。 代替 psql.example.com 使用您服务器的完全限定域名。

$ sudo certbot certonly --standalone -d psql.example.com

3. 为 PostgreSQL 创建 Certbot Renewal Hook

Certbot 的证书只能由 root 访问。 要允许 PostgreSQL 使用该证书,它必须创建一个带有 Certbot 更新挂钩的副本。

查找 PostgreSQL 数据目录。 您将在续订挂钩文件中使用此值。

$ sudo -u postgres psql -U postgres -c 'SHOW data_directory'

创建续订挂钩文件。

$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/postgresql.deploy

粘贴以下内容。 代替 psql.example.com 使用您服务器的完全限定域名。 替换值 DATA_DIR 使用您的 PostgreSQL 数据目录。

#!/bin/bash
umask 0177
DOMAIN=psql.example.com
DATA_DIR=/var/lib/postgresql/12/main
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $DATA_DIR/server.crt
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $DATA_DIR/server.key
chown postgres:postgres $DATA_DIR/server.crt $DATA_DIR/server.key

保存并退出文件。

赋予文件可执行权限。

$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postgresql.deploy

4. 为 PostgreSQL 配置 SSL

获取PostgreSQL配置文件的路径:

$ sudo -u postgres psql -U postgres -c 'SHOW config_file'

编辑上一条命令显示的文件。 例如:

$ sudo nano /etc/postgresql/12/main/postgresql.conf

找到 安全证书 部分并编辑您的文件以匹配这些 SSL 设置:

ssl = on  
ssl_cert_file="server.crt"  
ssl_key_file="server.key"  
ssl_prefer_server_ciphers = on

找到 连接设置 部分并验证 listen_address* 对于所有地址。 确保该行没有被注释掉。 例如:

listen_address="*"

保存并退出文件。

5. PostgreSQL 连接配置

获取PostgreSQL配置文件的路径:

$ sudo -u postgres psql -U postgres -c 'SHOW config_file'

编辑 pg_hba.conf 文件,该文件与配置文件在同一目录中。 例如:

$ sudo nano /etc/postgresql/12/main/pg_hba.conf

添加以下行以启用来自 Internet 的安全 SSL 流量。

hostssl all all 0.0.0.0/0 md5

(可选)要还允许不安全的连接,请添加以下行:

host all all 0.0.0.0/0 md5

保存并退出文件。

6. 更新证书

执行强制续订,这会触发 Certbot 续订挂钩将证书复制到 PostgreSQL 的正确位置。

$ sudo certbot renew --force-renewal

查找 PostgreSQL 数据目录。

$ sudo -u postgres psql -U postgres -c 'SHOW data_directory'

验证 Certbot 是否将证书复制到 PostgreSQL 数据目录。 例如:

$ sudo ls /var/lib/postgresql/12/main/server.*

重启 PostgreSQL

$ service postgresql restart

7. 测试连接

从安装了 PostgreSQL 客户端的另一台计算机连接到数据库。 代替 psql.example.com 使用您服务器的完全限定域名。

$ psql -d "dbname=postgres sslmode=require" -h psql.example.com -U postgres

您应该会看到 PostgreSQL 提示。

Password for user postgres:
psql (12.8 (Ubuntu 12.8-0ubuntu0.20.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=#

键入 Q 退出 PostgreSQL 客户端。

postgres=# q

更多信息

官方文件 想要查询更多的信息。

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com