书生数据智慧仓黄皮书
-
- 计算节点列表
- 字段:序号,名称,类型、部署位置,状态,TEE数量,资源配置,资源使用率
- 序号、部署位置同抗勒索网关
- 类型为SGX、TrustZone之一
- 状态暂定“在线、离线”,并可能有警告图标和错误图标
- TEE数量指该节点上创建了多少TEE,该数字点进去可以显示该节点上的TEE列表,即TEE列表并以该计算节点筛选
- 资源配置包括CPU核、内存和本地存储空间,资源使用率包括CPU使用率、内存使用率、本地存储使用率,定期刷新,刷新间隔可配置,缺省为1分钟
- 三个点的更多菜单下,包括创建TEE、TEE管理、刷新状态、断开,其中在创建TEE时需要输入CPU核、内存、堆(Heap)大小、堆栈(Stack)大小,TEE管理相当于点击TEE数量,进入以该计算节点筛选的TEE列表
- 新增计算节点
- 字段:序号,名称,类型、部署位置,状态,TEE数量,资源配置,资源使用率
- TEE列表
- 字段:序号,名称,类型,所在节点,状态,运行中核心程序数量,资源配置,资源使用率
- 类型同上
- 所在节点为该TEE所在计算节点的名称
- 状态暂定“空闲、使用中”,并可能有警告图标和错误图标
- 点击运行中核心程序数量,浮窗显示核心程序名称列表和运行时间
- 资源配置显示CPU核数和内存大小即可,资源使用率也是CPU使用率和内存使用率
- 三个点的更多菜单下,包括公钥、强制中断、重启、销毁,公钥从KMS取,仅展示
- 有创建TEE按钮,与结算节点列表中创建是相似的,只是增加一个计算节点选择(可以共用一个页面,只是从计算节点创建时该选项已经预设好了)
- 有筛选功能,包括按计算节点、状态筛选
- 字段:序号,名称,类型,所在节点,状态,运行中核心程序数量,资源配置,资源使用率
- 用户管理
- 计算节点列表
用户注册、登录、登出、删除、角色分配等常规功能,注意是支持多机构的
- 角色管理
缺省有超级管理员、机构管理员(如果不好实现也可以一个管理员管所有机构)、代码审核、代码提交等角色
- 公司管理
机构管理员管理和维护所在机构的组织结构信息
- 菜单权限管理
不同类型的用户有不同的权限和操作菜单
-
通知管理:设置消息通知对象,方式
-
告警管理:设置告警等级,对象
-
内容数据字典:配置元数据,包括gitlab地址
-
数据管理
- 数据格式列表
- 字段:序号、名称,类型、说明、备注、使用该格式核心程序数量、创建者、更多
- 类型暂定SQL数据库、文件、其它等3个
- 说明包括简要说明和详细说明,列表中列出简要说明,最后跟一个下划线的“详细”,点击后弹出浮窗显示详细说明
- 有“新增数据格式”按钮
- 更多菜单下有创建时间、删除
- 所有人都可以查看全部列表并新增格式,只有总管理员才能删除(如果精确判断的话,如果该格式只有一个机构的核心程序使用,则该机构的管理员可以删除)
- 注:数据格式在使用时还需要附加json描述的参数,包括数据存放的位置(例如目录、数据库和表名、IP地址),也可能包括其它参数(例如一个做加法统计的核心程序可以支持对任意指定字段名都做统计,甚至可以支持多种字段类型,这时该数据的数据格式参数就包含字段名和字段类型)。在详细说明中需要列出json格式作为参数说明
- 字段:序号、名称,类型、说明、备注、使用该格式核心程序数量、创建者、更多
- 数据目录
- 字段:编号、类别,名称,说明、数量、数据格式,更多
- 类别为明文或密文
- 数据格式为数据格式列表中的名称
- 数量旁有刷新图标,点击则重新计算该数据数量
- 更多栏为三点菜单,点开有数据格式参数,设置计算数量规则、编辑、删除,其中数据格式参数为json字符串,计算数量规则有指定数据库的指定表的记录数,以及指定路径下某后缀文件数(可选是否包含子目录)两种方式
- 有增加数据条目按钮,最好有批量导入功能
- 数据从数据源加密后存储到机密计算平台,后台定期调用计算数量规则计算各数据的数量
- 字段:编号、类别,名称,说明、数量、数据格式,更多
- 无人机列表
- 字段:序号,厂商,型号,序列号,卡号,位置数据格式,位置数据格式参数,姿态数据格式,姿态数据格式参数,备注,其中厂商、型号、序列号都是指无人机,卡号是绑定的5G卡手机卡
- 总管理员可手工增加、删除、编辑修改,可批量导入
- 数据源通道列表
- 每个数据源通道是一个数据库加密网关,在接收一个或多个无人机发过来的数据的入口服务器装上数据库加密网关,对数据加密后保存,用于之后到TEE中解密
- 字段:编号,部署位置,状态,数据总量,24小时数据量,实时数据量(分钟)、操作,备注
- 状态指在线、离线、禁用,启用时分为在线和离线
- 数据总量是历史上写的数据记录数,24小时数据量是最近24小时写的数据记录数,实时数据量是最近1分钟写的数据记录数
- 操作包括设置加密字段、高级,高级包括启用/禁用、删除。设置加密字段时,列出所有数据库、所有表、所有字段,但无需列出初始授权给谁(因为固定授权给TEE)
- 有新增数据源通道按钮,也可以有常规查询操作
- 数据格式列表
-
核心程序管理
- 提交核心程序
- 核心程序名称,版本号,类型,Gitlab项目和分支,启动命令,一个或多个设计文档(Gitlab上的地址),提交说明(文本框)、源数据格式、目标数据格式、运行要求CPU和内存资源
- 类型为数据转换算法、数据清洗算法、常规计算之一
- 数据转换算法类别和常规计算类别需要源数据格式和目标数据格式,数据清洗算法只需要有源数据格式
- 最好允许一个核心程序支持多个源数据格式和多个目标数据格式
- 后台数据库的提交记录包括 每一个源码文件、每一个设计文档和提交说明的hash值(最好还有签名值),也包括类型、数据格式
- 备注:约定数据转换算法类别的核心程序的启动参数有源数据格式、源数据参数、目标数据格式、目标数据参数、转换后是否删除,如果有原始数据参数则转换后移动到原始数据(保持数据格式不变);数据清洗算法的启动参数包括源数据格式、源数据参数、目标数数据参数、清洗后是否删除,如果有原始数据参数则清洗后移动到原始数据(保持数据格式不变);常规计算类别的核心程序的启动参数包括源数据格式、源数据参数、明文结果数据格式和明文结果参数
- 核心程序名称,版本号,类型,Gitlab项目和分支,启动命令,一个或多个设计文档(Gitlab上的地址),提交说明(文本框)、源数据格式、目标数据格式、运行要求CPU和内存资源
- 审核核心程序
- 代码审核者方有审核权限
- 审核时列出所有待审核的核心程序列表
- 可查看每一个源码文件和每一个设计文档
- 可以退回,退回时有说明(文本框)
- 审核通过后
- 调用编译服务器进行自动化编译
- 对源代码、编译后目标代码、设计文档、提交说明等进行签名,可以采用对整个目录进行签名的方式(最好是用ukey来签名)
- 后台数据库增加核心程序记录及其签名
- 核心程序列表
- 字段:序号,名称,版本号,类别,源数据格式,目标数据格式,开发者,运行资源要求、说明
- 开发者即提交者所在机构
- 更多里有更多信息、下架、重新上架。其中更多信息包括提交时间、提交者、批准时间、审核者。只有总管理员和机构管理员可以看到更多菜单,其中机构管理员只能看到本机构的核心程序的更多菜单
- 只列审核通过的核心程序
- 字段:序号,名称,版本号,类别,源数据格式,目标数据格式,开发者,运行资源要求、说明
- 加载核心程序
- 核心程序下拉框、源数据下拉框、明文结果下拉框 ,可选择自动匹配TEE,也可人工指定
- 核心程序仅列常规算法类别的核心程序的名称和版本号
- 源数据仅列当前选择的核心程序所支持的源数据格式的密文数据
- 明文结果仅列当前选择的核心程序所支持的目标数据格式的明文数据
- 自动匹配TEE时,选择空闲资源与该核心程序资源要求最接近的TEE执行
- 人工指定TEE时提供计算节点下拉框、TEE下拉框
- 在指定(自动匹配或人工指定)计算多节点的指定TEE执行指定核心程序,加载参数为源数据的数据格式和参数、明文结果的数据格式和参数
- 加载后,从TEE列表中其运行的TEE行可以查到该核心程序名称,直到其运行结束
- 核心程序下拉框、源数据下拉框、明文结果下拉框 ,可选择自动匹配TEE,也可人工指定
- 数据转换(正则化)
- “源数据”下拉框,“转换/正则化算法”下拉框,“目标数据”下拉框,自动匹配TEE或人工指定,可选将转换后的源数据删除或移动到“原始数据”
- 源数据列出所有密文数据的名称
- 转换/正则化算法列出类别为数据转换且其源数据格式与当前选择的源数据的数据格式相同的所有核心程序的名称
- 目标数据列出数据格式是当前选择的核心程序所支持的目标数据格式的所有密文数据的名称
- 如果选择将转换后的源数据移动到原始数据,原始数据下拉框列出与源数据的数据格式相同的所有密文数据
- 在指定(自动匹配或人工指定)计算多节点的指定TEE执行指定核心程序,加载参数为源数据的数据格式和参数、目标数据的数据格式和参数、是否删除源数据、是否将源数据移动到原始数据
- 加载后,从TEE列表中其运行的TEE行可以查到该核心程序名称,直到其运行结束
- “源数据”下拉框,“转换/正则化算法”下拉框,“目标数据”下拉框,自动匹配TEE或人工指定,可选将转换后的源数据删除或移动到“原始数据”
- 数据清洗
- “源数据”下拉框,“清洗 算法”下拉框,“目标数据”下拉框,自动匹配TEE或人工指定,可选将清洗后的源数据删除或移动到“原始数据”
- 源数据列出所有密文数据的名称
- 清洗算法列出类别为数据清洗算法且其源数据格式与当前选择的源数据的数据格式相同的所有核心程序的名称
- 目标数据列出数据格式与源数据格式相同的所有密文数据的名称
- 如果选择将清洗后的源数据移动到原始数据,原始数据下拉框列出与源数据的数据格式相同的所有密文数据
- 在指定(自动匹配或人工指定)计算多节点的指定TEE执行指定核心程序,加载参数为源数据的数据格式和参数、目标数据参数、是否删除源数据、是否将源数据移动到原始数据
- 加载后,从TEE列表中其运行的TEE行可以查到该核心程序名称,直到其运行结束
- “源数据”下拉框,“清洗 算法”下拉框,“目标数据”下拉框,自动匹配TEE或人工指定,可选将清洗后的源数据删除或移动到“原始数据”
- 应用程序列表
- 字段:序号,名称,版本号,启动命令,运行要求CPU和内存资源、关联核心程序,明文格式、明文参数、目标结果格式、加载顺序、操作
- 启动命令为字符串
- 关联核心程序为常规计算类别的核心程序的名称和版本号
- 明文格式为关联核心程序所支持的数据格式之一,明文参数为json字符串,通常为应用程序的端口号
- 目标结果格式为可选的,如果应用程序输出数据的话选用
- 加载顺序有3个选项:先加载应用程序、先加载核心程序、同时加载
- 操作三点菜单,点开有加载运行、编辑、删除
- 点击加载运行时弹出页面,有源数据下拉框,可选目标结果下拉框,可选择自动匹配TEE,也可人工指定
- 源数据下拉框列出关联核心程序所支持的源数据格式的所有密文数据的名称
- 如果目标结果格式不为空 ,目标结果下拉框列出目标结果格式的所有明文数据的名称
- 自动匹配TEE时,还需要同时保证其所在计算节点有足够的资源可以运行应用程序
- 确认后,根据加载顺序分别加载应用程序和核心程序,加载应用程序就是在指定计算节点执行启动命令,加载关联核心程序是在指定TEE加载关联核心程序,启动参数有源数据的格式和参数、明文格式和参数
- 有新增按钮,最好还有查询
- 字段:序号,名称,版本号,启动命令,运行要求CPU和内存资源、关联核心程序,明文格式、明文参数、目标结果格式、加载顺序、操作
- 提交核心程序
-
TEE内可信计算平台
- 初始化(每个TEE环境执行一次)
- 分析判断运行环境是否被破坏
- 读取合法进程配置,配置须有书生密钥签名,用代码中书生公钥验签
- 读取TEE内进程列表,除了配置表里定义的进程外,不得有任何未知进程
- 查每个进程是从哪个验证已知进程加载时的文件,验证其hash值与配置表里的hash值相同
- 请社鹏研究TEE后补充修订
- 加载运行KMS客户端(先验证其hash值是否与配置文件中的hash值相同)
- 生成随机公私钥
- 调用KMS API,基于公钥创建UID,然后基于UID创建entity
- 加密存储公私钥、YID、yEntity(可利用TEE OS的加密存储机制,其实只有私钥是需要加密存储的)
- 分析判断运行环境是否被破坏
- 被加载运行
- 分析判断运行环境是否被破坏(同上)
- 加载运行KMS客户端(先验证其hash值是否与配置文件中的hash值相同)
- 读取加密存储的公私钥,用私钥登录KMS
- 读取代码验签用公钥,公钥须有书生密钥签名,用代码中书生公钥验签
- 加载数据库加密网关(SS-proxy)、文件加密网关(FUSE)(加载前先验证其hash值是否与配置文件中的hash值相同)
- 加载核心程序
- 验证被 加载执行的核心程序是否用代码验签密钥签名
- 通过验证后加载执行
- 终止指定进程
- 获取运行状态,包括但不限于YID、yEntity、进程列表、进程详情、CPU、内存、磁盘I/O、网络流量等
- 运行环境配置
- 实时运行状态
- 获取日志
- 密钥授权
- 向其它TEE中的可信计算平台请求获得指定数据库表的所有加密字段的密钥授权,不指定数据库表时为所有数据库表
- 接受到其它TEE的密钥授权请求时,验证该请求是否来自TEE环境,验证通过则将指定数据库表的所有加密字段的密钥授权给该TEE(即授权给该TEE的entity ID)
- 支持Intel SGX和ARM TrustZone
- 初始化(每个TEE环境执行一次)
-
计算节点代理
- 创建TEE环境
- 运行docker,docker中打包了TEE OS、可信计算平台,数据库加密网关,KMS客户端(可能还有FUSE加密和YTS3)等
- 获取TEE密钥在KMS中的entity ID,并记录在TEE表中
- 调用TEE内可信计算平台的密钥授权接口(提供授权方的IP和TEE ID,可选指定需要授权的数据库表),使新TEE获得数据密钥授权
- 获取计算节点运行状态,包括但不限于CPU、内存、磁盘I/O、网络流量等
- 获取日志
- 转发后台的指令给TEE内可信计算平台,并将结果返回给后台
- 为TEE内可信计算平台提供用TEE ID查询对应的entity ID的API
- 创建TEE环境
-
数据加密/解密流程
- 初始化加密字段
- 在任意一个TEE环境中运行数据库加密字段的初始化(即初始化各加密字段的密钥),各加密字段的初始owner是该TEE环境(即使用该TEE环境的entity ID)
- 后台后端将其它TEE的entity ID和数据源通道的entity ID发给该TEE,该TEE将数据 密钥授权给其它TEE和数据源通道
- 每创建一个TEE环境,新TEE向任何一个已有TEE请求密钥授权
- 每个数据源通道都有自己的entity,用采集到的设备特征值作为身份认证用
- 安装部署数据源通道时,采集设备特征值,创建UID,创建entity,保存UID编号和entity编号
- 加载数据源通道时,采集设备特征值,用设备特征值向本地KMS客户端登录UID,再用UID登录entity
- 根据业务场景需求决定如何给每个数据源通道的entity授权,标准版本是授予所有的密钥权限,与TEE里的entity一样
- 初始化加密字段
-
ARM TrustZone简易实现
- 可信计算平台以CA方式运行,计算节点代理也是CA,一个简易KMS TA,一个C语言的数据读写LIB给核心程序(即TA)用
- KMS TA
- 初始化用户密钥(CA接口,即CA通过invoke方式调用):
- 读设备特征值
- 设备特征值 XOR “Sursen TrustZone Key 2023.11.09”,然后计算SHA256,得到存储密钥
- 创建随机SM2公私钥作为用户密钥
- 用存储密钥SM4算法加密用户密钥,保存到本地一个的密钥文件
- 取用户公钥(CA接口):返回用户公钥,不核查调用者身份
- 接收加密的数据密钥(CA接口)
- 数据密钥以json格式传入,指定这是哪个库哪个表哪个字段的密钥,不同字段有不同的密钥,一次可以传入多个字段的密钥,密钥是以本TA的公钥加密的
- 以用户私钥SM2算法解密每一个数据密钥
- 以存储密钥加密每一个数据密钥,保存到本地的密钥文件
- 本TA加载时
- 读设备特征值
- 同样算法衍生出存储密钥
- 读本地密钥文件,用存储密钥解密,获得用户密钥以及数据密钥
- 取数据密钥(TA接口,通过IPC方式被调用)
- 返回所有数据密钥
- 格式与CA传入的json串相似,区别是数据密钥未加密,采用IPC的安全机制保护
- 只能提供给TA
- 初始化用户密钥(CA接口,即CA通过invoke方式调用):
- 数据读写LIB无需支持SQL,以函数调用方式提供加密数据的读写能力
- 加载密钥函数:以IPC方式向KMS TA索取数据密钥,从而获知哪些字段是加密的及其加密密钥
- 查询数据函数
- 从数据库读相应记录
- 遍历每个记录的每个字段,对于加密字段用相应数据密钥解密
- 将结果返回给调用者
- 核心程序只支持C语言,自动编译用C语言选项