私有化部署了一套公司的系统,如何有效保护容器里面的文件不被客户拿到

14 天前
 eephee

目前我们的业务系统中有一个 java 后端服务,该服务的 docker 镜像中除了包含构建好的 jar 包外,还包含了一个二进制可执行文件和一些动态库,运行时 java 会开子进程调用这个二进制文件去做一些事情。由于这个二进制文件依赖的复杂性,我不太好 FROM scratch 去构建镜像,因此目前我是基于 debian 去构建的镜像。

私有化部署时,我们会在客户提供的机器上面部署一个 k3s 集群来跑这套系统。

领导说要防止客户进入容器拿到里面的二进制可执行文件和动态库,我目前是在构建镜像时将 bash|sh|dash 悄悄移动到其他目录下(方便我们自己调试),但是我知道这个做法其实是掩耳盗铃,因为只要别人拷贝一个 shell 文件进去就可以破解。

想问一下关于这块目前有没有人有相对成熟的方案呢

1886 次点击
所在节点    Docker
20 条回复
xkx
14 天前
启动后把这个可执行文件删除,如何?
不过如果客户能拿到镜像本身的话,好像怎么也防不住了。。

或者是这个二进制文件搞成启动时才下载的,而下载的地方搞点手脚不让随便下(比如识别服务器指纹)
NewYear
14 天前
远程加载,永远只存在内存。
BeautifulSoap
14 天前
典型的给程序加壳的应用场景,拿到了二进制也要脱壳解密。如果可以联网的话,和上面说的动态下也是可以的,比如动态下载经过加密的二进制到内存,然后内存中解密直接执行
eephee
14 天前
@xkx
@NewYear 谢谢建议,但是这种做法在客户内网没法访问公网的情况下就没办法了
eephee
14 天前
@BeautifulSoap 调用时解密吗,好像确实可以,只要 jar 包里面的私钥不被破解好像就行得通是吗
JoeJoeJoe
14 天前
镜像你都提供了,只要想拿总会是能拿到的.

两个方向,一个就是楼上说的套壳加密,再一个就是限时授权码整包里
hefish
14 天前
派 op 天天站服务器旁边看着。
BeautifulSoap
14 天前
@eephee 是的,如果怕 jar 太好逆向的话,写一个专门的启动用二进制,用这个二进制进行上面说的工作。然后这个二进制程序本身也要搞好混淆,加壳防逆向
ferock
14 天前
用虚拟机,密码不提供
Herry001
14 天前
真要拿肯定是直接导出镜像然后直接拆啊……哪用得着进容器
passive
14 天前
启动个 qemu ,里面加载完之后就删了程序,休眠 Guest OS 。每次 docker 开启 qemu 加载休眠 image 。
Citrus
14 天前
不给 shell 没有任何意义。当你 docker pull 之后,镜像里的所有文件就都在磁盘里了,可以从母鸡直接访问。比如,dive 工具了解一下。
做好加密混淆是唯一解法,运行时动态解密。如果用 java 解密那相关代码需要混淆,不然反编译一下密钥清晰可见。
启动后删除二进制也没有意义,如上所说,这个二进制一定存在母鸡上,删除只是容器内看不到,容器外依然能看到。
yinmin
14 天前
你需要的真正目的是防止盗版吧? 你应该根据服务器硬件特征( cpuinfo 、网卡、TPM 等)生成授权码,然后二进制程序运行时去校验授权码是否与服务器硬件匹配。如果使用 k3s 可以做一个授权服务器固定在某个硬件上,然后每次启动时都去授权服务器确认。
lolo1
14 天前
整硬件加密狗
yekern
14 天前
给二进制和动态资源 在套一层和 jar 打包在一起, 运行时候释放到 tmp 下或者 一个隐藏目录, 释放到时候 随机文件名 别带后缀企图用 cache 等名称迷惑客户, 应该可以迷惑 80%的技术不太精的客户
eephee
14 天前
@yekern 确实,之前偶然看到 golang 的 go-bindata 时我也想到过类似的途径,只是不太了解 java 里面用什么工具做这个
eephee
14 天前
@yinmin 防盗版是目的之一,之二是防止客户或者竞品根据动态库等文件的一些特征推测出我们所用的技术
sunny352787
14 天前
你们不会真当容器是虚拟机了吧?镜像就是个压缩包,只要能拿到镜像,你们那些运行时藏文件、用本地密钥解密什么的都毫无意义啊。这玩意你就得当成是本地运行的程序只是不用本地装 jvm 而已,本地运行怎么加壳镜像里就得怎么做,别的都没用
stonesirsir
14 天前
加密啊,能解就算他们厉害
yekern
14 天前
@eephee 我问了豆包,说是可以实现.
我就这么问他的
例如我 spring boot 需要调用一些命令行二进制工具, 而这个工具 我想和 spring boot 一起打包在 jar 文件中, 在执行 spring boot 启动的时候 释放这个二进制文件到指定目录 然后 spring boot 可以调用这个资源, 有点类似 c++的资源文件

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

https://ex.noerr.eu.org/t/1176455

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

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

© 2021 V2EX