PyTorch 1.11.0存在CVE-2022-45907漏洞,该漏洞因torch.jit.annotations.parse_type_line方法中不安全使用eval方法,存在可以执行任意代码风险。torch_npu已参考LINK进行修复。
网络加固
#!/bin/bash set -x # 要限制的端口号 port={端口号} # 清除旧规则 iptables -D INPUT -p tcp -j {规则名} iptables -F {规则名} iptables -X {规则名} # 创建新的规则链 iptables -t filter -N {规则名} # 在多机场景下设定白名单,允许其他节点访问主节点的侦听端口 # 在规则链中添加允许特定IP地址范围的规则 iptables -t filter -A {规则名} -i eno1 -p tcp --dport $port -s {允许外部访问的IP} -j ACCEPT # 屏蔽外部地址访问分布式训练端口 # 在PORT-LIMIT-RULE规则链中添加拒绝其他IP地址的规则 iptables -t filter -A {规则名} -i {要限制的网卡名} -p tcp --dport $port -j DROP # 将流量传递给规则链 iptables -I INPUT -p tcp -j {规则名}
#!/bin/bash set -x # 清除规则 iptables -D INPUT -p tcp -j {规则名} iptables -F {规则名} iptables -X {规则名}
防火墙规则设定和移除示例:
# ifconfig eth0 inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::230:64ee:ef1a:c1a/64 Scope:Link
#!/bin/bash set -x # 设定侦听的端口 port=29510 # 清除旧规则 iptables -D INPUT -p tcp -j PORT-LIMIT-RULE iptables -F PORT-LIMIT-RULE iptables -X PORT-LIMIT-RULE # 创建新的PORT-LIMIT-RULE规则链 iptables -t filter -N PORT-LIMIT-RULE # 在多机场景下设定白名单,允许192.168.1.2访问主节点 # 在PORT-LIMIT-RULE规则链中添加允许特定IP地址范围的规则 iptables -t filter -A PORT-LIMIT-RULE -i eno1 -p tcp --dport $port -s 192.168.1.2 -j ACCEPT # 屏蔽外部地址访问分布式训练端口 # 在PORT-LIMIT-RULE规则链中添加拒绝其他IP地址的规则 iptables -t filter -A PORT-LIMIT-RULE -i eth0 -p tcp --dport $port -j DROP # 将流量传递给PORT-LIMIT-RULE规则链 iptables -I INPUT -p tcp -j PORT-LIMIT-RULE
#!/bin/bash set -x # 清除规则 iptables -D INPUT -p tcp -j PORT-LIMIT-RULE iptables -F PORT-LIMIT-RULE iptables -X PORT-LIMIT-RULE
权限控制
文件权限参考
建议用户根据自身需要,参考表1 文件权限参考对各类文件进行加固。
类型 |
linux权限参考值 |
备注 |
---|---|---|
文件夹 / 目录 |
750 (rwxr-x---) |
对于共享目录可为755 |
数据集文件 |
640 (rw-r-----) |
对于共享数据集文件可为644 |
checkpoint文件 |
640 (rw-r-----) |
对于checkplint等生成文件可以设置为640 |
程序文件 |
440 (r--r-----) |
除非开发调试场景,正常运行时程序文件不应再次修改 |
可执行脚本 |
750 (rwxr-x---) |
针对可执行脚本设置750 |
PyTorch提供分布式训练能力,支持在单机和多机场景下进行训练,需要进行网络通信。其中PyTorch需要使用TCP进行通信,torch_npu使用CANN中HCCL在NPU设备间通信,通信端口见表3。用户需要注意并保障节点间通信网络安全,可以使用iptables等方式消减安全风险,可参考安全加固章节进行网络安全加固。
torch_npu支持源码编译安装,在编译时会下载依赖第三方库并执行构建shell脚本,在编译过程中会产生临时程序文件和编译目录。用户可根据需要自行对源代码目录内的文件进行权限管控避免安全风险。
在torch_npu的配置文件和脚本中存在表2:
类型 |
开源代码地址 |
文件名 |
公网IP地址/公网URL地址/域名/邮箱地址 |
用途说明 |
---|---|---|---|---|
自研 |
不涉及 |
ci\docker\X86\Dockerfile |
docker配置文件,用于配置pip源 |
|
自研 |
不涉及 |
ci\docker\X86\Dockerfile |
docker配置源,用于配置torch下载连接 |
|
自研 |
不涉及 |
ci\docker\ARM\Dockerfile |
docker配置文件,用于配置pip源 |
|
自研 |
不涉及 |
setup.cfg |
用于打包whl的url入参 |
|
自研 |
不涉及 |
setup.cfg |
用于打包whl的download_url入参 |
|
自研 |
不涉及 |
third_party\op-plugin\ci\build.sh |
编译脚本根据torch_npu仓库地址拉取代码进行编译 |
|
自研 |
不涉及 |
third_party\op-plugin\ci\exec_ut.sh |
UT脚本根据torch_npu仓库地址下拉取代码进行UT测试 |
|
开源引入 |
https://github.com/pytorch/pytorch/blob/main/test/nn/test_convolution.py https://github.com/pytorch/pytorch/blob/v2.1.0/test/test_mps.py https://github.com/pytorch/pytorch/blob/v2.1.0/test/test_serialization.py |
test\url.ini |
用于test脚本下载相关pt文件 |
|
开源引入 |
https://github.com/pytorch/pytorch/blob/v2.1.0/test/test_serialization.py |
test\url.ini |
用于test脚本下载相关pt文件 |
|
开源引入 |
https://github.com/pytorch/pytorch/blob/v2.1.0/test/test_serialization.py |
test\url.ini |
用于test脚本下载相关pt文件 |
|
开源引入 |
https://github.com/pytorch/pytorch/blob/v2.1.0/test/test_nn.py https://github.com/pytorch/pytorch/blob/v2.1.0/test/test_serialization.py |
test\url.ini |
用于test脚本下载相关pt文件 |
AscendPyTorch是PyTorch适配插件,支持用户使用PyTorch在昇腾设备上进行训练和推理。AscendPyTorch适配后支持用户使用PyTorch原生接口。除了原生PyTorch接口外,AscendPyTorch提供了部分自定义接口,包括自定义算子、亲和库和其他接口,支持PyTorch接口和自定义接口连接,具体可参考《PyTorch 模型迁移和训练指南》>API列表。
参考PyTorch社区公开接口规范,PyTorchAdapter提供了对外的自定义接口。如果一个函数看起来符合公开接口的标准且在文档中有展示,则该接口是公开接口。否则,使用该功能前可以在社区询问该功能是否确实是公开的或意外暴露的接口,因为这些未暴露接口将来可能会被修改或者删除。
AscendPyTorch使用monkey-patch方式实现PyTorch接口的适配,通过将torch_npu中的部分接口动态替换PyTorch中的接口实现对部分接口的支持。推荐用户使用《PyTorch 模型迁移和训练指南》>API列表中推荐的调用方式。
AscendPyTorch项目采用C++和Python联合开发,当前除Libtorch场景外正式接口只提供Python接口,在torch_npu的二进制包中动态库不直接提供服务,暴露的接口为内部使用,不建议用户使用。
通信矩阵具体可参考下表。
组件 |
PyTorch |
HCCL |
---|---|---|
源设备 |
运行torch_npu进程的服务器 |
运行torch_npu进程的服务器 |
源IP |
设备地址IP |
设备地址IP |
源端口 |
操作系统自动分配,分配范围由操作系统的自身配置决定 |
默认值为60000,取值范围[0,65520]。用户可以通过HCCL_IF_BASE_PORT环境变量指定Host网卡起始端口号,配置后系统默认占用以该端口起始的16个端口 |
目的设备 |
运行torch_npu进程的服务器 |
运行torch_npu进程的服务器 |
目的IP |
设备地址IP |
设备地址IP |
目的端口 (侦听) |
默认29500/29400,用户可以设定端口号 |
默认值为60000,取值范围[0,65520]。用户可以通过HCCL_IF_BASE_PORT环境变量指定Host网卡起始端口号,配置后系统默认占用以该端口起始的16个端口 |
协议 |
tcp |
tcp |
端口说明 |
|
默认值为60000,取值范围[0,65520]。用户可以通过HCCL_IF_BASE_PORT环境变量指定Host网卡起始端口号,配置后系统默认占用以该端口起始的16个端口 |
侦听端口是否可更改 |
是 |
是 |
认证方式 |
无认证方式 |
无认证方式 |
加密方式 |
无 |
无 |
所属平面 |
不涉及 |
不涉及 |
版本 |
所有版本 |
所有版本 |
特殊场景 |
无 |
无 |
备注 |
该通信过程由开源软件PyTorch控制,配置为PyTorch原生设置,可参考PyTorch文档。源端口由操作系统自动分配,分配范围由操作系统的配置决定,例如ubuntu:采用/proc/sys/net/ipv4/ipv4_local_port_range文件指定,可通过cat /proc/sys/net/ipv4/ipv4_local_port_range或sysctl net.ipv4.ip_local_port_range查看 |
该通信过程由CANN中HCCL组件控制,torch_npu不进行控制,端口范围可参考《环境变量参考》的“执行相关 > 集合通信与分布式训练 > 集合通信相关配置>HCCL_IF_BASE_PORT”和《集合通信接口参考》 |