数据库安全通常是组织最关心的问题之一。开箱即用的 PostgreSQL 不提供足够的保护措施来确保数据保护和隐私。因此,需要采取额外措施来确保数据隐私和安全。为与服务器建立的连接启用 SSL 身份验证是确保数据隐私的方法之一。PostgreSQL 支持与数据库服务器建立的 SSL 连接,从而确保客户端和服务器之间交换的所有通信都是加密的。
在本教程中,我们将演示如何为 PostgreSQL 数据库服务器启用 SSL 连接。
第 1 步:安装 PostgreSQL 服务器
首先,您需要在 Linux 系统上安装 PostgreSQL 服务器。如果您的服务器上已经安装了 PostgreSQL,请随时跳到下一步。
在本指南中,我们将从在 Rocky Linux 8 上安装最新版本的 PostgreSQL (PostgreSQL 14) 开始。
首先,通过 SSH 登录到您的服务器。接下来,刷新存储库并将包升级到最新版本。
sudo dnf update
AppStream 存储库未提供最新版本的 PostgreSQL。要验证这一点,请列出可用的 PostgreSQL 模块。
dnf module list postgresql -y
从上面的输出来看,存储库提供的最新版本的 PostgreSQL 是 PostgreSQL 13.x。要安装最新版本的 PostgreSQL,请将 PostgreSQL 存储库添加到您的系统。
sudo dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm -y
接下来,禁用默认的 PostgreSQL 存储库:
sudo dnf module disable postgresql -qy
接下来,按如下方式安装 PostgreSQL 14 Server 和客户端。
sudo dnf install postgresql14 postgresql14-server -y
此后,按如下方式初始化 PostgreSQL 数据库。
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
默认情况下,PostgreSQL 安装在 Rocky Linux 上时不会自动启动。因此,启动数据库服务。
$ sudo systemctl start postgresql-14
此外,使其在系统启动时启动。
$ sudo systemctl enable postgresql-14
要确认 PostgreSQL 服务正在运行,请执行以下命令:
$ sudo systemctl status postgresql-14
上面的输出确认 PostgreSQL 服务器已启动并正在运行。默认情况下,PostgreSQL 侦听端口 5432,您可以通过运行以下ss
命令来确认这一点。
$ ss -pnltu | grep 5432
您应该得到以下输出,确认一切正常。
第 2 步:为 Postgres 用户配置密码
postgres
安装 PostgreSQL 时,会在系统中创建一个名为的默认用户。这是一个超级用户,拥有执行几乎任何任务的访问权限,包括管理数据库、表、模式函数和 PostgreSQL 数据库中的任何其他对象。
Postgres用户使用ident认证方式,不设置密码。出于安全原因,建议您设置密码以防止潜在的违规行为。
为此,请切换到根用户
$ sudo su
接下来,切换到postgres
用户。
$ su - postgres
切换到 PostgreSQL shell
$ psql
然后使用如图所示的查询设置postgres
用户密码。ALTER
ALTER USER postgres WITH PASSWORD 'your-password'
第 3 步:为 PostgreSQL 服务器生成 SSL 证书
要使 SSL 与 PostgreSQL 一起工作,您需要生成三个证书文件:
- server.key - 这是私钥文件
- server.crt - 这是服务器证书文件
- root.crt - 这是受信任的根证书
首先,将目录更改为 PostgreSQL 的数据目录,如图所示。
cd /var/lib/pgsql/14/data
接下来,生成一个 2048 位的 AES 加密的 RSA 私钥,如下所示。
openssl genrsa -aes128 2048 > server.key
在创建私钥期间,系统会提示您输入密码。输入并确认。
您稍后可以通过运行以下命令确认密钥存在:
ls -l | grep server.key
私钥有一个与之关联的密码。但是,为了进一步使用此密钥,您需要删除密码。为此,请运行以下命令:
openssl rsa -in server.key -out server.key
再一次,重新输入密码并按 ENTER。
第 4 步:应用所需的权限和所有权
为了增强安全性,您需要将私钥的只读权限分配给 root 用户,如图所示。
chmod 400 server.key
此外,将密钥的所有权设置为 postgres 用户和组。
chown postgres.postgres server.key
第 5 步:创建服务器证书文件
现在,根据私钥生成一个自签名证书文件。以下证书文件的有效期为 365 天。
# openssl req -new -key server.key -days 365 -out server.crt -x509
该命令将要求您提供一些将合并到证书文件中的信息。因此,请相应地填写所有详细信息。
由于您使用的是自签名证书,因此您将通过制作服务器证书文件的副本将其用作受信任的根证书,如图所示。
# cp server.crt root.crt
第 6 步:配置 PostgreSQL 以使用 SSL
下一步是配置 PostgreSQL 以使用 SSL。访问postgresql.conf
位于data
目录内的配置文件。
$ sudo vim /var/lib/pgsql/14/data/postgresql.conf
在 下Connection Settings
,找到listen_addresses
参数并将其设置为允许来自所有外部主机的连接。
listen_addresses = '*'
在该SSL
部分中,取消注释以下参数并设置值,如下所示。
ssl = on
ssl_ca_file = 'root.crt'
ssl_cert_file = 'server.crt'
ssl_crl_file = ''
ssl_key_file = 'server.key'
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
ssl_prefer_server_ciphers = on
保存更改并退出文件。接下来,打开pg_hba.conf
配置文件。这是 PostgreSQL 客户端身份验证配置文件,指定允许连接哪些主机以及如何对客户端进行身份验证。
$ sudo vim /var/lib/pgsql/14/data/pg_hba.conf
在 下IPv4 local connections
,按如下方式修改该行以允许来自所有主机的连接。
host all all 0.0.0.0/0 md5
接下来,在文件末尾添加以下行以启用 SSL 并允许来自所有主机的连接。
hostssl all all 0.0.0.0/0 md5
保存更改并退出配置文件。要使更改生效,请重新启动 PostgreSQL。
$ sudo systemctl restart postgresql-14
如果启用了 firewalld,请允许 Postgresql 服务,如图所示
$ sudo firewall-cmd --add-service=postgresql --permanent
$ sudo firewall-cmd --reload
步骤 7:测试 SSL 连接
此时,PostgreSQL 已配置为使用 SSL 进行远程连接。为此,我们将使用用户 postgres 登录到数据库服务器,如图所示
psql -U postgres -p 5432 -h 45.79.192.104
该-U
标志表示我们用来访问数据库服务器的登录用户
该-p
标志指定 PostgreSQL 正在侦听的端口(默认为 5432)
该-h
标志指定主机的 IP 地址。
下面的输出确认 SSL 已启用并且我们使用的是自签名证书。
结论
在本教程中,我们演示了如何使用自签名 SSL 证书在 PostgreSQL Server 上启用 SSL 支持。我们为 PostgreSQL 服务器上配置的所有数据库和用户启用了 SSL 连接。服务器将侦听默认 PostgreSQL 端口上的所有传入连接,并要求客户端使用 SSL。