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

请教大佬,有什么办法禁止 springboot 服务在 docker 中启动

  •  
  •   NoKey · 2019-08-21 13:59:08 +08:00 · 3505 次点击
    这是一个创建于 1911 天前的主题,其中的信息可能已经有所发展或是发生改变。
    就是说,springboot 服务启动的时候,能不能检测自己是在物理服务器上启动的
    还是在 docker 容器中启动的?
    目前有个需求是禁止服务从 docker 中启动
    请大佬赐教,谢谢
    34 条回复    2019-08-22 09:16:18 +08:00
    qiyuey
        1
    qiyuey  
       2019-08-21 14:01:04 +08:00
    先说一下背景,再评估方案,最后实现
    yinzhili
        2
    yinzhili  
       2019-08-21 14:04:50 +08:00
    有一个思路:java 中可以执行 shell,然后你就知道当前环境是不是 docker 了
    NoKey
        3
    NoKey  
    OP
       2019-08-21 14:12:18 +08:00
    @qiyuey 比如,运行的服务要求在指定的 mac 地址的服务器上运行,docker 可以设置虚拟 mac,通过 java 程序获取到的 mac 地址无法区分是虚拟的还是物理的,所以就需要禁止服务从 docker 里启动
    NoKey
        4
    NoKey  
    OP
       2019-08-21 14:12:36 +08:00
    @yinzhili 请问一下,是执行哪个命令呢?
    tomczhen
        5
    tomczhen  
       2019-08-21 14:13:40 +08:00 via Android   ❤️ 1
    典型的 xy 问题。
    Seney
        6
    Seney  
       2019-08-21 14:16:11 +08:00
    通过获取环境变量或者执行 exec systemd-detect-virt 类似这种方法判断是不是物理机
    rockyou12
        7
    rockyou12  
       2019-08-21 14:17:17 +08:00
    @NoKey 虚拟机一样可以模拟 mac 这些,你这需求有问题
    undeflife
        8
    undeflife  
       2019-08-21 14:21:53 +08:00   ❤️ 1
    cat /proc/1/cgroup
    rrfeng
        9
    rrfeng  
       2019-08-21 14:22:50 +08:00
    那要不要考虑虚拟机啊? kvm 之类的要禁止吗
    NoKey
        10
    NoKey  
    OP
       2019-08-21 15:11:21 +08:00
    @rockyou12 大佬们这么一说,我觉得确实有问题,不知道有没有什么好的办法,限制服务运行的地方,ip 地址的话也麻烦,万一啥时候 ip 地址变了,又得调整
    NoKey
        11
    NoKey  
    OP
       2019-08-21 15:11:52 +08:00
    @rrfeng 对,目前看来这种方式有问题,得着点别得方式来限制这个
    qinxi
        12
    qinxi  
       2019-08-21 15:27:08 +08:00
    我更好奇是什么场景需要这种操作
    chendy
        13
    chendy  
       2019-08-21 15:29:08 +08:00
    我更好奇是什么场景需要这种操作
    liuhuansir
        14
    liuhuansir  
       2019-08-21 15:32:29 +08:00
    我也好奇,前几天才学的 docker,刚上线的小程序的后台就是用 docker+springboot 部署的,你这反其道而行之,我想知道这么做的目的是啥
    yinzhili
        15
    yinzhili  
       2019-08-21 15:35:20 +08:00
    @NoKey 简单点:检测是否存在 /.dockerenv 这个文件
    xaplux
        16
    xaplux  
       2019-08-21 15:36:10 +08:00
    一脸懵逼,这是什么操作。
    NoKey
        17
    NoKey  
    OP
       2019-08-21 15:40:39 +08:00
    @qinxi 简单的说,就是要限制服务运行的 mac 地址,docker 可以设置 mac 地址,所以不希望服务在 docker 上运行,不过目前看来这个需求有问题,我需要考虑一些其他方式来限制
    qwerthhusn
        18
    qwerthhusn  
       2019-08-21 15:40:43 +08:00
    简单的方法,检查 PID 是 systemd 还是其他应用(或者就是本应用)
    qwerthhusn
        19
    qwerthhusn  
       2019-08-21 15:40:54 +08:00
    @qwerthhusn PID 为 1
    xujif
        20
    xujif  
       2019-08-21 15:47:47 +08:00
    检查 pid,或者进程数量,docker 内部一般不会有太多进程
    abcbuzhiming
        21
    abcbuzhiming  
       2019-08-21 15:58:02 +08:00
    这个问题提的方式就是错的,楼主应该问的是,java 怎么检测自己是在物理服务器上还是在 docker 里,肯定是能做到的,jdk11 之前,jvm 一直不能检测 docker 环境,导致申请资源时一直以物理机整体资源为标准申请,jdk11 之后,才能以 docker 环境限制的资源标准来申请资源,因此 java 肯定能检测到自己是不是 docker 里
    @qinxi
    @chendy
    八成是带有授权的程序,禁止用户多开
    alamaya
        22
    alamaya  
       2019-08-21 16:04:22 +08:00
    没戏,虚拟机也能改,联网授权,重复 mac 直接不启动就完事儿,不过 java 嘛,分分钟就被破了,人家想破解你,也防不了的
    ginozhu
        23
    ginozhu  
       2019-08-21 16:08:12 +08:00
    这个思路很有问题啊,讲道理虚拟化容器总能针对性地把自己伪装成目标服务器
    调换一下思路,只要在目标服务器的某个目录放个私钥,springboot 启动时检验一下这个私钥,不就可以防止应用在任何 docker 或其他物理机启动吗
    liukanshan
        24
    liukanshan  
       2019-08-21 16:11:42 +08:00
    加密狗配合 JNI 是比较靠谱的方式 也可以在 docker 上面跑(共享 USB) 但不是完美的 只是增加了破解难度而已 (能过滤掉大部分的已经算很不错的了)。
    Rheinmetal
        25
    Rheinmetal  
       2019-08-21 16:11:58 +08:00
    物理机也能改 mac 地址呀
    你这授权方式从根上就不合适
    arrow8899
        26
    arrow8899  
       2019-08-21 16:12:27 +08:00
    物理机的网卡也可以修改 mac 地址啊,如果你要做软件授权的话,这样肯定行不通,可以通过其他方式来限制
    NoKey
        27
    NoKey  
    OP
       2019-08-21 16:20:43 +08:00
    @abcbuzhiming 谢谢,就是带授权的,目前就是想防止有人把程序拷贝到其他地方运行,相关授权信息都是配置文件的形式存在
    NoKey
        28
    NoKey  
    OP
       2019-08-21 16:22:06 +08:00
    @ginozhu 谢谢,这个方式考虑过,放私钥,最终还是会形成文件,如果我们自己去部署,倒是没问题,但是如果让第三方部署,必然会出一个部署文档,这个时候私钥的存放位置就暴露了,所有人都知道这个东西了
    NoKey
        29
    NoKey  
    OP
       2019-08-21 16:24:05 +08:00
    @liukanshan 是的,加密狗是比较好的方式,可是加密狗的价格有点贵,这个还得考虑一下
    yqsas
        30
    yqsas  
       2019-08-21 16:35:14 +08:00 via iPhone
    @abcbuzhiming jdk 这个是通过 cgroup 实现的吧,是不是 docker 还是判断不了
    arcwarden
        31
    arcwarden  
       2019-08-21 17:25:24 +08:00
    有人帮忙投个简历吗,招服务端技术大佬,详情见 https://www.yuque.com/docs/share/9ed147b5-dea4-4a4c-8447-be5ae2983b4a
    kkkkkrua
        32
    kkkkkrua  
       2019-08-21 20:04:16 +08:00 via iPhone
    判断 pid 是不是 1 ?
    frozenshadow
        33
    frozenshadow  
       2019-08-22 00:17:00 +08:00 via Android
    用 dmicode,综合判断是否实体机器。
    wweir
        34
    wweir  
       2019-08-22 09:16:18 +08:00 via Android   ❤️ 1
    歪个楼
    调用系统命令 shutdown -h now,能关机的不是 docker,关不了机的是 docker
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5616 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:36 · PVG 11:36 · LAX 19:36 · JFK 22:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.