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