Docker 怎么加密,防止再次分发?内网不联网

  |   2 评论   |   815 浏览

Docker 怎么加密,防止再次分发?内网不联网

  1. 源码层面保护,防止docker cp 将源码拷贝出来,进行编辑

    1. 混淆代码将代码转为pyc

    2. https://www.cnblogs.com/dhcn/p/11077447.html

    3. 代码跑起来,把代码删除?

    4. 用 Nuitka 打包github.com/Nuitka/Nuitka和 Cython 一样,都是先将 py 代码转成 C++,但是 Nuitka 在用来打包方面比 Cython 好用

  2. 镜像层面保护,防止镜像被copy 分发:镜像在启动的时候,启动要校验,启动的时候,使用MAC地址

  3. 服务层面保护:登陆时候验证,MAC地址

实现方式1: 激活码 不可行

将代码转成pyc,一次性激活码必须是单点。。必须是我们来维护才行。。公网服务, 不能满足内网不联网的需求

实现方式2:绑定Mac地址

写个服务,根据mac地址 生成镜像

代码转化为pyc ,一个mac地址,一个镜像。

代码验证

  1. 项目启动,启动时候加段逻辑,判断Mac地址是否和Image的Mac地址相同

  2. 将代码转换为pyc

怎么获取宿主机的mac地址?

将宿主机的/sys/devices 挂载在容器里面,就可以查到宿主机的mac地址。

import uuid  
​  
​  
def get_mac_address():  
 mac = uuid.UUID(int=uuid.getnode()).hex[-12:]  
 return ":".join([mac[e:e + 2] for e in range(0, 11, 2)])  
​  
​  
if __name__ == '__main__':  
 print(get_mac_address())

Django 方式 pyc 文件生成方式

https://github.com/lishulongVI/free_login/blob/v1/pyc_create.py

编译pyc文件

python pyc_create.py  compile ./

将pyc文件移动到py所对应的目录

python pyc_create.py copy ./

移除源码 py

python pyc_create.py remove ./

代码层面MAC验证:null

项目启动处:GitHub

项目中间件每个请求都验证MAC地址:GitHub

项目在生产上部署,将setting文件中的debug模式 关闭

具体做法:

1、获取到要部署机器的mac地址

import uuid  
":".join([uuid.UUID(int=uuid.getnode()).hex[-12:][e:e + 2] for e in range(0, 11, 2)])

2、把获取的mac地址填充到项目中

  1. 全局搜索 # TODO 把需要部署到某台机器的MAC地址进行绑定

  2. 将获取到的要部署的目的机器地址 放到 if get_mac_address() in []: [] 中,有两个地方

3、docker 镜像修改

# copy 代码之后添加以下命令  
WORKDIR /home/work  
# 清理缓存  
RUN python3 pyc_create.py clean ./  
# 转换pyc  
RUN python3 pyc_create.py compile ./   
# 替换py  
RUN python3 pyc_create.py copy ./   
# 重命名py  
RUN python3 pyc_create.py `cpython` ./

# 移除源码py  
RUN python3 pyc_create.py remove ./

4、docker-compose文件修改

#  1、挂载宿主机的目录:/sys/devices  
~~volumes:  ~~
~~ - /sys/devices:/sys/devices~~

#  方式1不行
需要设置network_model:host

5、服务启动

  1. 比如我在python 3.7.6版本中转换的pyc 命名 manage.py -> manage.cpython-37.pyc

  2. 根据python版本去定义启动文件

    python manage.py runserver 0.0.0.0:8000  
    需要这样启动  
    python manage.cpython-37.pyc  runserver 0.0.0.0:8000

为什么不将MAC地址作为环境变量传递进去,和程序获取的MAC地址 做比较

  1. 不让对方知道是根据MAC地址
    • 将MAC地址写死到项目中,可定制化不强,每次需要打包笨重的镜像,每次都需要修改代码,
    • 需要实现一个镜像,绑定多个MAC地址。不修改代码。
  2. 对称加密算法实现的优缺点
    • 对MAC地址进行加密,获取授权码
    • 程序对Mac地址再加密,然后和授权码对比
    • 假设对方破解了代码的加密算法,并且知道加密MAC作为授权码,就坏事了
  3. 非对称加密算法实现的优缺点
    • 曝漏了是根据MAC地址进行授权的,这样的话存在修改mac地址 镜像分发得不到遏制
    • 即使对方破解了加密算法代码部分,没有公钥,也无法实现对MAC地址的加密,获得授权文件
  4. 对称加密算法+非对称加密算法
    • 隐藏了MAC地址 加密MAC地址
    • 输入MAC加密地址 输出授权文件


标题:Docker 怎么加密,防止再次分发?内网不联网
作者:lishulongVI
地址:https://blog.thinking.mobi/articles/2020/02/12/1581499687258.html

评论

  • lishulongVI @lishulongVI 回复»

    非对称加密算法,实现公钥加密得到授权文件,私钥解密授权文件,实现多个机器多个授权文件
    多个授权文件,同一个镜像。

  • lishulongVI 回复»

    每个mac配置一个镜像?还有更好的方式么

发表评论