openGauss 5.0.0全密态数据库应用小试

前言

openGauss HCIA教材中,安全是一个重要的章节,在实际项目中,随着网络安全和信息安全形势的变化,企业也越来越重视数据库安全。去年在HALP内部进行openGauss培训时,安全特性就被学员们提出来要重点讲解,而全密态等值查询则又是其中重要的一环。根据官网介绍,实际上openGauss在早期的1.0.0版本就引入了全密态等值查询特性,因此下面结合操作举例,尝试对openGauss 5.0.0版本全密态的使用进行介绍,供有需要的同行参考,不当之处并请提出宝贵意见和建议。

一、教材中关于全密态的内容

(教材内容和官网基本一致)

  • 全密态数据库

关于全密态数据库,官网上的介绍如下:

密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传输、运算以及存储的各个环节始终都处于密文状态。当数据拥有者 在客户端完成数据加密 并发送给服务端后,在攻击者借助系统脆弱点窃取用户数据的状态下仍然无法获得有效的价值信息,从而起到保护数据隐私的作用。

参见官网:https://docs.opengauss.org/zh/docs/5.0.0/docs/AboutopenGauss/全密态数据库等值查询.html

其重点在于,openGauss对数据的加密是在客户端进行的,如下图所示,才能保证在传输,计算和存储过程中都是密文,及时被破坏者截获或者盗取,也只能看到的是加密数据,避免了数据泄露。

通过全密态数据可以保证云数据库的数据安全,攻击者无法从服务端获取有效数据。基于此可以为云服务商赢得客户信任提供技术保障。

二、全密态数据库的应用

全密态数据库的应用大致分为以下几个步骤:密钥创建、加密表创建、全密态等值查询。

1. 密钥创建

  • 确定密钥存储路径

增加环境变量:需要确保计划存放密钥文件的路径存在,且系统创建的数据库用户(本文为omm)有编辑权限,如下图:

简单起见可以用如下语句赋予权限,实际项目中按需赋权,不建议赋予7 77权限

复制代码
chmod -R 777 /opt/software/openGauss/
  • 增加环境变量:

    export LOCALKMS_FILE_PATH=/opt/software/openGauss

执行完成后查看,生成文件:

GSQL连接全密态数据库

复制代码
gsql -p 5432 -d postgres -r --C

其中-C表示是打开密态开关。

  • 创建用户密钥。

其中密钥包括CMK和CEK。CMK是主密钥,用于加密CEK;而CEK是数据密钥,用于加密数据。CEK的创建要依赖于CMK,因此要先创建CMK,再创建CEK。

创建CMK:

复制代码
CREATE CLIENT MASTER KEY ImgCMK WITH (KEY_STORE = localkms, KEY_PATH = "key_path_value", ALGORITHM = RSA_2048);

CREATE CLIENT MASTER KEY

说明:当前KEY_STORE仅支持localkms,ALGORITHM 支持RSA_2048、RSA3072和SM2

创建CEK:

复制代码
CREATE COLUMN ENCRYPTION KEY ImgCEK WITH VALUES (CLIENT_MASTER_KEY = ImgCMK, ALGORITHM = AEAD_AES_256_CBC_HMAC_SHA256);

CREATE COLUMN ENCRYPTION KEY

重要说明:由于SM2、SM3、SM4等算法属于中国国家密码标准算法,为规避法律风险,需配套使用。如果创建CMK时指定SM4算法来加密CEK,则创建CEK时必须指定SM4_SM3算法来加密数据。

  • 查询创建的密钥

    SELECT * FROM gs_client_global_keys;

2. 加密表创建:

  • 创建另外一个数据库用户

    create user fishinwater identified by "***********";

(实际密码隐藏掉)

  • 创建加密表:

    CREATE TABLE creditcard_info (id_number int, name text encrypted with (column_encryption_key = ImgCEK, encryption_type = DETERMINISTIC),credit_card varchar(19) encrypted with (column_encryption_key = ImgCEK, encryption_type = DETERMINISTIC));

注意:对于需要加密的列要说明 encrypted with ......,其中encryption_type_value的可选值为[ DETERMINISTIC | RANDOMIZED ],本例中选择DETERMINISTIC。

查看上面创建的密态表,可以看到后面两列是加密的:

复制代码
\d creditcard_info

需要注意的是当前版本的OpenGauss仅支持按列进行加密,暂不支持按行进行加密。

  • 插入数据:

    INSERT INTO creditcard_info VALUES (1,'joe','6217986500001288393');

    INSERT INTO creditcard_info VALUES (2, 'joy','6219985678349800033');

就不截图了,简单的insert语句而已。

3. 全密态等值查询

  • 打开密态开关

    复制代码
    (enable_ce=1)

打开密态开关即连接时带上"-C"参数,JDBC连接的话,设置参数enable_ce的值为1:

复制代码
(enable_ce=1)

在当前打开密态开关的情况下,是可以正常查询数据的,如下:

复制代码
select * from creditcard_info;

也可以在where条件中用加密字段进行查询:

复制代码
select * from creditcard_info where name = 'joe';
  • 关闭密态开关:

    gsql -p 5432 -d postgres --r

注意没有带"-C"参数,则查询的数据是密文,且无法在WHERE条件中使用加密列。

如在条件中用到加密列,会报错如下:

查询到的密文数据:

4. 其他数据库用户查询

被赋予了查询权限的用户(本例为fishinwater),即使打开密态开关,也无法查询加密数据,报错如下:

复制代码
ERROR(CLIENT): failed to decrypt column encryption key

但是只查询非加密列是正常的,篇幅所限就不附图了。

当没有打开密态开关时,查询到的是密文,和创建秘钥的用户不打开密态开关的效果相同,也不再进行附图说明。

需要说明的是,当前版本的全密态数据库的应用仍有较多的约束条件,期待随着版本演进,openGauss对全密态数据库的支持更加强大,具体约束可以参考官网。

https://docs.opengauss.org/zh/docs/5.0.0/docs/AboutopenGauss/全密态数据库等值查询.html

结语:

全密态数据库为用户敏感隐私数据的保护提供了更多的一种选择,在信息保护和数据安全越来越重要的今天,将作为openGauss的重要特性,为openGauss的更加壮大提供重要的技术基础。

本文内容来自于数据库领域资深技术专家赵锋老师,希望我们的文章正好能解决你的问题。

相关推荐
什么半岛铁盒6 分钟前
Linux信号的保存
linux·运维·网络
百锦再13 分钟前
大数据技术的主要方向及其应用详解
大数据·linux·网络·python·django·pygame
lyrhhhhhhhh23 分钟前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵2 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多2 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
初次见面我叫泰隆2 小时前
MySQL——1、数据库基础
数据库·adb
Chasing__Dreams2 小时前
Redis--基础知识点--26--过期删除策略 与 淘汰策略
数据库·redis·缓存
源码云商2 小时前
【带文档】网上点餐系统 springboot + vue 全栈项目实战(源码+数据库+万字说明文档)
数据库·vue.js·spring boot
源远流长jerry3 小时前
MySQL的缓存策略
数据库·mysql·缓存
纯纯沙口3 小时前
Qt—用SQLite实现简单的注册登录界面
数据库·sqlite