數(shù)據(jù)庫安全通常是組織最關(guān)心的問題之一。開箱即用的 PostgreSQL 不提供足夠的保護(hù)措施來確保數(shù)據(jù)保護(hù)和隱私。因此,需要采取額外措施來確保數(shù)據(jù)隱私和安全。為與服務(wù)器建立的連接啟用 SSL 身份驗(yàn)證是確保數(shù)據(jù)隱私的方法之一。PostgreSQL 支持與數(shù)據(jù)庫服務(wù)器建立的 SSL 連接,從而確??蛻舳撕头?wù)器之間交換的所有通信都是加密的。

在本教程中,我們將演示如何為 PostgreSQL 數(shù)據(jù)庫服務(wù)器啟用 SSL 連接。
第 1 步:安裝 PostgreSQL 服務(wù)器
首先,您需要在 Linux 系統(tǒng)上安裝 PostgreSQL 服務(wù)器。如果您的服務(wù)器上已經(jīng)安裝了 PostgreSQL,請隨時跳到下一步。
在本指南中,我們將從在 Rocky Linux 8 上安裝最新版本的 PostgreSQL (PostgreSQL 14) 開始。
首先,通過 SSH 登錄到您的服務(wù)器。接下來,刷新存儲庫并將包升級到最新版本。
sudo dnf update
AppStream 存儲庫未提供最新版本的 PostgreSQL。要驗(yàn)證這一點(diǎn),請列出可用的 PostgreSQL 模塊。
dnf module list postgresql -y

從上面的輸出來看,存儲庫提供的最新版本的 PostgreSQL 是 PostgreSQL 13.x。要安裝最新版本的 PostgreSQL,請將 PostgreSQL 存儲庫添加到您的系統(tǒng)。
sudo dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm -y

接下來,禁用默認(rèn)的 PostgreSQL 存儲庫:
sudo dnf module disable postgresql -qy
接下來,按如下方式安裝 PostgreSQL 14 Server 和客戶端。
sudo dnf install postgresql14 postgresql14-server -y

此后,按如下方式初始化 PostgreSQL 數(shù)據(jù)庫。
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb

默認(rèn)情況下,PostgreSQL 安裝在 Rocky Linux 上時不會自動啟動。因此,啟動數(shù)據(jù)庫服務(wù)。
$ sudo systemctl start postgresql-14
此外,使其在系統(tǒng)啟動時啟動。
$ sudo systemctl enable postgresql-14
要確認(rèn) PostgreSQL 服務(wù)正在運(yùn)行,請執(zhí)行以下命令:
$ sudo systemctl status postgresql-14

上面的輸出確認(rèn) PostgreSQL 服務(wù)器已啟動并正在運(yùn)行。默認(rèn)情況下,PostgreSQL 偵聽端口 5432,您可以通過運(yùn)行以下ss命令來確認(rèn)這一點(diǎn)。
$ ss -pnltu | grep 5432
您應(yīng)該得到以下輸出,確認(rèn)一切正常。

