postgresql利用openssl实现网络数据传输加密

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

通常情况下,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进行数据加密抓的包(过程不再叙述):

    

    效果已经很明显了,传输数据确实被加密了。

转载于:https://my.oschina.net/tianbing/blog/744826

你可能感兴趣的:(数据库,shell,python)