PostgreSQL 启用 SSL

PostgreSQL 提供多种通信安全机制,SSL 是其中一种,类似于网站启用 https。可以配置服务端单向验证,也可以配置服务端和客户端双向验证。

这里记录单向验证的证书配置方法,作用主要是通过加密通道传输数据,防止被中间人抓包窃取。

生成证书

openssl req -new -text -passout pass:abcd -subj /CN=localhost -out server.req -keyout privkey.pem
openssl rsa -in privkey.pem -passin pass:abcd -out server.key
openssl req -x509 -in server.req -text -key server.key -out server.crt

配置证书权限

由于要在 Docker 容器中使用,镜像使用官方维护的 postgres ,容器中运行数据库的用户为 postgres,id 为 999,把证书的所有权赋予该用户。

sudo chown 999 server.key

容器配置

这里使用 Docker Compose 管理容器,docker-compose.yml 内容如下:

services:

  postgres:
    image: postgres
    command: -c ssl=on -c ssl_cert_file=/var/lib/postgresql/server.crt -c ssl_key_file=/var/lib/postgresql/server.key
    restart: unless-stopped
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: 123456
    volumes:
      - "$PWD/data:/var/lib/postgresql/data"
      - "$PWD/server.key:/var/lib/postgresql/server.key"
      - "$PWD/server.crt:/var/lib/postgresql/server.crt"

  pgadmin4:
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: 'user@abc.com'
      PGADMIN_DEFAULT_PASSWORD: '654321'
    restart: unless-stopped
    ports:
      - 8080:80

这里通过命令行调整 postgres 的数据库配置,也可以通过配置文件调整。

主要是确保证书映射到容器中,其次是配置文件中要启用 ssl 且证书相关配置的文件路径要正确。