随着云服务器的兴起,越来越多的数据库服务器被安装在远程。用SSL连接代替明文连接,是数据库的基本安全功能。很庆幸
PostgreSQL很早就支持openSSL,各发行版本都带有openSSL连接库(libeay32.dll和ssleay32.dll,可能还有某版本VC运行库)。
PostgreSQL的SSL连接分两块:
1、服务端的SSL验证:用SSL连接代替明文连接以防止网络包被窃听和防止他人伪装成服务器
2、客户端的SSL验证:用客户端SSL证书登录代替密码登录。
本文只讲第一块:服务端的SSL验证。以下是部署步骤,对SSL不了解者请先自行补脑一下。
一:修改postgresql.conf配置:
ssl改为on,ssl_cert_file设为证书文件,ssl_key_file设为私钥文件,只要这三个地方设置好就可以了,其他ssl设置属于高级型,选择默认就好。注意:ssl_ca_file是用在客户端SSL认证上,服务端的SSL验证和此参数无关。
二、生成证书文件和私钥文件,需要用到openssl命令(请自行到openssl网站上下载),以证书类型分为3类:
A: 自签名证书:证书颁发者和主题是一样,自己给自己颁发,此类证书不需要根证书认证,所以是不安全的,是无法防止他人伪装成服务器,但如果服务器是按IP地址连接的,也许对这项要求不是很注重,所以自签名证书就够了
openssl req -new -x509 -days 365 -nodes -text -out server.crt -keyout server.key -subj "/CN=xx.xx.xx"
CN=后面是 证书主题如域名或IP地址,此命令生成证书文件server.crt 和私钥文件 server.key ,请将它们部署在数据库服务器上,并设好ssl_cert_file、ssl_key_file参数。
B:建立本地根CA,再由根CA签发服务器证书:
1、建立本地根CA
openssl req -new -nodes -text -out root.csr -keyout root.key -subj "/CN=XX.XX.XX"
openssl x509 -req -in root.csr -text -days 3650 -extfile openssl.cfg -extensions v3_ca -signkey root.key -out root.crt
-- 生成两个有用的文件 root.key (根CA的私钥,请离线保存), root.crt(根CA证书)
2、由根CA颁发服务器证书:
openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=XX.XX.XX"
openssl x509 -req -in server.csr -text -days 365 -CA root.crt -CAkey root.key -CAcreateserial -out server.crt
-- 生成两个有用的文件 server.key(服务器私钥),server.crt(服务器证书)
请将server.key和server.crt部署在服务器,本地根证书root.crt部署在客户端,PostgreSQL客户端不依赖操作系统的证书,需要自行制定根证书的存放地方,所以即使是自行发行的根证书,也认为是合法的。在windows下根证书默认存放目录是$appdata/postgresql目录下。
C:公共CA签署的证书
由知名CA签署的证书,大部分要收使用费,一般用在有域名的服务器上。申请后一般会得三个文件服务器私钥server.key、服务器证书server.crt、颁布者CA自己的证书。请将server.key和server.crt部署在服务器。客户端的公共root.crt可从 libcurl网站获取最新的pem文件,此文件含有目前世界已知所有CA的证书,将此文件改名为root.crt,并部署在客户端的$appdata/postgresql目录下,若在sslmode=verify-ca模式登陆失败,可能是颁布者CA的证书不含在root.crt里,可将颁布者CA的证书连接到root.crt(文本格式可编辑),也可连接到部署在服务器的服务器证书server.crt,建议后者。
三、数据库连接SSL选项sslmode,安全等级由低到高:
disable: 只尝试非SSL连接
allow:首先尝试非SSL连接,若失败再尝试SSL连接
prefer
(default):首先尝试SSL连接,若失败再尝试非SSL连接
require:只尝试SSL连接,若有根证书存在,等同于verify-ca
verify-ca:只尝试SSL连接,并用根证书验证服务器证书是不是根CA签发的
verify-full:只尝试SSL连接,并用根证书验证服务器证书是不是根CA签发的,且主题必须匹配连接域名或IP地址
如 psql -Upostgres "host=xxx.xxx.xxx.xxx dbname=xxx sslmode=verify-full"
大部分客户端接口如ODBC\LIBPQ都可以设置sslmode参数
四、服务器pg_hba.conf登录控制文件
SSL部署成功后,就可设定公网IP只允许SSL登录了
...
hostssl all all 0.0.0.0/0 md5
hostnossl all all 0.0.0.0/0 reject
....
总结:postgresql的SSL部署相对其他软件是比较容易的,SSL层嵌在TCP层和应用层之间,对应用层来说是透明的,以前怎么操作现在就怎么操作,开销小但所有传输都已加密。
如果数据库服务器只有IP地址或者不需要被公共访问,建议AB两种证书就好,B的安全性会高点,因为有客户端的root.crt在验证服务器证书,SSL安全等级可达到verify-full.
阅读(4418) | 评论(0) | 转发(0) |