海量 透明加密 设计
1 透明加密 1.1 功能简述 关于透明加密的基本概念,请看需求文档。 用户使用透明加密的示例如下: CREATE TABLE t1 (c1 TEXT, c2 TEXT); CREATE ENCRYPTION KEY tde_key WITH (source=local, password='pass.123'); CREATE ENCRYPTION POLICY ep1 FRO t1 KEY tde_key; INSERT INTO t1 VALUES ('data1', 'data2'); INSERT INTO t1 VALUES ('data1', 'data2'); SELECT * FROM t1; 1.2 实现方案 1.2.1 整体架构 透明加密的核心目标,是通过数据加密方案,解决攻击者绕过数据库安全机制,直接从磁盘窃取数据的问题。 在加密数据后,需要确保不影响内核在数据上进行计算。因此,需要在存储层底层,对数据进行加密。另外,为确保存储底层能够识别哪些数据加密,哪些数据不加密,以及使用什么算法加密等,上层需传递加密信息。透明加密逻辑架构如下: 1.2.2 工作流程 为适配存储底层设计,同时兼顾加密性能,以Page为粒度进行加密,并且,在Page中,存储加密信息。 1.2.3 详细流程 一、启动进程 在启动进程阶段,故障恢复时,如果回放到属于加密表的xlog,涉及到解密Page,因此,需在故障恢复前加载密钥。 main # 1. 启动数据库进程(基于pg-16代码) PostmasterMain # 2. 启动postmaster进程 SelectConfigFiles # 3. 读取GUC文件 'tde_load_encryption_key' # 4. 读取密钥文件(后文介绍密钥如何生成) SysLogger_Start StartupDataBase # 5. 开始故障恢复 StartupProcessMain StartupXLOG ReadControlFile PerformWalRecovery for loop: ReadRecord # 6. 读取xlog ApplyWalRecord # 7. 重放xlog GetRmgr.rm_redo ... heap_xlog_insert XLogReadBufferForRedo XLogReadBufferForRedoExtended XLogReadBufferExtended ReadBufferWithoutRelcache ReadBuffer_common smgrread # 8. 读取数据文件 # 需解密,后文统一介绍 ServerLoop for loop: ConnCreate BackendStartup BackendRun PostgresMain # 9. 启动postgres进程 StartCheckpointer StartBackgroundWriter StartChildProcess AuxiliaryProcessMain BackgroundWriterMain # 10. 启动bgwriter进程 二、生成密钥 当前版本,所有表,使用同一个数据密钥。因此,暂时无需新增系统表,存储密钥对象。 ...