技术干货 | 数据库安全功能之五——数据保密性
作为应用最广泛的信息存储和处理系统,数据库中存在大量敏感数据,如何防止数据被窃取和篡改是重中之重。加密技术是提高数据库安全的一个重要手段。优炫数据库(UXDB)是通过存储加密、传输加密和数据完整性来进行数据保护。需注意的是,并不是所有加密方法和方式都是适合数据库的。在加密数据的同时,也会带来一些相关问题,如果处理不好,不仅会降低数据库的安全性,而且还会带来其它如性能的影响。
全库加密
1)初始化集群时用参数M指定对存储文件加密,并启动
./initdb -k -M -W -D uxdb_enc
./ux_ctl -M -D uxdb_enc
2)登录控制台,创建表并插入数据
CREATE TABLE sjjm(no int, name varchar(32));
INSERT INTO sjjm VALUES(1, 'pizza');
INSERT INTO sjjm VALUES(2, 'sandwich');
CHECKPOINT;
3)查询表文件的路径
SELECT ux_relation_filepath('sjjm')
4)进入集群目录查看表文件
口令加密
1)登录加密数据库创建用户并设定密码
create user test password '1qaz!QAZ';
2)查看密码
select usename,passwd from ux_shadow ;
指定列加密
1)登录加密数据库加载uxcrypto插件
CREATE EXTENSION uxcrypto;
2)创建测试表
CREATE TABLE sjjm_01(id int, name varchar(64), pwd varchar(128));
3)以不同的加密方式插入数据
INSERT INTO sjjm_01 VALUES (1, 'zhang',digest('1qaz!QAZ','md5'));
INSERT INTO sjjm_01 VALUES (2, 'wang',digest('1qaz!QAZ','sha1'));
INSERT INTO sjjm_01 VALUES (3, 'huang', encrypt('1qaz!QAZ','aa','aes'));
4)查看表
SELECT * FROM sjjm_01;
⚠️aes是可逆加密
SELECT convert_from(decrypt('\xa998f73e7f15a1895bf3a863e4eadbb9','aa','aes'),'SQL_ASCII');
其他储存加密
跨网络加密口令
MD5认证方法在将口令发送给服务器之前由客户端对它进行双重加密。第一次 MD5 加密是基于用户名的,然后在建立数据库连接时,服务器再次加密口令。通过网络传递给服务器的就是这个双重加密的值。这样的双重加密不仅可以防止口令被发现,还可以防止稍后另一个连接使用同样的加密口令连接数据库。
跨网络加密数据
SSL 连接加密所有跨网络发送的数据、口令、查询以及返回的数据。ux_hba.conf文件允许管理员指定某些主机可以使用非加密连接(host),以及某些主机需要使用 SSL 加密的连接(hostssl)。客户端还可以指定它们只通过 SSL 连接到服务器,也可以使用Stunnel或SSH加密传输。
SSL主机认证
客户端和主机都可以提供 SSL 证书给对方。这在两边都需要一些额外的配置, 但是这种方式是比仅使用口令更强的身份验证。它避免一个计算机伪装成服务器,而且时长只要足够读取客户端发送的口令就行了。它还避免了“中间人”攻击,在其中有一台计算机处于客户端和服务器之间并伪装成服务器读取和传递两者之间的所有数据。
传输加密
生成ssl证书
1) 生成server请求证书
openssl req -new -text -out server.req
(PEM pass phrase不能为空,如输入123456,其他可以为空)
2) 生成用口令保护的密钥,并解锁
openssl rsa -in privkey.pem -out server.key
(输入上面输入的PEM pass phrase)
rm privkey.pem
3) 把证书变成自签名证书。
openssl req -x509 -in server.req -text -key server.key -out server.crt
4) 提高密钥权限
chmod og-rwx server.key
配置uxdb服务器,打开ssl开关,重启集群
vim uxsinodb.conf
ssl=on
验证
远程连接
uxsql "sslmode=require host=ip user=uxdb port=port dbname=uxdb"
在远程端口进行操作,比如插入数据。
通过wireshark进行抓包。查看是否可以抓到传输的数据。
-FIN-
D