深入理解tee-gp-proxy核心组件:gpproxy、gpworker与libteecc架构详解

深入理解tee-gp-proxy核心组件:gpproxy、gpworker与libteecc架构详解

【免费下载链接】tee-gp-proxyThis project aims to provide an implementation for RPC invoking TEE to facilitate the use of Kunpeng confidential computing in cloud scennarios.项目地址: https://gitcode.com/openeuler/tee-gp-proxy

前往项目官网免费下载:https://ar.openeuler.org/ar/

tee-gp-proxy是openEuler社区推出的面向鲲鹏机密计算场景的关键项目,旨在通过RPC调用可信执行环境(TEE),为云场景下的安全计算提供高效解决方案。本文将详细解析其三大核心组件——gpproxy、gpworker与libteecc的架构设计与协同工作机制,帮助开发者快速掌握项目精髓。

核心组件架构概览

tee-gp-proxy采用分层架构设计,三大组件各司其职又紧密协作,共同构建起从用户态到TEE的安全通信桥梁。整体架构如下:

图1:tee-gp-proxy核心组件架构示意图,展示了gpproxy、gpworker与libteecc在TrustZone资源池中的位置与交互关系

从架构图可见,紫色模块为本项目实现的核心部件,其中:

  • libteecc位于计算平台的用户CA层,提供TEE客户端API接口
  • gpproxy作为gRPC服务器运行在TrustZone资源池,处理API请求与JWT认证
  • gpworker通过DBus与gpproxy通信,负责实际的TEE命令执行

gpproxy:TEE通信的中枢神经

gpproxy作为整个系统的通信中枢,负责接收客户端请求、管理会话生命周期并协调gpworker执行任务。其核心实现位于cc-resource-pooling/teeproxy/gpproxy/目录。

核心数据结构

gpproxy通过两个关键数据结构管理会话与工作进程:

// 会话节点结构定义 typedef struct sessionid_node { uint32_t session_id; // 会话唯一标识 struct timeval session_createtime; // 会话创建时间 struct sessionid_node *next; // 链表指针 struct sessionid_node *prev; } sin_t; // 工作进程记录结构 typedef struct worker_rec { uint8_t busy; // 工作状态标记 int32_t context_fd; // 上下文文件描述符 uint64_t context_addr; // 上下文内存地址 struct timeval context_createtime; // 上下文创建时间 int sessionid_count; // 关联会话数量 sin_t *first; // 会话链表头 sin_t *last; // 会话链表尾 } wr_t;

这些结构定义在gpproxy.h中,通过双向链表高效管理多个并发会话,实现资源的动态分配与回收。

主要功能

  1. gRPC服务器实现:监听客户端请求,提供GP API接口
  2. JWT认证集成:通过JWT SVID验证客户端身份
  3. 会话管理:创建、跟踪和销毁TEE会话
  4. 任务调度:将请求分发到合适的gpworker进程处理

gpworker:TEE命令的实际执行者

gpworker作为后台工作进程,负责与TEE内核交互执行具体命令。其源代码位于cc-resource-pooling/teeproxy/gpworker/目录,核心实现为gpworker.c。

工作流程

gpworker的主函数实现了典型的服务端架构:

