PostgreSQL数据库配置SSL操作说明书

背景:

因为postgresql或者mysql目前通过docker安装,只需要输入主机IP、用户名、密码即可访问成功,这样其实是不安全的,可能会通过一些手段获取到用户名密码导致数据被窃取。而ES、kafka等也是通过用户名/密码方式连接,但是这些数据重要性相比较于数据库要低一些,毕竟都是一些日志以及消息而已。

解决方案:

通过开启SSL证书认证的方式加强防护,配合使用防火墙策略白名单方式、增加密码复杂度。本文档主要是介绍开启SSL认证方式。

具体实施步骤:

一、创建目录存储配置信息

复制代码
1、mkdir   /postgre 
2、进入 文件夹
cd postgre
3、创建目录 
mkdir certs
4、创建目录 
mkdir data

二、创建Openssl配置文件

复制代码
1、进入cd /postgre/certs 目录
2、执行 touch openssl.cnf
3、修改文件
   vim openssl.cnf
4、将下面信息粘贴至文件中
java 复制代码
[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
req_extensions     = req_ext
prompt             = no

[ req_distinguished_name ]
C  = CN
ST = Beijing
L  = Beijing
O  = MyOrg
OU = IT
CN = postgres
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
IP.1 = 192.168.2.1  #数据库主机地址
DNS.1 = postgres    #数据库用户名

如下图:

三、创建SSL证书生成脚本generate_certs.sh

复制代码
1、进入 cd /postgre/certs 目录
2、touch  generate_certs.sh
3、vim generate_certs.sh
4、将下面信息粘贴至文件中
java 复制代码
#!/bin/bash
ROOT_KEY="root.key"
ROOT_CRT="root.crt"
SERVER_KEY="server.key"
SERVER_CSR="server.csr"
SERVER_CRT="server.crt"
DAYS=365
BITS=2048

echo "生成根私钥..."
openssl genpkey -algorithm RSA -out "$ROOT_KEY"

echo "生成根证书..."
openssl req -x509 -new -nodes -key "$ROOT_KEY" -sha256 -days "$DAYS" -out "$ROOT_CRT" -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Root CA/OU=IT Department/CN=postgres"

echo "生成服务器私钥..."
openssl genpkey -algorithm RSA -out "$SERVER_KEY"

echo "生成证书签名请求 (CSR)..."
openssl req -new -key "$SERVER_KEY" -out "$SERVER_CSR" -config openssl.cnf

echo "使用根证书签署服务器证书..."
openssl x509 -req -in "$SERVER_CSR" -CA "$ROOT_CRT" -CAkey "$ROOT_KEY" -CAcreateserial -out "$SERVER_CRT" -days 365 -extfile openssl.cnf

echo "验证服务器证书..."
openssl verify -CAfile "$ROOT_CRT" "$SERVER_CRT"

echo "生成完成!以下是生成的文件:"
ls -l "$ROOT_KEY" "$ROOT_CRT" "$SERVER_KEY" "$SERVER_CSR" "$SERVER_CRT"

如图:

四、创建配置证书目录以及生成证书

复制代码
1、执行cd /postgre/certs
2、执行sh generate_certs.sh 运行该脚本
3、如下图代表生成成功
4、查看生成的证书

五、为证书目录赋权限,以便postgre容器可以访问执行这些证书

复制代码
1、cd /postgre
2、chmod 777 certs
3、chmod 777 data
2、chown 999:999 certs/* 之所以所属用户/组设置为999 是因为postgre默认进程所属就是999。
3、chmod 600 certs/* 为证书目录设置为所属用户可读可写,如果权限过大会在连接数据库时报错!

六、创建配置文件postgresql.conf

复制代码
1、进入 cd  /postgre
2、执行 touch postgresql.conf 命令
3、执行 vim postgresql.conf 命令
4、复制如下配置信息到文件中
java 复制代码
ssl = on                                              #开启SSL认证                                                                                                                                                                     
ssl_cert_file = '/var/lib/postgresql/certs/server.crt'         #服务器证书路径                                                                                                                                                            
ssl_key_file = '/var/lib/postgresql/certs/server.key'         #密钥路径                                                                                                                                                             
ssl_ca_file = '/var/lib/postgresql/certs/root.crt'             #根证书路径                                                                                                                                                            
listen_addresses = '*'                                   #监听所有                                                                                                                                                                  
ssl_min_protocol_version = 'TLSv1.2'                     #SSL等级最小为1.2                                                                                                                                                                  
logging_collector = on                                   # 开启日志                                                                                                                                                                  
log_directory = 'log'                                                                                                                                                                                                      
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'                                                                                                                                                                            
log_rotation_age = 1d  # 日志文件保留一天后轮换                                                                                                                                                                            
log_rotation_size = 10MB  # 当日志文件达到10MB时轮换                                                                                                                                                                       
log_min_messages = debug  # 记录警告级别及以上的消息                                                                                                                                                                       
log_connections = on  # 记录连接尝试                                                                                                                                                                                       
log_disconnections = on  # 记录断开连接 

如下图

七、创建配置文件pg_hba.conf

复制代码
1、cd /postgre
1、执行 touch pg_hba.conf 命令
2、执行 vim pg_hba.conf 命令
3、复制如下配置信息到文件中
hostssl  all  all  0.0.0.0/0  cert  clientcert=1     

如下图

八、安装并启动PostgreSQl

复制代码
1、安装postgreSQL 13.3版本 
镜像会提供给运维。
2、启动postgreSQL容器
docker run -d --name my-postgres-ssl -p 5432:5432  -e POSTGRES_PASSWORD=xxxx  -v /postgre/postgresql.conf:/etc/postgresql/postgresql.conf -v /postgre/certs:/var/lib/postgresql/certs -v /postgre/data:/var/lib/postgresql/data  b2fcd079c1d4 -c 'config_file=/etc/postgresql/postgresql.conf'

其中 -e POSTGRES_PASSWORD=password 为数据库设置密码为 "password" 默认用户名为 "postgres"

其中 -v /postgre/postgresql.conf:/etc/postgresql/postgresql.conf  将宿主机的配置文件挂载到容器中。

其中 -v /postgre/certs:/var/lib/postgresql/certs 为数据库映射证书目录 将宿主机中的证书目录挂载到容器中 前面为宿主机目录 后面为容器中目录。可固定写死。

其中 -v /postgre/data:/var/lib/postgresql/data  为数据库映射数据存储目录。
其中 -c 'config_file=/etc/postgresql/postgresql.conf' 强制数据库使用自定义的配置文件,忽略系统内置的配置信息 后面会介绍如何编写postgresql.conf文件。

九、替换容器中的pg_hba.conf配置文件

复制代码
1、查询 容器id  执行 
docker ps --filter "name=my-postgres-ssl" --format "{{.ID}}"
2、将配置文件复制容器中
docker cp /postgre/pg_hba.conf 容器ID:/var/lib/postgresql/data
3、重启docker容器
docker restart 容器ID
4、查看运行日志
docker logs -f --tail 200 容器ID
5、如图则运行成功

十、使用客户端连接数据库 此处使用Navicat

复制代码
其中SSL配置中 客户端密钥 上传 server.key
                客户端证书 上传 server.crt
                根证书     上传 root.crt
点击【测试链接】


相关推荐
找不到、了1 小时前
MySQL的窗口函数介绍
数据库·mysql
执笔诉情殇〆1 小时前
springboot集成达梦数据库,取消MySQL数据库,解决问题和冲突
数据库·spring boot·mysql·达梦
软件技术NINI2 小时前
springMvc的简单使用:要求在浏览器发起请求,由springMVC接受请求并响应,将个人简历信息展示到浏览器
数据库·mysql
SailingCoder3 小时前
MongoDB Memory Server与完整的MongoDB的主要区别
数据库·mongodb
水木石画室3 小时前
MongoDB 常用增删改查方法及示例
数据库·mongodb
旷世奇才李先生3 小时前
MongoDB 安装使用教程
数据库·mongodb
qq_339282233 小时前
mongodb 中dbs 时,local代表的是什么
数据库·mongodb
阿里云大数据AI技术4 小时前
AI搜索 MCP最佳实践
数据库·人工智能·搜索引擎
斯普信专业组4 小时前
K8s环境下基于Nginx WebDAV与TLS/SSL的文件上传下载部署指南
nginx·kubernetes·ssl
笑衬人心。5 小时前
项目中数据库表设计规范与实践(含案例)
服务器·数据库·设计规范