寻求 Python 代码管控方案

2021-01-22 15:33:53 +08:00
 scoutteemo

问题引入

公司需要对代码进行管控,以前的代码都是 C 写的,编译工作在远程的服务器上,用 RDP 远程连接到服务器上进行开发,编译后的固件传下来。
现在引入了 python 语言来做的自动化测试方案,需要运行在 本地的 Linux 系统 上,还要 开放 root 权限 。现在同样需要对 python 的代码进行管控。所以在思考有没有什么方式,可以指定 python 这个程序才可以访问到特定的文件和目录, 其他的进程无法访问
代码可以是一个整体的加密文件,运行时解密,但解密后的内容要保证不会被轻易取走。或者通过远程服务器实时下发内容运行。最好是能保留调试功能,可以逐行执行代码什么的。由于程序需要依赖硬件,所以代码只能在本地的 Linux 系统上运行才可以。

想到的可能方案

我们在 Windows 平台的软件有类似的设计,会生成一个虚拟的文件系统,具体方式我也不清楚,然后把实际运行的 exe 文件存放在其中,再运行。
这样的话就需要实现一个FUSE,并且要保证这个文件系统是只有指定的进程才可以访问到的。 可以修改cpython的代码,里面融合类似于encfs这样的 FUSE,读的接口只暴露给 cpython 这个程序。然后再加上网络验证,从服务器上获取代码,运行完之后整个销毁掉。
但是这样的方式工程量比较巨大,还是需要先考虑其他可行方式。

4094 次点击
所在节点    Python
51 条回复
scoutteemo
2021-01-23 10:08:35 +08:00
@kaneg 啊,好吧,看来在 Python 上做保密还是挺费劲的,要进行取舍才行了。
AoEiuV020
2021-01-23 12:30:45 +08:00
我就不明白搞这些保密真有啥用吗,再怎么保密也要允许 python 进程读取,那写个 python 脚本把所有代码打包带走不也拦不住?
scoutteemo
2021-01-23 14:00:06 +08:00
@AoEiuV020 我去,还真是,这是没考虑到的点
jr981008
2021-01-23 15:43:29 +08:00
直接上 docker 一个容器一个任务
DoctorCat
2021-01-23 19:24:58 +08:00
@kaneg 更正你关于 Py 是“解释型”语言的概念 。什么是解释型语言? - 李广胜的回答 - 知乎
https://www.zhihu.com/question/268303059/answer/336730398
DoctorCat
2021-01-23 19:28:06 +08:00
@neoblackcap 大改虚拟机这事儿,去年我干过,还是有一定复杂度的,就像做手术。兼容性完全没保证了,尤其是在优化了 co_code 和 exec 后,某些第三方库(改字节码操作的)崩溃。


@scoutteemo 需要访问本地硬件这事儿,可以物理隔离了。某些外包大厂给人做设备灌固件进去的适合就是在物理隔离的工作区域
sampeng
2021-01-24 00:13:21 +08:00
@scoutteemo 技术本身是无解的,如果我能写代码。你无论如何拦不住我,代码里我可以加任何逻辑,自己把自己打包传出去不要太简单。变异型的好那么一点点。

还一个办法,这是技术方案,没啥高级的,做职能分离。一个功能拆成 n 份。每一份只知道自己的工作。要有全部才能 work 。泄露了谁都没意义…
leir
2021-01-24 16:23:01 +08:00
@scoutteemo 这个需求靠单个点基本没用

我的理解是:
1. 需求来源:你现在至少有,产品代码-c,测试代码-python,本来是只想对 C 保密,但是由于 python 有访问 C 的权限,所以想对 python 也一起做“管控”
2. 应用场景:python 在测试环境中运行,并需要访问 PCI 设备

建议:
**狗头** 如果成本可接受
支持贵司嵌入式平台的 CI/CD 或者自建 CI/CD

**如果**这个成本都无法接受,那么考虑代码管控技术方案的意义可能不大,直接对人员进行管控就行了……
scoutteemo
2021-01-24 20:04:25 +08:00
@leir 需求理解得很透彻😂,自建 CI/CD 的成本应该还是可以接受的,如果能支持的话,是能有什么办法吗?

@sampeng 看来是没有完美解决方案了。放弃调试功能的话,倒是可以在服务器上把代码用 Cython 编译成 so,再在本地调用这样。拆分功能的话,现在初步阶段内容也不多,不好分。可能会选择放弃代码管控吧

@DoctorCat 物理隔离确实是很顶级的办法,估计我们目前是实现不了
scoutteemo
2021-01-24 20:07:17 +08:00
感谢各位的回复,这事看来不是很好办,等明天开会讨论一下,看到底要不要进行管控,方案具体怎么做。再次多谢大家的热心指导。
qinyusen
2021-01-25 10:16:51 +08:00
提 2 个个人见解:
1. 嵌入式部分 ci-cd 做好,然后自动化测试拿到的是 c 代码编译后的二进制,二进制里面自己做加密就行。
做好访问渠道的单项访问防护,也就是永远只有编译服务器->自动化测试服务器,由 C 代码服务器推送(或者某种 hook)启动,不要用自动化测试的服务器主动启动。
C 代码里做 mac 地址绑定,硬盘 UUID 绑定,时间失效(编译时间戳+2 小时自动化测试时间)等一系列乱七八糟的防御,保证这部分自动化测试的代码的生命周期和生存环境

2.安全领域里有 2 个点,第一个点是主动防御,类似于 1 。 第二个叫做入侵检测, 就是泄露了就泄露了,但是我能发现他被入侵和泄露了。
那么在加密的二进制里可以检查一个什么你们特有的 eeprom 或者 flash 或者什么东西,做一个校验,如果没有发现这玩意,检查网络发送 HTTP 请求,将当前 IP 和 mac 地址等信息发到你服务器上。前提是你们的嵌入式是比较强的那种,这部分 lib 比较大。也就是泄露了之后能发现它泄露了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/747430

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX