1. 系統與軟件更新
保持Debian系統和PostgreSQL軟件包為最新版本,及時修復已知安全漏洞。定期執行以下命令:
sudo apt update && sudo apt upgrade
2. 安裝PostgreSQL及初始配置
通過Debian官方倉庫安裝PostgreSQL及其附加組件(如postgresql-contrib
提供額外工具):
sudo apt install postgresql postgresql-contrib
安裝后,默認超級用戶postgres
無密碼,需立即設置強密碼:
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'StrongPassword123!'"
3. 配置PostgreSQL核心參數
修改postgresql.conf
(路徑:/etc/postgresql/<version>/main/postgresql.conf
),優化基礎安全設置:
listen_addresses
從'*'
(允許所有IP)改為'localhost'
(僅本地訪問)或特定IP段(如'192.168.1.0/24'
),減少遠程暴露風險;port
(默認5432)為非標準端口(如5433),增加攻擊探測難度;max_connections
(如100),防止資源耗盡攻擊。sudo systemctl restart postgresql
4. 強化客戶端訪問控制
編輯pg_hba.conf
(路徑:/etc/postgresql/<version>/main/pg_hba.conf
),配置細粒度的客戶端認證規則:
peer
認證(操作系統用戶與數據庫用戶同名),提升本地訪問安全性;md5
密碼認證訪問特定數據庫,示例如下:# 本地連接(操作系統用戶=數據庫用戶)
local all postgres peer
local all all peer
# 可信IP段(如公司內網)遠程訪問
host all all 192.168.1.0/24 md5
# 拒絕其他所有遠程連接
host all all 0.0.0.0/0 reject
修改后重啟服務:
sudo systemctl restart postgresql
5. 啟用SSL/TLS加密傳輸
為防止數據在傳輸過程中被竊取或篡改,需配置SSL加密:
mkdir -p /etc/postgresql/ssl
openssl req -new -x509 -days 365 -nodes -text -subj "/CN=postgres" -out /etc/postgresql/ssl/server.crt -keyout /etc/postgresql/ssl/server.key
chmod 600 /etc/postgresql/ssl/server.key # 密鑰文件必須為root-only權限
postgresql.conf
,添加以下參數:ssl on
ssl_cert_file '/etc/postgresql/ssl/server.crt'
ssl_key_file '/etc/postgresql/ssl/server.key'
重啟服務使配置生效:
sudo systemctl restart postgresql
6. 用戶與權限精細化管理
postgres
超級用戶執行日常操作,創建具有最小必要權限的用戶:sudo -u postgres psql -c "CREATE USER app_user WITH PASSWORD 'AppPassword456!'"
SELECT
、INSERT
),避免過度授權:sudo -u postgres psql -c "CREATE DATABASE app_db OWNER app_user"
sudo -u postgres psql -c "GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA public TO app_user"
sudo -u postgres psql -c "REVOKE DELETE, UPDATE ON app_table FROM app_user"
7. 數據加密(敏感字段)
使用pgcrypto
擴展對數據庫中的敏感數據(如身份證號、手機號)進行加密存儲:
sudo -u postgres psql -d app_db -c "CREATE EXTENSION IF NOT EXISTS pgcrypto"
pgp_sym_encrypt
):INSERT INTO users (name, phone) VALUES ('張三', pgp_sym_encrypt('13800138000', 'aes_key'));
pgp_sym_decrypt
函數:SELECT name, pgp_sym_decrypt(phone, 'aes_key') AS phone FROM users;
8. 審計與日志監控
啟用PostgreSQL日志功能,記錄關鍵操作(如登錄、SQL執行),便于事后追溯:
postgresql.conf
:添加以下參數:log_statement = 'all' # 記錄所有SQL語句(生產環境可調整為'dml'或'ddl',減少日志量)
log_connections = true # 記錄連接嘗試
log_disconnections = true # 記錄斷開連接
log_directory = 'pg_log' # 日志目錄(默認已開啟)
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # 日志文件名格式(按日期和時間分割)
tail
命令實時查看日志,或通過logrotate
工具定期歸檔日志(避免日志文件過大):sudo tail -f /var/log/postgresql/postgresql-<version>-main.log
9. 防火墻配置
使用UFW(Uncomplicated Firewall)限制PostgreSQL端口的訪問,僅允許可信IP地址訪問:
sudo ufw allow from 192.168.1.0/24 to any port 5432/tcp # 允許內網IP訪問
sudo ufw enable # 啟用防火墻
sudo ufw status # 查看防火墻規則
10. 定期備份與恢復測試
制定備份策略,使用pg_dump
工具定期備份數據庫,并將備份文件存儲在安全位置(如異地服務器、云存儲):
sudo -u postgres pg_dump -U postgres -F c -b -v -f /backup/app_db_backup.dump app_db
sudo -u postgres psql -U postgres -d app_db -f /backup/app_db_backup.dump