V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
eephee
V2EX  ›  Docker

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

  •  
  •   eephee ·
    voldikss · 1 天前 · 1513 次点击

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

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

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

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

    20 条回复    2025-12-03 14:00:23 +08:00
    xkx
        1
    xkx  
       1 天前
    启动后把这个可执行文件删除,如何?
    不过如果客户能拿到镜像本身的话,好像怎么也防不住了。。

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

    两个方向,一个就是楼上说的套壳加密,再一个就是限时授权码整包里
    hefish
        7
    hefish  
       1 天前
    派 op 天天站服务器旁边看着。
    BeautifulSoap
        8
    BeautifulSoap  
       1 天前
    @eephee 是的,如果怕 jar 太好逆向的话,写一个专门的启动用二进制,用这个二进制进行上面说的工作。然后这个二进制程序本身也要搞好混淆,加壳防逆向
    ferock
        9
    ferock  
    PRO
       1 天前 via Android
    用虚拟机,密码不提供
    Herry001
        10
    Herry001  
       1 天前
    真要拿肯定是直接导出镜像然后直接拆啊……哪用得着进容器
    passive
        11
    passive  
       1 天前 via Android
    启动个 qemu ,里面加载完之后就删了程序,休眠 Guest OS 。每次 docker 开启 qemu 加载休眠 image 。
    Citrus
        12
    Citrus  
       21 小时 18 分钟前 via iPhone
    不给 shell 没有任何意义。当你 docker pull 之后,镜像里的所有文件就都在磁盘里了,可以从母鸡直接访问。比如,dive 工具了解一下。
    做好加密混淆是唯一解法,运行时动态解密。如果用 java 解密那相关代码需要混淆,不然反编译一下密钥清晰可见。
    启动后删除二进制也没有意义,如上所说,这个二进制一定存在母鸡上,删除只是容器内看不到,容器外依然能看到。
    yinmin
        13
    yinmin  
       20 小时 24 分钟前 via iPhone
    你需要的真正目的是防止盗版吧? 你应该根据服务器硬件特征( cpuinfo 、网卡、TPM 等)生成授权码,然后二进制程序运行时去校验授权码是否与服务器硬件匹配。如果使用 k3s 可以做一个授权服务器固定在某个硬件上,然后每次启动时都去授权服务器确认。
    lolo1
        14
    lolo1  
       20 小时 12 分钟前 via Android
    整硬件加密狗
    yekern
        15
    yekern  
       19 小时 49 分钟前
    给二进制和动态资源 在套一层和 jar 打包在一起, 运行时候释放到 tmp 下或者 一个隐藏目录, 释放到时候 随机文件名 别带后缀企图用 cache 等名称迷惑客户, 应该可以迷惑 80%的技术不太精的客户
    eephee
        16
    eephee  
    OP
       19 小时 3 分钟前
    @yekern 确实,之前偶然看到 golang 的 go-bindata 时我也想到过类似的途径,只是不太了解 java 里面用什么工具做这个
    eephee
        17
    eephee  
    OP
       19 小时 0 分钟前
    @yinmin 防盗版是目的之一,之二是防止客户或者竞品根据动态库等文件的一些特征推测出我们所用的技术
    sunny352787
        18
    sunny352787  
       18 小时 49 分钟前
    你们不会真当容器是虚拟机了吧?镜像就是个压缩包,只要能拿到镜像,你们那些运行时藏文件、用本地密钥解密什么的都毫无意义啊。这玩意你就得当成是本地运行的程序只是不用本地装 jvm 而已,本地运行怎么加壳镜像里就得怎么做,别的都没用
    stonesirsir
        19
    stonesirsir  
       17 小时 54 分钟前
    加密啊,能解就算他们厉害
    yekern
        20
    yekern  
       14 小时 42 分钟前
    @eephee 我问了豆包,说是可以实现.
    我就这么问他的
    例如我 spring boot 需要调用一些命令行二进制工具, 而这个工具 我想和 spring boot 一起打包在 jar 文件中, 在执行 spring boot 启动的时候 释放这个二进制文件到指定目录 然后 spring boot 可以调用这个资源, 有点类似 c++的资源文件
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   930 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:43 · PVG 04:43 · LAX 12:43 · JFK 15:43
    ♥ Do have faith in what you're doing.