目前我们的业务系统中有一个 java 后端服务,该服务的 docker 镜像中除了包含构建好的 jar 包外,还包含了一个二进制可执行文件和一些动态库,运行时 java 会开子进程调用这个二进制文件去做一些事情。由于这个二进制文件依赖的复杂性,我不太好 FROM scratch 去构建镜像,因此目前我是基于 debian 去构建的镜像。
私有化部署时,我们会在客户提供的机器上面部署一个 k3s 集群来跑这套系统。
领导说要防止客户进入容器拿到里面的二进制可执行文件和动态库,我目前是在构建镜像时将 bash|sh|dash 悄悄移动到其他目录下(方便我们自己调试),但是我知道这个做法其实是掩耳盗铃,因为只要别人拷贝一个 shell 文件进去就可以破解。
想问一下关于这块目前有没有人有相对成熟的方案呢
1
xkx 1 天前
启动后把这个可执行文件删除,如何?
不过如果客户能拿到镜像本身的话,好像怎么也防不住了。。 或者是这个二进制文件搞成启动时才下载的,而下载的地方搞点手脚不让随便下(比如识别服务器指纹) |
2
NewYear 1 天前
远程加载,永远只存在内存。
|
3
BeautifulSoap 1 天前
典型的给程序加壳的应用场景,拿到了二进制也要脱壳解密。如果可以联网的话,和上面说的动态下也是可以的,比如动态下载经过加密的二进制到内存,然后内存中解密直接执行
|
5
eephee OP @BeautifulSoap 调用时解密吗,好像确实可以,只要 jar 包里面的私钥不被破解好像就行得通是吗
|
6
JoeJoeJoe PRO 镜像你都提供了,只要想拿总会是能拿到的.
两个方向,一个就是楼上说的套壳加密,再一个就是限时授权码整包里 |
7
hefish 1 天前
派 op 天天站服务器旁边看着。
|
8
BeautifulSoap 1 天前
@eephee 是的,如果怕 jar 太好逆向的话,写一个专门的启动用二进制,用这个二进制进行上面说的工作。然后这个二进制程序本身也要搞好混淆,加壳防逆向
|
9
ferock PRO 用虚拟机,密码不提供
|
10
Herry001 1 天前
真要拿肯定是直接导出镜像然后直接拆啊……哪用得着进容器
|
11
passive 1 天前 via Android
启动个 qemu ,里面加载完之后就删了程序,休眠 Guest OS 。每次 docker 开启 qemu 加载休眠 image 。
|
12
Citrus 21 小时 18 分钟前 via iPhone
不给 shell 没有任何意义。当你 docker pull 之后,镜像里的所有文件就都在磁盘里了,可以从母鸡直接访问。比如,dive 工具了解一下。
做好加密混淆是唯一解法,运行时动态解密。如果用 java 解密那相关代码需要混淆,不然反编译一下密钥清晰可见。 启动后删除二进制也没有意义,如上所说,这个二进制一定存在母鸡上,删除只是容器内看不到,容器外依然能看到。 |
13
yinmin 20 小时 24 分钟前 via iPhone
你需要的真正目的是防止盗版吧? 你应该根据服务器硬件特征( cpuinfo 、网卡、TPM 等)生成授权码,然后二进制程序运行时去校验授权码是否与服务器硬件匹配。如果使用 k3s 可以做一个授权服务器固定在某个硬件上,然后每次启动时都去授权服务器确认。
|
14
lolo1 20 小时 12 分钟前 via Android
整硬件加密狗
|
15
yekern 19 小时 49 分钟前
给二进制和动态资源 在套一层和 jar 打包在一起, 运行时候释放到 tmp 下或者 一个隐藏目录, 释放到时候 随机文件名 别带后缀企图用 cache 等名称迷惑客户, 应该可以迷惑 80%的技术不太精的客户
|
18
sunny352787 18 小时 49 分钟前
你们不会真当容器是虚拟机了吧?镜像就是个压缩包,只要能拿到镜像,你们那些运行时藏文件、用本地密钥解密什么的都毫无意义啊。这玩意你就得当成是本地运行的程序只是不用本地装 jvm 而已,本地运行怎么加壳镜像里就得怎么做,别的都没用
|
19
stonesirsir 17 小时 54 分钟前
加密啊,能解就算他们厉害
|