第 2 步:為 Postgres 用戶配置密碼
postgres安裝 PostgreSQL 時,會在系統(tǒng)中創(chuàng)建一個名為的默認(rèn)用戶。這是一個超級用戶,擁有執(zhí)行幾乎任何任務(wù)的訪問權(quán)限,包括管理數(shù)據(jù)庫、表、模式函數(shù)和 PostgreSQL 數(shù)據(jù)庫中的任何其他對象。
Postgres用戶使用ident認(rèn)證方式,不設(shè)置密碼。出于安全原因,建議您設(shè)置密碼以防止?jié)撛诘倪`規(guī)行為。
為此,請切換到根用戶
$ sudo su
接下來,切換到postgres用戶。
$ su - postgres
切換到 PostgreSQL shell
$ psql
然后使用如圖所示的查詢設(shè)置postgres用戶密碼。ALTER
ALTER USER postgres WITH PASSWORD 'your-password'

第 3 步:為 PostgreSQL 服務(wù)器生成 SSL 證書
要使 SSL 與 PostgreSQL 一起工作,您需要生成三個證書文件:
- server.key - 這是私鑰文件
- server.crt - 這是服務(wù)器證書文件
- root.crt - 這是受信任的根證書
首先,將目錄更改為 PostgreSQL 的數(shù)據(jù)目錄,如圖所示。
cd /var/lib/pgsql/14/data
接下來,生成一個 2048 位的 AES 加密的 RSA 私鑰,如下所示。
openssl genrsa -aes128 2048 > server.key
在創(chuàng)建私鑰期間,系統(tǒng)會提示您輸入密碼。輸入并確認(rèn)。
您稍后可以通過運(yùn)行以下命令確認(rèn)密鑰存在:
ls -l | grep server.key

私鑰有一個與之關(guān)聯(lián)的密碼。但是,為了進(jìn)一步使用此密鑰,您需要刪除密碼。為此,請運(yùn)行以下命令:
openssl rsa -in server.key -out server.key

再一次,重新輸入密碼并按 ENTER。
第 4 步:應(yīng)用所需的權(quán)限和所有權(quán)
為了增強(qiáng)安全性,您需要將私鑰的只讀權(quán)限分配給 root 用戶,如圖所示。
chmod 400 server.key
此外,將密鑰的所有權(quán)設(shè)置為 postgres 用戶和組。
chown postgres.postgres server.key
第 5 步:創(chuàng)建服務(wù)器證書文件
現(xiàn)在,根據(jù)私鑰生成一個自簽名證書文件。以下證書文件的有效期為 365 天。
# openssl req -new -key server.key -days 365 -out server.crt -x509
該命令將要求您提供一些將合并到證書文件中的信息。因此,請相應(yīng)地填寫所有詳細(xì)信息。

由于您使用的是自簽名證書,因此您將通過制作服務(wù)器證書文件的副本將其用作受信任的根證書,如圖所示。
# cp server.crt root.crt
第 6 步:配置 PostgreSQL 以使用 SSL
下一步是配置 PostgreSQL 以使用 SSL。訪問postgresql.conf位于data?目錄內(nèi)的配置文件。
$ sudo vim /var/lib/pgsql/14/data/postgresql.conf
在 下Connection Settings,找到listen_addresses參數(shù)并將其設(shè)置為允許來自所有外部主機(jī)的連接。
listen_addresses = '*'
在該SSL部分中,取消注釋以下參數(shù)并設(shè)置值,如下所示。
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 客戶端身份驗(yàn)證配置文件,指定允許連接哪些主機(jī)以及如何對客戶端進(jìn)行身份驗(yàn)證。
$ sudo vim /var/lib/pgsql/14/data/pg_hba.conf
在 下IPv4 local connections,按如下方式修改該行以允許來自所有主機(jī)的連接。
host all all 0.0.0.0/0 md5
接下來,在文件末尾添加以下行以啟用 SSL 并允許來自所有主機(jī)的連接。
hostssl all all 0.0.0.0/0 md5
保存更改并退出配置文件。要使更改生效,請重新啟動 PostgreSQL。
$ sudo systemctl restart postgresql-14
如果啟用了 firewalld,請?jiān)试S Postgresql 服務(wù),如圖所示
$ sudo firewall-cmd --add-service=postgresql --permanent
$ sudo firewall-cmd --reload
步驟 7:測試 SSL 連接
此時,PostgreSQL 已配置為使用 SSL 進(jìn)行遠(yuǎn)程連接。為此,我們將使用用戶 postgres 登錄到數(shù)據(jù)庫服務(wù)器,如圖所示
psql -U postgres -p 5432 -h 45.79.192.104
該-U標(biāo)志表示我們用來訪問數(shù)據(jù)庫服務(wù)器的登錄用戶
該-p標(biāo)志指定 PostgreSQL 正在偵聽的端口(默認(rèn)為 5432)
該-h標(biāo)志指定主機(jī)的 IP 地址。
下面的輸出確認(rèn) SSL 已啟用并且我們使用的是自簽名證書。

結(jié)論
在本教程中,我們演示了如何使用自簽名 SSL 證書在 PostgreSQL Server 上啟用 SSL 支持。我們?yōu)?PostgreSQL 服務(wù)器上配置的所有數(shù)據(jù)庫和用戶啟用了 SSL 連接。服務(wù)器將偵聽默認(rèn) PostgreSQL 端口上的所有傳入連接,并要求客戶端使用 SSL。