int main(int argc, char *argv[]) { threadpool_t pool; // 线程池 pthread_mutex_t mutex_tcl; // 线程安全锁 pthread_mutex_t mutex_tsl; tcl_t tcl; // 任务控制列表 tsl_t tsl; // 任务状态列表 // 参数检查 if (argc < 2) { printf("There is no argument as a worker name. \n"); return -1; } // 启动方法调用接收循环 receive_methodcall( &pool, &mutex_tcl, &mutex_tsl, &tcl, &tsl, argv[1] // 工作进程名称 ); return 0; }

核心特性

  1. 线程池管理:通过threadpool.c实现并发任务处理
  2. DBus通信:通过tzcp_dbus.c与gpproxy通信
  3. TEE客户端API调用:使用tee_client_api.h接口与TEE交互
  4. 任务队列:通过tcl_t和tsl_t结构管理任务生命周期

libteecc:TEE客户端开发库

libteecc提供了完整的TEE客户端API,位于cc-resource-pooling/teeproxy/libteecc/目录,是用户态应用与TEE通信的标准接口。

核心数据结构与接口

libteecc定义了多个结构体用于封装TEE操作的输入输出参数,例如:

// 初始化上下文返回结构 struct retstru_teec_inicont { uint32_t teecresult; // TEE操作结果码 int32_t context_fd; // 上下文文件描述符 uint8_t *context_tapath; // TA路径 uintptr_t context_tapath_outsize; // TA路径长度 // ... 省略其他字段 }; // 打开会话函数原型 struct retstru_teec_opensession externc_teec_opensession( int32_t in_context_fd, uint8_t *in_context_tapath, int32_t in_context_tapath_size, // ... 省略其他参数 );

完整定义见teecc.h,包含了从上下文初始化、会话管理到命令调用的全流程接口。

主要功能

  1. 上下文管理:通过externc_teec_initializecontextexternc_teec_finalizecontext管理TEE上下文
  2. 会话操作:提供会话创建(externc_teec_opensession)和关闭(externc_teec_closesession)功能
  3. 命令调用:通过externc_teec_invokecommand执行TEE命令
  4. 内存管理:提供共享内存和缓冲区管理接口

组件协同工作流程

三大组件通过标准化接口协同工作,实现从用户应用到TEE的安全通信:

  1. 初始化阶段

    • 用户应用通过libteecc的externc_teec_initializecontext创建TEE上下文
    • libteecc通过gRPC客户端连接到gpproxy服务
  2. 会话建立阶段

    • 调用externc_teec_opensession发起会话请求
    • gpproxy验证JWT令牌,创建新会话并分配gpworker处理
  3. 命令执行阶段

    • 用户应用调用externc_teec_invokecommand发送命令
    • gpproxy将请求转发给gpworker
    • gpworker通过TEE Client API与TEE内核交互
    • 结果通过原路返回给用户应用
  4. 资源释放阶段

    • 调用externc_teec_closesession关闭会话
    • gpproxy回收会话资源,更新worker状态

跨平台架构设计

tee-gp-proxy采用模块化设计,支持多种部署场景。下图展示了在鲲鹏服务器上的虚拟化环境部署架构:

图2:tee-gp-proxy在鲲鹏服务器上的虚拟化部署架构,展示了跨VM的TEE资源共享机制

该架构支持:

  • 多租户(VM)共享TEE资源
  • 通过virtSerial和vTZDproxy实现跨VM通信
  • 内核态驱动与用户态服务协同工作

快速上手与资源获取

要开始使用tee-gp-proxy项目,可通过以下步骤获取源码:

git clone https://gitcode.com/openeuler/tee-gp-proxy

项目核心组件代码路径:

  • gpproxy:cc-resource-pooling/teeproxy/gpproxy/
  • gpworker:cc-resource-pooling/teeproxy/gpworker/
  • libteecc:cc-resource-pooling/teeproxy/libteecc/

详细部署指南请参考项目文档:cc-resource-pooling/docs/deployment/deployment.docx

总结

tee-gp-proxy通过gpproxy、gpworker和libteecc三大核心组件,构建了一个高效、安全的TEE RPC调用框架。其分层架构设计既保证了安全性,又提供了良好的可扩展性,特别适合云环境下的机密计算场景。开发者可以通过libteecc快速集成TEE功能,而gpproxy和gpworker则处理了复杂的会话管理和任务调度,大大降低了TEE应用开发门槛。

随着鲲鹏机密计算技术的不断发展,tee-gp-proxy将持续优化,为用户提供更强大、更易用的TEE访问能力。无论是企业级应用还是开源项目,都可以通过该框架轻松获得硬件级的安全计算保障。

【免费下载链接】tee-gp-proxyThis project aims to provide an implementation for RPC invoking TEE to facilitate the use of Kunpeng confidential computing in cloud scennarios.项目地址: https://gitcode.com/openeuler/tee-gp-proxy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考