UMDK安全机制详解:UB访问控制和内存访问控制的实现原理
【免费下载链接】umdkThe Unified Memory Development Kit(UMDK) is a set of distributed communication software stack with memory semantics as the core. It aims to design a new-generation network architecture through software-hardware collaboration, subvert the traditional communication form, and build a computing native network centered on memory semantic interconnection.项目地址: https://gitcode.com/openeuler/umdk
前往项目官网免费下载:https://ar.openeuler.org/ar/
在当今高性能计算和分布式系统中,数据安全是至关重要的考虑因素。openEuler UMDK(Unified Memory Development Kit)作为一套以内存语义为核心的分布式通信软件库,提供了一套完整的安全机制来保护通过UB(Unified Bus)协议栈互访的数据资产安全。本文将深入探讨UMDK中的UB访问控制和内存访问控制两大核心安全机制的实现原理和应用场景。
📊 UMDK安全机制概述
UMDK的安全目标在于保护通过UB协议栈互访的数据资产安全,包括但不限于:
- UBPU设备身份、固件和配套软件🔒
- 内存数据🗄️
- 总线传输数据🔄
- 安全功能涉及的密钥、访问凭据和配置参数等敏感数据🔑
UMDK安全机制通过多层次的访问控制策略,确保只有授权的实体能够访问特定的内存区域和通信资源。这种机制在分布式系统中尤为重要,特别是在多租户环境和虚拟化场景下。
🔐 UB访问控制机制
应用场景与基本原理
UB访问控制功能主要应用于两个核心场景:内存访问和Jetty访问。内存访问场景的访问控制功能实现依赖于UMMU(Unified Memory Management Unit)的权限控制表,UMMU权限控制表与地址翻译表独立,内存访问时权限校验与地址翻译分别处理,当两者均操作成功则允许内存访问,否则拒绝内存访问。
| 应用场景 | 是否引入TokenValue | 访问凭据标识 | 是否引入UMMU协助卡控 |
|---|---|---|---|
| 内存访问 | 可选 | TokenID | 是 |
| Jetty访问 | 可选 | TCID | 否 |
Token验证策略与安全级别
UMDK提供了四种不同的Token验证策略,对应不同的安全级别和性能开销:
| 值 | URMA定义 | 策略描述 | 安全级别 | 性能开销 |
|---|---|---|---|---|
| 0 | URMA_TOKEN_NONE | 只传输TokenID或TCID,不带TokenValue | 最低 | 最高 |
| 1 | URMA_TOKEN_PLAIN_TEXT | 传输TokenID或TCID和TokenValue明文 | 中等 | 中等 |
| 2 | URMA_TOKEN_SIGNED | 传输TokenID或TCID和TokenValue,并加密保护 | 高 | 较高 |
| 3 | URMA_TOKEN_ALL_ENCRYPTED | 传输TokenID或TCID和TokenValue,并加密保护,PLD也加密 | 最高 | 最高 |
权限分配流程详解
UB访问控制的权限分配流程遵循以下步骤:
TokenID分配:Home在注册segment时,需要应用指定TokenValue。软件栈可以使用两种方式分配返回TokenID:
- 调用
urma_register_seg配置让软件栈自动分配 - 先调用
urma_alloc_token_id分配TokenID,之后调用urma_register_seg时指定该TokenID
- 调用
Token验证策略配置:在注册segment时可以指定token的验证策略,通过
urma_seg_cfg_t.urma_reg_seg_flag_t.token_policy字段设置。Token信息分发:应用可以将Home的Token信息使用带外通道(例如TLS/IP通道)或者URMA提供的公知jetty通道分发给User。
User导入远端内存:User在import远端Home内存时,需要携带token_value+token_id信息。
Token安全传输机制
Token的安全传输涉及多个关键环节:
Token安全分发:Target和Initiator之间需要建立一个安全的通道,这可以通过身份证书、密码或者密钥管理系统(KMS)来实现。
Token查找和使用:
- Target侧通过报文中的TokenID来索引找到TokenValue
- Initiator侧有三种方式查找和使用Token:
- 分布式网络编程场景:通过TargetJetty或TargetSeg对象找到Token
- SVA/DSVA场景:根据虚拟地址(VA)查找Token,无需TargetSeg
- Device场景:将Token信息绑定在设备内部某个引擎或队列的Context中
Token的Initiator隔离策略:
- 以算代存:Target侧只存放原始TokenValue,分发时基于Initiator的EID等信息派生
- 以存代算:Target侧为每个Initiator存储不同的TokenValue
🛡️ 权限无效化流程
UB访问控制功能提供了两种粒度的访问权限无效化机制:
权限组粒度无效化
权限组粒度无效化由Home发起,Home侧UMMU相关软硬件具体执行,无效化Home侧UMMU中的TokenID和对应的TokenValue。此时,持有该TokenID和TokenValue的权限组内所有User访问权限均被无效化。
用户粒度无效化
用户粒度无效化是指无效化权限组内具体User的访问权限,同时保证最小化影响权限持续有效的User,由User发起。具体步骤包括:
- 多个User均申请获得Home的内存访问凭据
- Home更新TokenValue,向权限持续有效的User分发更新后的TokenValue
- Home仅接受基于更新后的TokenValue申请内存访问,从而实现无效化未收到更新后的TokenValue的User的内存访问权限
🧠 内存访问控制机制
内存权限配置
URMA北向接口内存权限配置与UB协议定义保持一致,采用以下定义:
#define URMA_ACCESS_LOCAL_ONLY (0x1 << 0) #define URMA_ACCESS_READ (0x1 << 1) #define URMA_ACCESS_WRITE (0x1 << 2) #define URMA_ACCESS_ATOMIC (0x1 << 3)权限规则详解
本地独占访问:当
URMA_ACCESS_LOCAL_ONLY置位1时,本地访问具有READ、WRITE、ATOMIC所有权限,但是外部访问被拒绝。外部访问权限:当
URMA_ACCESS_LOCAL_ONLY置位0时,除本地访问具备所有权限之外,外部访问权限配置由后面三个类型决定,按照用户配置的READ、WRITE、ATOMIC组合生效。权限依赖关系:
- Write需要Read权限
- Atomic需要Write+Read权限
实际应用示例
在src/urma/examples/urma_sample.c中,我们可以看到内存访问控制的实际应用:
urma_reg_seg_flag_t flag = { .bs.token_policy = URMA_TOKEN_NONE, .bs.cacheable = URMA_NON_CACHEABLE, .bs.access = URMA_ACCESS_READ | URMA_ACCESS_WRITE | URMA_ACCESS_ATOMIC, .bs.token_id_valid = 0, .bs.reserved = 0 };🔧 实现原理深度解析
UMMU权限控制表
UMMU权限控制表是实现内存访问控制的核心组件。它与地址翻译表独立工作,确保每次内存访问都需要通过权限校验。这种设计实现了权限与地址分离的安全模式,即使攻击者获取了内存地址信息,也无法绕过权限检查。
硬件加速支持
UMDK的安全机制充分利用了硬件加速能力:
- Token验证硬件加速:支持在硬件层面进行Token验证,减少软件开销
- 加密解密硬件加速:对于
URMA_TOKEN_SIGNED和URMA_TOKEN_ALL_ENCRYPTED策略,使用硬件加速进行加密解密操作 - 权限检查硬件加速:UMMU在硬件层面实现权限检查,确保高性能的同时不牺牲安全性
安全通道建立
在src/urma/lib/urma/core/urma_cmd.c中,我们可以看到安全通道建立的关键实现:
int urma_cmd_alloc_token_id(urma_context_t *ctx, urma_token_id_t *token_id, urma_cmd_udrv_priv_t *udata) { if (ctx == NULL || ctx->dev_fd < 0 || token_id == NULL) { URMA_LOG_ERR("Invalid parameter\n"); errno = EINVAL; return -1; } int ret; urma_cmd_alloc_token_id_t arg = {0}; urma_cmd_set_udrv_priv(&arg.udata, udata); ret = urma_ioctl_alloc_token_id(ctx->dev_fd, &arg); if (ret != 0) { URMA_LOG_ERR("ioctl failed in urma_cmd_alloc_token_id, ret=%d, errno=%d.\n", ret, errno); return ret; } token_id->token_id = arg.out.token_id; token_id->urma_ctx = ctx; token_id->handle = arg.out.handle; token_id->flag.value = 0; return 0; }🚀 性能与安全平衡
UMDK的安全机制设计充分考虑了性能与安全的平衡:
灵活的安全策略选择
用户可以根据实际安全需求选择不同的Token验证策略:
- 高性能场景:选择
URMA_TOKEN_NONE,仅使用TokenID进行验证 - 中等安全场景:选择
URMA_TOKEN_PLAIN_TEXT,传输明文TokenValue - 高安全场景:选择
URMA_TOKEN_SIGNED或URMA_TOKEN_ALL_ENCRYPTED,使用加密保护
细粒度的权限控制
通过TokenID和TokenValue的组合,UMDK实现了细粒度的权限控制:
- 基于应用的权限隔离:不同应用使用不同的TokenID
- 基于用户的权限隔离:同一应用内不同用户使用不同的TokenValue派生
- 动态权限更新:支持TokenValue的动态更新,实现权限的实时撤销
📈 实际部署建议
安全配置最佳实践
- 生产环境推荐:使用
URMA_TOKEN_SIGNED策略,在安全性和性能之间取得最佳平衡 - 敏感数据保护:对于包含敏感数据的内存区域,使用
URMA_TOKEN_ALL_ENCRYPTED策略 - 权限最小化原则:仅为必要的操作授予权限,避免过度授权
监控与审计
UMDK提供了完善的监控和审计能力:
- 访问日志记录:记录所有内存访问和Jetty访问的Token验证结果
- 异常检测:检测异常的访问模式和安全策略违规
- 审计追踪:支持完整的访问审计追踪,满足合规性要求
🎯 总结
UMDK的UB访问控制和内存访问控制机制为分布式内存通信提供了强大的安全保障。通过Token验证机制、UMMU权限控制表和灵活的安全策略配置,UMDK实现了多层次、细粒度的安全防护。这些机制不仅保护了数据资产的安全,还通过硬件加速和优化设计,在提供强大安全保护的同时保持了高性能。
无论是高性能计算、人工智能训练还是分布式数据库应用,UMDK的安全机制都能为您的应用提供可靠的安全保障。通过合理配置安全策略,您可以在安全性和性能之间找到最佳平衡点,构建既安全又高效的分布式系统。
【免费下载链接】umdkThe Unified Memory Development Kit(UMDK) is a set of distributed communication software stack with memory semantics as the core. It aims to design a new-generation network architecture through software-hardware collaboration, subvert the traditional communication form, and build a computing native network centered on memory semantic interconnection.项目地址: https://gitcode.com/openeuler/umdk
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考