• 金仓数据库KingbaseES安全指南--9.透明存储加密


    目录

    9.1. 透明存储加密简介

    9.1.1. 关于透明存储加密

    9.1.2. 透明存储加密的工作原理

    9.1.3. 使用透明存储加密的优势

    9.1.4. 配置透明存储加密的权限

    9.1.5. 透明加密的类型和组成部分

    9.2. 表加密

    9.2.1. 关于表加密

    9.2.2. 表加密的使用

    9.3. 表空间加密

    9.3.1. 关于表空间加密

    9.3.2. 表空间加密的限制

    9.3.3. 表空间加密的系统参数

    9.3.4. 表空间加密的使用

    9.4. 透明存储加密与其他功能结合

    9.4.1. 逻辑备份还原加密

    9.4.2. 主备集群的透明存储加密

    9.4.3. 透明存储加密与接口的结合

    9.5. 使用透明存储加密的注意事项

    9.5.1. 使用透明存储加密的安全建议

    9.5.2. 管理数据文件的安全性

    9.5.3. 透明存储加密和数据关闭操作


    9.1. 透明存储加密简介

    透明存储加密使您能够加密敏感数据,例如信用卡号或身份证号码。

    • 透明存储加密

    透明存储加密使您能够加密存储在表和表空间中的敏感数据。

    • 配置透明存储加密的工作原理

    KingbaseES数据库透明加密框架使用钱包机制管理加密。

    • 使用透明存储加密的优势

    透明存储加密可确保敏感数据得到加密,满足合规性要求,并提供可简化加密操作的功能。

    • 配置透明存储加密权限

    若要配置透明存储加密,必须授予您管理权限或系统权限。

    • 透明存储加密的类型和组件

    透明存储加密可以应用表、表空间级别。

    9.1.1. 关于透明存储加密

    透明存储加密能够加密存储在表和表空间中的敏感数据。加密数据后,当授权用户或应用程序访问此数据时,将以透明方式解密此数据。透明存储加密有助于在存储介质或数据文件被盗时保护存储在介质上的静态数据。KingbaseES实现了数据在写到磁盘上时对其进行加密,当授权用户重新读取数据时再对其进行解密。无需对应用程序进行修改,授权用户甚至不会注意到数据已经在存储介质上加密,加密解密过程对用户都是透明的。

    KingbaseES数据库使用身份验证、授权和审计等机制来保护数据库中的数据,但不保护存储在操作系统数据文件中的数据。为了保护这些数据文件,KingbaseES数据库提供了透明存储加密,对存储在数据文件中的敏感数据进行加密。为了防止未经授权的解密,将加密密钥存储加密容器中,使用钱包机制管理。

    9.1.2. 透明存储加密的工作原理

    密钥管理中包括主密钥的生成,更换,对象密钥的生成,对象密钥同步到备机等内容,其中钱包机制是最核心最重要的。KingbaseES数据库透明加密框架中引入了钱包概念,钱包是一个加密容器,用于存储所有密钥,包括主密钥文件和对象密钥文件。钱包的另一个优点是可以对密钥进行统一管理,与数据文件分开,因此,没有钱包,即使得到了数据文件,数据也是不能解密的,从而大大提高了数据的安全性。钱包需要经常备份,防止钱包因系统损坏或硬件设备导致的丢失钱包的风险。

    对于钱包自身来说,支持设置钱包密码。在数据库使用或关闭钱包时需要先通过钱包密码验证,否则将不能使用钱包。创建加密对象时,钱包必须处于OPEN的状态;若钱包处于CLOSE的状态,则不能创建加密对象。修改钱包密码时,钱包必须处于CLOSE的状态。安全管理员可以通过SQL命令修改钱包密码。钱包的使用如下所示:

    打开钱包:

    OPENUP WALLET WITH PASSWORD “123456”;
    

    关闭钱包:

    CLOSEUP WALLET WITH PASSWORD “123456”;
    

    修改钱包密码(必须先关闭钱包):

    ALTER WALLET WITH PASSWORD “654321”;
    
    INSERT INTO TEST_ENC_NOKEY VALUES(GENERATE_SERIES(1, 10000), 'KINGBASE');
    
    CHECKPOINT;
    
    -- select table test data correctness
    
    SELECT COUNT(*) FROM TEST_ENC_NOKEY;
    
    SELECT * FROM TEST_ENC_NOKEY LIMIT 5;
    
    -- update table test
    
    UPDATE TEST_ENC_NOKEY SET NAME = 'kingbase' WHERE ID = 1;
    
    -- delete table test
    
    DELETE FROM TEST_ENC_NOKEY;
    
    SELECT COUNT(*) FROM TEST_ENC_NOKEY;
    
    -- drop table test
    
    DROP TABLE TEST_ENC_NOKEY;
    
    -- alter tablespace test
    
    ALTER TABLESPACE ENC_TS_NOKEY SET (seq_page_cost = 1.0);
    
    ALTER TABLESPACE ENC_TS_NOKEY SET (encryption = false);
    
    -- drop tablespace test
    
    DROP TABLESPACE ENC_TS_NOKEY;
    

    更新主密钥:

    UPDATE MASTER ENCKEY;
    

    9.1.3. 使用透明存储加密的优势

    透明存储加密可确保加密敏感数据满足合规性要求,并提供简化加密操作的功能,优势如下:

    • 作为安全管理员,您可以确保敏感数据已加密,因此在存储介质或数据文件被盗或入侵者试图从操作系统访问数据文件时,绕过访问控制数据库。

    • 使用透明存储加密可帮助您解决与安全相关的法规遵从性问题。

    • 您无需创建辅助表、触发器或视图来为授权用户或应用程序解密数据。表中的数据为数据库用户和应用程序透明地解密。处理敏感数据的应用程序可以使用透明存储加密提供强大的数据加密,而无需修改应用程序。

    • 对于访问该数据的数据库用户和应用程序,数据被透明地解密。数据库用户和应用程序不需要知道他们正在访问的数据是以加密形式存储的。

    • 透明存储加密可以在线进行,无需停止数据库服务。

    • 数据库系统自动维护密钥管理,用户或应用程序不需要管理加密密钥。

    9.1.4. 配置透明存储加密的权限

    拥有系统特权的用户可以进行透明存储加密。对表或表空间加密的用户需要有创建表或表空间的权限。

    9.1.5. 透明加密的类型和组成部分

    透明存储加密可以应用于不同对象,本节内容包括如下:

    9.1.5.1. 关于透明存储加密类型和组成部分

    加密对象目前包含表空间和表,对应的加密方式为表空间加密和表加密。注意的是每种加密方式是互斥的,同一加密对象不允许同时支持多种加密方式。

    您可以在表级别或表空间级别加密敏感数据。表加密对选定的表加密数据。表空间加密使您能够加密表空间中存储的所有数据。 表加密和表空间加密都使用基于密钥管理的体系结构。未经授权的用户无法从存储和备份文件中读取数据,除非他们拥有密钥来解密数据。

    9.1.5.2. 加密插件

    使用透明加密数据功能时需要在 kingbase.conf 文件中的guc参数 shared_preload_libraries 中加载 sysencrypt 插件。开启加密插件步骤如下所示:

    1. 修改 kingbase.conf 文件中 shared_preload_libraries 参数。

      shared_preload_libraries = 'sysencrypt'
      
    2. 新建数据库需要安装扩展

      CREATE EXTENSION sysencrypt;
      

    9.1.5.3. 透明存储加密表空间加密的工作原理

    表空间加密方式目前采用的是页面级的块加密和块解密。对于块加密,分组加密算法需要的待加密数据的长度应为算法数据对齐长度的整数倍,对于流加密算法的待加密数据的长度并没有对齐的要求。块加密是在数据页面需要同步到外存时进行加密操作;从外存读取数据页面到缓冲区时,首先进行解密操作。内存中的数据都是解密后的数据。

    示例创建加密表空间,确保打开钱包
    
    CREATE TABLESPACE ENC_TS_NOKEY LOCATION '@TESTTABLESPACE@' WITH (ENCRYPTION = TRUE);  --@TESTTABLESPACE@为空间的物理路径
    
    示例在加密表空间下创建加密表
    
    CREATE TABLE TEST(ID INT) TABLESPACE ENC_TS_NOKEY;
    

    9.1.5.4. 密钥管理

    目前密钥采用三级密钥结构,分别为主密钥和对象密钥和块级密钥。 主密钥是唯一的,安全管理员是可以通过SQL命令更新主密钥的。主密钥的作用用于加密对象密钥,主密钥自身加密存储在主密钥文件中。 每个加密对象都有一个对象密钥,对象密钥之间是不重复的。块级密钥是根据对象密钥和块标识生成的,加密时使用的密钥就是块级密钥。对象密钥暂时不可更改并且由数据库系统维护。对象密钥是由主密钥加密后根据对象类型不同存储在不同的密钥文件中,密钥文件分为:表空间密钥文件,表密钥文件,用户密钥文件等。

    9.1.5.5. 支持的加密算法

    加密框架目前支持内置SM4和RC4算法对数据进行加密。在加密框架下也可以支持用户自定义扩展的加密算法,首先根据数据库提供的API函数编译封装好用户自己的设备库,然后把设备库和设备库所调用的算法库一同放到数据库的LIB目录下。初始化时指定自己的加密方式,包括指定设备库名称,算法库名称,密钥最大长度以及算法对齐长度。对于算法对齐长度,分组加密算法对齐长度是不为0的偶数。对于流加密算法,算法对齐长度指定为0。

    API函数主要包括五大类函数:设备管理类函数,密钥管理类函数,加解密算法类函数,数据管理类函数,错误处理类函数。设备管理类函数负责对加密设备的管理,打开加密设备、关闭加密设备等。密钥管理类函数负责密钥管理,包括生成密钥,加载密钥,销毁密钥等。加解密算法类函数负责对数据的加解密。数据管理类函数负责加密前对数据的处理操作。错误处理类函数负责对加解密运行中的错误处理。 初始化完成后,就可以使用自己指定的加密算法来使用透明加密的功能。

    9.1.5.5.1. 加密引擎适配

    金仓除了内置了加密库对数据库数据进行加解密,也提供了一些用于用户可以自适配一些加密卡接口,用户需要自己手动实现这个API接口,在编译时需要用到金仓提供的 sysengine.h 头文件。

    如果用户成功编译了正确的设备库,需要在 initdb 时通过 -e 参数指定用户自己的加密设备名,并填写相关正确的加密设备相关信息,即可使用用户自适配的加密设备对数据库数据进行加解密。

    用户需要把编译好的自适配设备库以及算法驱动库放到数据库的lib目录下,并在初始化时指定设备信息用于使用自适配的加密卡,如下:

    Device lib: 加密设备库名
    Driver lib: 算法驱动库名
    Maxkey Len: 密钥最大长度
    Algin Num: 算法对齐的最大长度(流算法为0)
    

    9.2. 表加密

    9.2.1. 关于表加密

    表加密功能采用加密算法保护数据库表的数据在磁盘上存储不被非法获取。加密的对象包括表文件、及表的索引、辅助文件。以数据库表为粒度指定是否加密。

    9.2.2. 表加密的使用

    9.2.2.1. 创建加密表

    需要在表的定义最后加上encrypted 关键字,可以用by 指定密钥或者使用随机密钥。如下所示:

    CREATE TABLE tablename table definition ENCRYPTED [BY encryptkey];
    

    参数说明

    table definition

    创建表时的其他设定,如列定义、继承、分区等。表加密功能支持继承表和分区表设置为加密表。

    ENCRYPTED

    ENCRYPTED必须为语句中最后一个设置项,设定新建表为加密表,生成随机密钥为加密密钥。当指定密钥时使用 ENCRYPTED BY encryptkey 语法。

    encryptkey

    指定表加密使用的密钥串,字符串最大有效长度16字节,超出长度会被截断。表及表的附属对象使用同一个密钥加密。

    例如,创建表时指定密钥或者使用默认密钥:

    create table tblname (id int, name varchar(16)) encrypted by 'table_encrypt_key';
    create table tblname (id int, name varchar(16)) encrypted;
    

    9.2.2.2. 访问、删除加密表

    加密表的访问方式(DQL、DML)和删除方式(DROP)不受表透明存储加密的影响。

    9.2.2.3. 变更加密状态

    ALTER语法支持变更数据库表的加密状态。变更时可能会重新生成存储文件,当表数据量较大时需要占用大量资源。

    变更为加密

    ALTER TABLE tablename ENCRYPTED;
    

    变更为非加密

    ALTER TABLE tablename NOT ENCRYPTED;
    

    例如,使用alter语法变更表为加密表或非加密表:

    alter talbe tablename encrypted;
    alter table tablename not encrypt;
    

    9.2.2.4. 表的加密状态

    在KingbaseES中,支持函数和视图的方式判断表是否为加密表。

    • sysencrypt.is_table_encrypted函数

    使用sysencrypt.is_table_encrypted 函数来查询表是否加密,加密表返回 t 非加密表返回 f。函数的参数为表名字符串,支持 schema.tablename 和 tablename 的方式,参数使用单引号包括。

    SELECT sysencrypt.is_table_encrypted('tablename')
    
    • sysencrypt.sys_table_encrypt视图

    使用sysencrypt.sys_table_encrypt系统视图显示数据库内的用户表加密状态。视图中的isencrypted字段显示表是否为加密表,加密表为 t 非加密表为 f 。

    SELECT * FROM sysencrypt.sys_table_encrypt;
    

    9.3. 表空间加密

    9.3.1. 关于表空间加密

    表空间加密使您能够加密表空间中存储的所有数据。表空间加密在读取和写入操作期间对数据进行加密或解密。

    9.3.2. 表空间加密的限制

    表空间是对整个表空间数据加密,所以不受表加密的相关限制,对数据类型、约束和索引都没有要求。

    9.3.3. 表空间加密的系统参数

    设置sysencrypt.encrypt_user_tablespace参数,可以指定是否默认对创建的用户表空间加密,默认为false。

    9.3.4. 表空间加密的使用

    9.3.4.1. 创建表空间加密

    需要在表空间的定义最后加上encrypted 关键字,可以用by 指定密钥或者使用随机密钥。如下所示:

    CREATE TABLESPACE tablesspacename LOCATION '@tablespace@'  with(encryption = true[, enckey = encryptkey]);
    

    参数说明

    encryption

    标识当前表空间是否为加密表空间,true为是,false为否。

    enckey

    用户自定义的表空间加密密钥,最大有效长度16字节,超出长度会被截断。默认不指定。

    例如,创建表空间时,用户不指定密钥:

    ---------------------------------------
    --      TEST ENC TSP WITH NO KEY
    ---------------------------------------
    
    -- create encryption tablespace
    OPENUP WALLET WITH PASSWORD "k1ngb2se";
    CREATE TABLESPACE ENC_TS_NOKEY LOCATION '@testtablespace@' with (encryption = true);
    
    -- create encryption table and build index
    CREATE TABLE TEST_ENC_NOKEY(ID INT, NAME VARCHAR(100)) TABLESPACE ENC_TS_NOKEY;
    CREATE INDEX INDEX_ENC ON TEST_ENC_NOKEY(ID);
    
    -- insert table data
    INSERT INTO TEST_ENC_NOKEY VALUES(GENERATE_SERIES(1, 10000), 'KINGBASE');
    CHECKPOINT;
    
    -- select table test data correctness
    SELECT COUNT(*) FROM TEST_ENC_NOKEY;
    SELECT * FROM TEST_ENC_NOKEY LIMIT 5;
    
    -- update table test
    UPDATE TEST_ENC_NOKEY SET NAME = 'kingbase' WHERE ID = 1;
    
    -- delete table test
    DELETE FROM TEST_ENC_NOKEY;
    SELECT COUNT(*) FROM TEST_ENC_NOKEY;
    
    -- drop table test
    DROP TABLE TEST_ENC_NOKEY;
    
    -- alter tablespace test
    ALTER TABLESPACE ENC_TS_NOKEY SET (seq_page_cost = 1.0);
    ALTER TABLESPACE ENC_TS_NOKEY SET (encryption = false);
    
    -- drop tablespace test
    DROP TABLESPACE ENC_TS_NOKEY;
    

    用户可以指定密钥,通过enckey option来指定加密表空间的密钥:

    ---------------------------------------
    --      TEST ENC TSP WITH KEY
    ---------------------------------------
    
    -- create encryption tablespace
    CREATE TABLESPACE ENC_TS_KEY LOCATION '@testtablespace@' with (encryption = true, enckey = '123456123456798123456798'); -- error
    CREATE TABLESPACE ENC_TS_KEY LOCATION '@testtablespace@' with (encryption = true, enckey = '123456'); -- error
    CREATE TABLESPACE ENC_TS_KEY LOCATION '@testtablespace@' with (encryption = true, enckey = 'qwertyui'); -- error
    CREATE TABLESPACE ENC_TS_KEY LOCATION '@testtablespace@' with (encryption = true, enckey = 'k1ngb2se');
    
    -- create encryption table and build index
    CREATE TABLE TEST_ENC_KEY(ID INT, NAME VARCHAR(100)) TABLESPACE ENC_TS_KEY;
    CREATE INDEX INDEX_ENC ON TEST_ENC_KEY(ID);
    
    -- insert table data
    INSERT INTO TEST_ENC_KEY VALUES(GENERATE_SERIES(1, 10000), 'KINGBASE');
    CHECKPOINT;
    
    -- select table test data correctness
    SELECT COUNT(*) FROM TEST_ENC_KEY;
    SELECT * FROM TEST_ENC_KEY LIMIT 5;
    
    -- update table test
    UPDATE TEST_ENC_KEY SET NAME = 'kingbase' WHERE ID = 1;
    
    -- delete table test
    DELETE FROM TEST_ENC_KEY;
    SELECT COUNT(*) FROM TEST_ENC_KEY;
    
    -- drop table test
    DROP TABLE TEST_ENC_KEY;
    
    -- alter tablespace test
    ALTER TABLESPACE ENC_TS_KEY SET (seq_page_cost = 1.0);
    ALTER TABLESPACE ENC_TS_KEY SET (encryption = false);
    

    9.3.4.2. 表空间密钥保护

    指定了用户密钥,但是sys_tablespace里面并不会显示出来,保护了用户密钥。

    select * from sys_tablespace;
    
    -- drop tablespace test
    
    DROP TABLESPACE ENC_TS_KEY;
    

    9.4. 透明存储加密与其他功能结合

    9.4.1. 逻辑备份还原加密

    数据库的备份文件通常是明文的或是二进制的形式存储,这样也是有数据泄露风险的,所以对备份文件加密也是维护数据库安全手段的一种。 备份文件时需要用户指定备份的密钥,该密钥不会存储到备份文件中,这样就确保了密钥的安全,没有密钥,即使文件被盗取也没有办法获取到备份出来的真实数据。与此同时,数据库服务器会对备份文件的完整性进行校验,如果备份文件被人恶意破坏,那么还原数据的时候是会先检查备份文件的完整性,完整性校验不通过则无法还原数据到数据库中,防止了恶意篡改数据的操作。

    通过数据库的备份工具可以实现对数据库的数据进行加密备份以及完整性校验。

    9.4.1.1. 加密备份

    通过sys_dump工具,指定-K参数设置密钥,即可对备份进行加密。 -F 指定备份格式,目前加密备份只支持c二进制格式。如下示例所示:

    --首先需要在TEST库下创建一张表
    create table test(id int);
    --创建一个待还原的数据库TEST1
    create database test1;
    
    --备份
    ./sys_dump -h 127.0.0.1 -p 8889 -U system -f enc.dmp -F c -K 123456 TEST
    
    
    --查看enc.dmp文件,里面是加密的,并且开头是保留了备份文件校验码
    
    --正常还原
    ./sys_restore -h 127.0.0.1 -p 8889 -U system -K 123456 -F c -d test1 enc.dmp
    
    --进入TEST1数据库查看数据表test成功被还原。
    

    9.4.1.2. 完整性校验

    如果对加密后的备份文件随意进行篡改,数据库将会识别错误,导致还原不成功。如下示例所示:

    --非正常还原
    cp enc.dmp enc_bak.dmp
    --然后修改enc_bak.dmp,使其原有内容发生变化
    ./sys_restore -h 127.0.0.1 -p 8889 -U system -K 123456 -F c -d test1 enc_bak.dmp
    报错:File SM3 HASH check failure 'enc_bak.dmp' failed.
    

    9.4.2. 主备集群的透明存储加密

    KingbaseES数据库集群支持透明存储加密。如果主库使用透明存储加密,相关信息会自动同步到备库中。主库如果修改加密密钥,集群会将密钥信息自动同步到备库中。主库开启钱包管理后,备机也会同步复制主库的钱包管理。

    主库数据同步到备库时,日志文件中的加密数据仍然保持加密状态。即加密数据在传输过程中也保持加密状态。

    9.4.3. 透明存储加密与接口的结合

    透明存储加密对KingbaseES程序接口调用的操作没有任何影响,对应用程序透明。除了传输安全部分,透明存储操作对应用接口透明。

    9.5. 使用透明存储加密的注意事项

    9.5.1. 使用透明存储加密的安全建议

    在数据库应用透明存储加密时,应遵循以下规则:

    • 确定数据库中数据的敏感度,所需要的保密和风险级别。不敏感的数据不需要进行加密操作。

    • 估算管理数据加密和密钥库的成本,以决定了密钥类型:基于数据的内置算法或者外置加密卡接口。

    • 为加密数据设置单独的安全管理员。

    • 备份加密数据库时选择加密备份。

    9.5.2. 管理数据文件的安全性

    及时删除一些加密前的文件,旧的文件可能存在明文数据。如果特权操作系统用户绕过数据库访问控制,可能直接获取数据信息。为避免这种项目,可以将加密的对象移动到新的表空间中,然后删除原来的表空间文件。

    9.5.3. 透明存储加密和数据关闭操作

    在关闭数据库前,应确保数据库开启加密状态。在数据库关闭操作期间,可能需要密钥文件。数据库关闭操作前会自动关闭密钥库管理。

  • 相关阅读:
    【网络安全培训】无线局域网的安全威胁都有哪些?
    数字角频率w、模拟角频率Ω
    亥姆霍兹线圈主要用途有哪些
    Docker安装 Mysql主从同步
    python---进程池与线程池
    在 JavaScript 中访问对象属性的 3 种方法
    信息收集——ip信息(DNS解析、CDN)
    Python撤销导入的模块
    ubuntu下mysql常用命令
    nodejs+vue面向中小学课堂教学辅助软件系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/126381420