V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
NoKey
V2EX  ›  程序员

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

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