2019独角兽企业重金招聘Python工程师标准>>>
通常情况下,postgresql服务端和客户端之间的数据传输是明文传送的,那这就有一定的安全隐患。怎么让数据通过密文的形式进行传输呢?可以利用openssl实现这一要求,但前提条件是服务端和客户端都要安装openssl工具包。在服务端安装好openssl之后,就可以利用openssl指令生成一对私钥和证书,用以对数据进行加解密,然后再对配置文件稍作修改就可以了。
1. 利用openssl生成私钥和证书,可以写成一个shell脚本来实现。
#!/bin/bash
#/C -- Country Name
#/ST -- Province Name
#/L -- Locality Name (eg, city)
#/O -- Organization Name (eg, company)
#/CN -- Common Name (eg, your name or your server's hostname):
openssl req -nodes -new -text -subj "/C=CH/ST=Shandong/L=Jinan/O=HighGo/CN=tbing" -out server.req
openssl rsa -in privkey.pem -out $PGDATA/server.key
rm privkey.pem
openssl req -x509 -in server.req -text -key $PGDATA/server.key -out $PGDATA/server.crt
rm server.req
chown -R $LOGNAME $PGDATA/server.key $PGDATA/server.crt
chmod 600 $PGDATA/server.key
在执行脚本文件前,注意定义好data目录的环境变量。执行脚本后就会发现在data目录下生成两个文件:私钥server.key和证书server.crt。在shell脚本中需要对这两个密钥修改一下权限,否则数据库起动不了。
2. 修改postgresql.conf配置文件,打开ssl连接。
ssl = on # (change requires restart)
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
# (change requires restart)
ssl_prefer_server_ciphers = on # (change requires restart)
ssl_ecdh_curve = 'prime256v1' # (change requires restart)
ssl_cert_file = 'server.crt' # (change requires restart)
ssl_key_file = 'server.key' # (change requires restart)
3. 修改pg_hba.conf配置文件,以hostssl方式连接。
hostssl all all 0.0.0.0/0 md5
4. 重启数据库,使配置生效。
5. psql -h localhost连接数据库,就可以看到提示是ssl连接。
psql (2.0.1)
SSL连接 (加密:DHE-RSA-AES256-SHA,二进制位: 256)
这样利用openssl进行数据加密的环境就算搭好了。下面我们来通过抓包来测试一下。
1. 在数据库中新建一个表test,插入数据。
postgres=# create table test(n int);
CREATE TABLE
postgres=# insert into test select generate_series(1, 100);
INSERT 0 100
postgres=#
2. 用远程psql连接本地数据库。
psql postgres -U postgres -W -h 192.168.100.120 -p 5432
3. 然后在服务端执行抓包命令。
tcpdump -t -s 0 -c 20 ip host 192.168.100.120 and 192.168.100.128 -w ./ssl.cap
4. 在远程psql端命令行执行一个查询语句。
select * from test;
5. 此时,会在服务端生成抓的一个包ssl.cap,利用wireshark对其进行解析,得到如下结果:
对比没有用openssl进行数据加密抓的包(过程不再叙述):
效果已经很明显了,传输数据确实被加密了。