KingbaseES V8R6 表空间加密
透明存储加密优势
透明存储加密可确保加密敏感数据满足合规性要求,并提供简化加密操作的功能,优势如下:
- 作为安全管理员,您可以确保敏感数据已加密,因此在存储介质或数据文件被盗或入侵者试图从操作系统访问数据文件时,绕过访问控制数据库。
- 使用透明存储加密可帮助您解决与安全相关的法规遵从性问题。
- 您无需创建辅助表、触发器或视图来为授权用户或应用程序解密数据。处理敏感数据的应用程序可以使用透明存储加密提供强大的数据加密,而无需修改应用程序。
- 对于访问该数据的数据库用户和应用程序,数据被透明地解密。数据库用户和应用程序不需要知道他们正在访问的数据是以加密形式存储的。
- 透明存储加密可以在线进行,无需停止数据库服务。
- 数据库系统自动维护密钥管理,用户或应用程序不需要管理加密密钥。
注意的是表空间加密方式和表加密方式是互斥的,同一加密对象不允许同时支持这两种加密方式。
开启透明存储加密
修改 kingbase.conf 文件中 shared_preload_libraries 参数。
shared_preload_libraries = 'sysencrypt'
重启数据库服务
新建数据库需要安装扩展
CREATE EXTENSION sysencrypt;
还需要打开钱包功能:
打开钱包:
OPENUP WALLET WITH PASSWORD “654321”;
关闭钱包:
CLOSEUP WALLET WITH PASSWORD “654321”;
表空间加密
1、关于表空间加密功能
表空间加密能够加密表空间中存储的所有数据。表空间加密在读取和写入操作期间对数据进行加密或解密。
块加密是在数据页面需要同步到外存时进行加密操作;从外存读取数据页面到缓冲区时,首先进行解密操作。内存中的数据都是解密后的数据。当数据从内存落盘时进行加密。
2、表空间加密的限制
表空间是对整个表空间数据加密,所以不受表加密的相关限制,对数据类型、约束和索引都没有要求。
3、表空间加密的系统参数
设置sysencrypt.encrypt_user_tablespace参数,可以指定是否默认对创建的用户表空间加密,默认为false。
4、表空间加密的使用
创建表空间加密
需要在表空间的定义最后加上encrypted关键字,如下所示:
CREATE TABLESPACE tablesspacename LOCATION '@tablespace@' with(encryption = true[, enckey = encryptkey]);
encryption
标识当前表空间是否为加密表空间,true为是,false为否。
enckey
用户自定义的表空间加密密钥,最大有效长度16字节,超出长度会被截断。默认不指定。使用数据库自生成秘钥加密表空间。
TABLESPACE tablespace_name
tablespace_name
是新表要创建于其中的表空间名称。如果没有指定,将参考default_tablespace,如果表是临时的则参考temp_tablespaces。
测试
1、不指定加密表空间,使用默认创建表空间,用户不指定密钥:
CREATE TABLESPACE ENC_TS_KEY_TEST LOCATION '/home/kingbase7/spce' with(encryption = true);
设置加密表空间为默认表空间
set default_tablespace=ENC_TS_KEY_TEST;
创建表和索引,不指定加密表空间
CREATE TABLE TEST_ENC_NOKEY(ID INT, NAME VARCHAR(100)) ;
CREATE INDEX INDEX_ENC ON TEST_ENC_NOKEY(ID);
插入数据,查看表文件
INSERT INTO TEST_ENC_NOKEY VALUES(GENERATE_SERIES(1, 10000), 'KINGBASE');
CHECKPOINT;
select sys_relation_filepath('TEST_ENC_NOKEY');
sys_relation_filepath
-----------------------------------------------
sys_tblspc/41144/SYS_12_202209081/12145/41145
(1 row)
查看数据文件已经无法显示完整的字符,说明表TEST_ENC_NOKEY已经被加密了。
hexdump -c 41145 |grep k
2、指定加密表空间设置默认表空间为空
TEST=# set default_tablespace ='';
SET
再继续创建一张表不指定表空间,插入数据并查看,
CREATE TABLE TEST_ENC (ID INT, NAME VARCHAR(100)) ;
INSERT INTO TEST_ENC VALUES(GENERATE_SERIES(1, 100), 'KINGBASE');
CHECKPOINT;
select sys_relation_filepath('TEST_ENC');
sys_relation_filepath
-----------------------
base/12145/41149
(1 row)
hexdump -c 41149 |grep k
输出结果可以看到完整的字符串KINGBASE,说明表没有被加密。
没有加密的原因是,取消了默认表空间为加密表空间。
下面再测试一下,指定创建表的表空间为加密表空间
CREATE TABLE TEST_ENC_T (ID INT, NAME VARCHAR(100)) TABLESPACE ENC_TS_KEY_TEST;
INSERT INTO TEST_ENC_T VALUES(GENERATE_SERIES(1, 100), 'KINGBASE') ;
CHECKPOINT;
select sys_relation_filepath('TEST_ENC_T');
TEST=# select sys_relation_filepath('TEST_ENC_T');
sys_relation_filepath
-----------------------------------------------
sys_tblspc/41144/SYS_12_202209081/12145/41152
(1 row)
hexdump -c 41152 |grep k
输出结果看,没有完整的字符串表现出表中数据,说明表已经被加密,所以,如果没有设置默认表空间为加密表空间,创建表时候需要指定表空间为加密表空间。
总结
加密表空间可以设置为默认表空间,之后在其下创建的表默认就是加密状态。
如果没开启默认表空间为加密表空间参数default_tablespace,创建表时需要指定表空间为加密表空间。