背景:
因为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、将下面信息粘贴至文件中
[ 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、将下面信息粘贴至文件中
#!/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、复制如下配置信息到文件中
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 点击【测试链接】
到此这篇关于postgresql数据库配置ssl操作的实现方法的文章就介绍到这了,更多相关postgresql配置ssl内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!