CANN shmem 安全加固指南:TLS 通信加密、运行权限控制与安全声明解析
【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库,基于OpenSHMEM 标准协议,实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem
本指南面向在昇腾平台上部署与使用 CANN shmem(多机多卡内存通信库)的开发者与运维人员,系统梳理官方安全声明(SECURITY.md)中的全部安全加固要点:TCP Store 通信矩阵、基于 TLS 1.3 的加密配置接口、证书巡检环境变量、运行用户与文件权限管控、构建/运行安全声明及 ASLR 内存随机化建议。阅读完成后,你将能够为 shmem 集群配置端到端的安全通信链路,并按照最小权限原则搭建安全的运行环境。
安全加固总览:从通信到运行的全链路基线
安全声明给出的加固建议是基本加固项,并非放之四海而皆准的最终方案。文档明确要求:用户应根据自身业务重新审视整个系统的网络安全加固措施,并按照所在组织的安全策略进行配置,包括软件版本、口令复杂度要求、安全配置(协议、加密套件、密钥长度等)、权限配置与防火墙设置等,必要时可参考业界优秀加固方案和安全专家建议。
CANN shmem 的加固基线可以归纳为六个层面:
| 层面 | 核心措施 | 涉及章节 |
|---|---|---|
| 通信加密 | 开启 TLS 1.3,配置证书与私钥 | 通信矩阵 / TLS 配置接口 |
| 证书生命周期 | 通过环境变量控制巡检周期与过期预警 | 环境变量说明 |
| 运行账号 | 禁止 root 直登,避免管理员账号运行 shmem | 运行用户建议 |
| 文件权限 | umask 0027+,敏感文件按附录分级管控 | 文件权限控制 |
| 构建与运行 | 中间文件权限、资源匹配、异常定位 | 构建/运行安全声明 |
| 系统加固 | 开启 ASLR 内存地址随机化 | 内存地址随机化 |
通信矩阵:理解 TCP Store 的网络暴露面
在 shmem 的 bootstrap 阶段,多进程需要交换初始化信息(unique id、拓扑等)。从源码结构看,该通道由 config_store 组件实现,以 TCP 为传输协议,server 端负责侦听、client 端负责连接。官方通信矩阵如下:
| 组件 | tcp store |
|---|---|
| 源设备 | tcp client |
| 源IP | device IP |
| 源端口 | 操作系统自动分配,分配范围由操作系统的自身配置决定 |
| 目的设备 | tcp server |
| 目的IP | 设备地址IP |
| 目的端口(侦听) | 用户指定,端口号 1025~65535 |
| 协议 | TCP |
| 端口说明 | server 与 client TCP 协议消息接口 |
| 侦听端口是否可更改 | 是 |
| 认证方式 | 数字证书认证 |
| 加密方式 | TLS 1.3 |
| 所属平面 | 管理面 |
| 版本 | 所有版本 |
| 特殊场景 | 无 |
要点解读:
- 端口范围 1025~65535:侦听端口由用户显式指定且可更改,运维时应避开与现有业务冲突的端口,并配合防火墙仅放行可信网段的访问。
- 认证 + 加密双保险:默认的认证方式为数字证书认证,加密方式为 TLS 1.3。若未开启 TLS,则仅依赖 TCP 明文传输,存在被窃听与伪造的风险,这正是下文 TLS 配置接口存在的意义。
- 所属平面为管理面:TCP Store 属于管理面通道,与数据面 RDMA 通信隔离,加固策略应与管理面组件(如登录、配置下发)保持一致。
开启 TLS 1.3:使用 aclshmemx_set_conf_store_tls 配置证书
接口定义与实现原理
TLS 开关通过 host 侧接口aclshmemx_set_conf_store_tls控制,其声明位于 include/host/init/shmem_host_init.h#L266,同时提供了shmem_set_conf_store_tls别名宏:
ACLSHMEM_HOST_API int32_t aclshmemx_set_conf_store_tls(bool enable, const char* tls_info, const uint32_t tls_info_len);其实现位于 src/host/init/shmem_init.cpp#L1325-L1332:接口本身仅将enable、tls_info及其长度写入g_boot_handle全局引导句柄(tls_enable/tls_info/tls_info_len),真正的 TLS 装配发生在后续 bootstrap 初始化阶段。据 docs/principles/config_store_bootstrap.md 的说明,plugin_init会在调用init_config_store之前根据该句柄调用config_store_set_tls_info、config_store_bootstrap_set_tls_key写入StoreFactory;启用 TLS 后,listener 与 client 会按tlsOption.enableTls加载 OpenSSL 动态库并建立加密链路。因此,该接口必须在初始化(如shmem_init)之前调用。
配置示例(C 语言)
官方给出的使用示例如下,分为关闭与开启两种场景:
// 配置关闭tls: aclshmemx_set_conf_store_tls(false, nullptr, 0); // 配置打开tls: char *tls_info =" \ tlsCaPath: /etc/ssl/certs/; \ tlsCert: /etc/ssl/certs/server.crt; \ tlsPk: /etc/ssl/private/server.key; \ tlsPkPwd: /etc/ssl/private/key_pwd.txt; \ tlsCrlPath: /etc/ssl/crl/; \ tlsCrlFile: server_crl1.pem,server_crl2.pem;\ tlsCaFile: ca.pem1,ca.pem2; \ packagePath: /etc/lib" int32_t ret = aclshmemx_set_conf_store_tls(true, tls_info, strlen(tls_info));对tls_info各字段的说明如下:
| 字段 | 含义 | 建议取值示例 |
|---|---|---|
tlsCaPath | CA 证书存放目录 | /etc/ssl/certs/ |
tlsCert | 服务端证书文件路径 | /etc/ssl/certs/server.crt |
tlsPk | 服务端私钥文件路径 | /etc/ssl/private/server.key |
tlsPkPwd | 私钥密码文件路径 | /etc/ssl/private/key_pwd.txt |
tlsCrlPath | 证书吊销列表(CRL)目录 | /etc/ssl/crl/ |
tlsCrlFile | CRL 文件名(支持多个,逗号分隔) | server_crl1.pem,server_crl2.pem |
tlsCaFile | CA 文件(支持多个,逗号分隔) | ca.pem1,ca.pem2 |
packagePath | 加密/解密组件(如 OpenSSL 动态库)所在路径 | /etc/lib |
使用注意事项(官方原文要求):
- 建议用户开启 TLS 加密配置,保证通信安全;
- 系统启动后,建议删除本地密钥证书等敏感信息文件,防止密钥泄露;
- 调用该接口时,传入的文件路径不能包含英文分号、逗号、冒号(这些字符被用作字段与列表分隔符)。
私钥回调:aclshmemx_set_config_store_tls_key
若希望以编程方式提供私钥而非文件路径,可使用配套接口aclshmemx_set_config_store_tls_key(声明见 include/host/init/shmem_host_init.h#L245,实现见 src/host/init/shmem_init.cpp#L1340-L1351):
int32_t aclshmemx_set_config_store_tls_key( const char* tls_pk, const uint32_t tls_pk_len, const char* tls_pk_pw, const uint32_t tls_pk_pw_len, const aclshmem_decrypt_handler decrypt_handler);tls_pk/tls_pk_len:TLS 私钥内容及其长度;tls_pk_pw/tls_pk_pw_len:私钥密码内容及其长度;decrypt_handler:解密回调函数指针,用于对私钥等敏感内容执行自定义解密。
该接口同样通过g_boot_handle缓存(tls_pk/tls_pk_len/tls_pk_pw/tls_pk_pw_len/decrypt_handler),供 bootstrap 初始化阶段消费。
Python 侧等价接口
Python 扩展(docs/api/pythonAPI.md)同样暴露了这两个接口:
set_conf_store_tls(enable, tls_info) -> int:设置是否开启 TLS 加密并指定 TLS 配置信息,tls_info可为空字符串;set_conf_store_tls_key(tls_pk, tls_pk_pw, py_decrypt_func: Callable[[str], str]) -> int:设置 TLS 私钥与密码,并注册解密回调函数。
具体用法可参考仓库中的 Python 测试用例 examples/python_extension/test/tls_test.py。
证书生命周期管理:巡检周期与过期预警环境变量
TLS 依赖的证书会过期,若在集群运行期间证书失效将导致握手失败。shmem 提供了两个环境变量用于证书的周期性巡检与提前预警,其解析逻辑位于 src/host/bootstrap/config_store/acc_links/csrc/security/acc_tcp_ssl_helper.cpp#L562-L572:
| 环境变量 | 作用 |
|---|---|
ACCLINK_CHECK_PERIOD_HOURS | 配置证书检查周期(小时),超出安全范围时回退默认值并打印告警 |
ACCLINK_CERT_CHECK_AHEAD_DAYS | 配置证书过期预警时间(天),即提前多少天对即将过期的证书发出告警 |
源码中通过AccCommonUtil::GetEnvValue2Uint32读取变量值,并对超出安全范围的取值回退到默认常量(CHECK_PERIOD_HOURS、CERT_CHECK_AHEAD_DAYS)且打印告警日志。建议在启动脚本中为所有 rank 统一设置这两个变量,并纳入证书轮换的运维流程。
与安全相关的其他环境变量
安全声明同时列出了 shmem 常规运维所需的关键环境变量:
| 环境变量 | 说明 |
|---|---|
SHMEM_LOG_LEVEL | shmem 日志级别(对应源码中DEBUG/INFO/WARN/ERROR/FATAL五档,见 src/host/init/shmem_init.cpp#L1303-L1323) |
SHMEM_HOME_PATH | shmem 安装路径 |
VERSION | 编译 whl 包默认版本号 |
ASCEND_RT_VISIBLE_DEVICES | 指定哪些 Device 对当前进程可见,支持一次指定一个或多个 Device ID;通过该环境变量可实现不修改应用程序即可调整所用 Device |
SHMEM_CYCLE_PROF_PE | 设置需要进行 Profiling 采集的 PE,pe_id设置范围 [0,PEs-1];需要取消采集请unset SHMEM_CYCLE_PROF_PE |
其中SHMEM_LOG_LEVEL与排查安全告警(如 TLS 握手失败、证书过期)直接相关,出现异常时建议先调至DEBUG复现定位;ASCEND_RT_VISIBLE_DEVICES可用于在共享环境中隔离进程可见的硬件资源,降低误操作风险。
运行用户建议:最小权限运行 shmem
root 是 Linux 系统中的超级特权用户,具有所有 Linux 系统资源的访问权限。允许直接使用 root 账号登录系统会带来大量潜在安全风险。官方建议:
- 在
/etc/ssh/sshd_config中将PermitRootLogin参数设置为no,使 root 无法通过 SSH 登录,增强系统安全性; - 如需使用 root 权限进行管理操作,应通过普通用户登录后使用
su或sudo切换到 root,避免直接以 root 身份登录; - 出于安全性及权限最小化角度考虑,不建议使用 root 等管理员类型账户运行 shmem。
文件权限控制:umask 0027 与分级管控
系统级 umask 基线
建议在主机(包括宿主机)及容器中设置运行系统umask值为0027 及以上,以保障:
- 新增文件夹默认最高权限为750(rwxr-x---);
- 新增文件默认最高权限为640(rw-r-----)。
敏感文件管控
建议对个人隐私数据、商业资产、源文件和算子开发过程中保存的各类文件等敏感内容做好权限控制,涉及安装目录权限管控、输入公共数据文件权限管控时,参照附录 A「文件(夹)各场景权限管控推荐最大值」执行(见下文附录)。
构建与运行安全声明
构建安全
源码编译安装 shmem 时,编译过程会产生中间文件,建议编译完成后对中间文件做好权限控制,避免中间产物(可能包含路径、符号、临时数据)被未授权访问。构建入口与脚本可参考 scripts/install.sh 与 docs/compilation_build_guide.md。
运行安全
- 资源匹配:应结合运行环境资源状况编写算子调用脚本。若脚本与资源状况不匹配——例如生成输入数据或标杆计算结果使用空间超出内存容量限制、脚本在本地保存数据超过磁盘空间大小——可能引发错误并导致进程意外退出;
- 异常定位:算子在运行异常时会退出进程并打印报错信息,建议根据报错提示定位具体错误原因,包括设定算子同步执行、查看日志文件等方式;
- 框架版本匹配:通过 PyTorch 方式调用 shmem 时,可能因版本不匹配导致运行错误,应参照 PyTorch 官方安全声明核对版本兼容性。
内存地址随机化机制安全加固
ASLR(Address Space Layout Randomization)开启后能增强漏洞攻击防护能力。官方建议将/proc/sys/kernel/randomize_va_space的值设置为2以开启该功能:
# 查看当前配置 cat /proc/sys/kernel/randomize_va_space # 运行时开启(重启失效,需 root) echo 2 > /proc/sys/kernel/randomize_va_space如需持久化,可将配置写入系统 sysctl 配置(如/etc/sysctl.conf),并在集群所有节点上保持一致。
公网地址声明
本项目代码中涉及的公开资源地址声明如下(用途均为编译依赖或文档引用,无运行时外联):
| 类型 | 开源代码地址 | 文件名 | 公网IP地址/公网URL地址/域名/邮箱地址/压缩文件地址 | 用途说明 |
|---|---|---|---|---|
| 依赖 | 不涉及 | build.sh | gitcode.com/cann/catlass.git | 从 gitcode 下载 catlass 源码,编译依赖 |
| 依赖 | gitcode.com/gh_mirrors/do/doxygen | build.sh | gitcode.com/gh_mirrors/do/doxygen/releases/download/Release_1_9_6/doxygen-1.9.6.src.tar.gz | 从 gitcode 下载 doxygen-1.9.6 源码,编译依赖 |
| 依赖 | 不涉及 | build.sh | gitcode.com/GitHub_Trending/go/googletest | 从 gitcode 下载 googletest 源码,单元测试框架依赖 |
| 依赖 | 不涉及 | build.sh | gitcode.com/GitHub_Trending/js/json.git | 从 gitcode 下载 nlohmann json 源码,SOC_TYPE 为 Ascend950 时编译依赖 |
| 文档 | 不涉及 | shmemi_device_barrier.h | inf.ed.ac.uk 的 Barrier 论文地址 | 并行编程语言和系统 |
这些依赖仅存在于编译构建阶段,运行时可自行根据安全策略审计依赖清单。
漏洞机制说明
如发现安全漏洞,应通过官方社区的安全漏洞管理流程上报,具体口径以社区 security 文档为准。上报时建议附带受影响版本(见仓库根目录 VERSION 与 version.info)、复现步骤与影响评估,便于快速处置。
附录 A:文件(夹)各场景权限管控推荐最大值
以下权限矩阵是 shmem 安全声明给出的通用参考,安装、运行、维护各环节建议按此分级设权:
| 类型 | Linux 权限参考最大值 |
|---|---|
| 用户主目录 | 750(rwxr-x---) |
| 程序文件(含脚本文件、库文件等) | 550(r-xr-x---) |
| 程序文件目录 | 550(r-xr-x---) |
| 配置文件 | 640(rw-r-----) |
| 配置文件目录 | 750(rwxr-x---) |
| 日志文件(记录完毕或已归档) | 440(r--r-----) |
| 日志文件(正在记录) | 640(rw-r-----) |
| 日志文件目录 | 750(rwxr-x---) |
| Debug 文件 | 640(rw-r-----) |
| Debug 文件目录 | 750(rwxr-x---) |
| 临时文件目录 | 750(rwxr-x---) |
| 维护升级文件目录 | 770(rwxrwx---) |
| 业务数据文件 | 640(rw-r-----) |
| 业务数据文件目录 | 750(rwxr-x---) |
| 密钥组件、私钥、证书、密文文件目录 | 700(rwx------) |
| 密钥组件、私钥、证书、加密密文 | 600(rw-------) |
| 加解密接口、加解密脚本 | 500(r-x------) |
实践建议:TLS 相关的私钥与证书属于最高敏感级别(目录 700、文件 600),务必与普通业务数据隔离存放;日志与 Debug 文件在归档后应收紧为只读(440),防止被篡改用于掩盖攻击痕迹。
安全加固清单速查
将以上内容收敛为一份可落地的检查清单:
- 所有 rank 进程在
shmem_init前调用aclshmemx_set_conf_store_tls(true, tls_info, len)开启 TLS 1.3,并校验返回值ret == 0; tls_info中各文件路径不含英文分号、逗号、冒号,证书与私钥文件权限按附录设为 600、目录 700;- 集群启动完成后删除本地的密钥证书等敏感文件;
- 设置
ACCLINK_CHECK_PERIOD_HOURS与ACCLINK_CERT_CHECK_AHEAD_DAYS并纳入证书轮换流程; - 禁止 root 直接登录与运行 shmem,使用普通用户 + sudo 提权;
- 主机与容器统一设置 umask 0027,敏感目录/文件按附录 A 设权;
/proc/sys/kernel/randomize_va_space为 2,ASLR 已开启;- 运行脚本与内存、磁盘资源匹配,异常时结合
SHMEM_LOG_LEVEL=DEBUG与同步执行方式定位; - 编译完成后对中间文件做权限控制。
【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库,基于OpenSHMEM 标准协议,实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考