在 Docker 中分发 Python 源代码是否安全?
- 2025-03-04 08:25:00
- admin 原创
- 43
问题描述:
我即将决定项目的编程语言。要求是一些客户希望在没有外部互联网访问的独立服务器上运行应用程序。
为此,我需要向他们分发应用程序,而不能使用在我的云上运行的 SaaS 方法(我更愿意这样做......)。
问题是,如果我决定使用 Python 来开发这个,我需要为客户提供易于阅读的代码,而这并不是我真正想做的(当然,我知道所有“你真的需要保护你的源代码吗”之类的问题,但这超出了现在的范围)。
我的一位同事告诉我有关 Docker 的事情。我可以找到很多有关 Docker 容器安全性的答案。问题在于,所有这些都是为了保护(隔离)主机免受容器中运行的代码的影响。
我需要知道 Docker 镜像中以及在 Docker 容器中运行的 Python 源代码是否可以避免访问——用户是否可以通过某种方式(不需要很容易)访问该 Python 代码?
我知道我无法保护一切,我知道一切可能被反编译/破解。我只是想知道答案,以便决定在 Docker 中访问我的代码的方式是否足够困难,让我可以承担风险。
解决方案 1:
Docker 镜像是一种开放且有文档记录的“应用程序打包”格式。有无数种方法可以检查镜像内容,包括其中附带的所有 Python 源代码。
在容器内运行应用程序可以将应用程序与容器外访问主机隔离开来。它们无法防止主机上的用户检查容器内发生的事情。
解决方案 2:
Python 程序以源代码形式分发。如果它可以在客户端计算机上运行,那么代码在该计算机上是可读的。docker 容器仅包含应用程序及其库、外部二进制文件和文件,而不是完整的操作系统。由于安全性只能在操作系统级别(或通过加密)进行管理,并且操作系统处于客户端控制之下,因此客户端可以读取 docker 容器上的任何文件,包括您的 Python 源代码。
如果您确实想这样做,您应该考虑为您的客户提供完整的虚拟机。在这种情况下,VM 包含一个完整的操作系统及其基于帐户的安全性(VM 上的管理帐户密码可以与主机上的密码不同)。这远非一帆风顺,因为这意味着客户将能够在 VM 上设置或调整网络以及其他问题......
您应该意识到,当客户安全官员在其网络上运行不受控制的虚拟机时,他们可能会强烈反对。我永远不会接受。
无论如何,由于客户端对虚拟机具有完全访问权限,因此真正保护虚拟机将非常困难(甚至可能无法禁用从其他设备启动)。安全方面承认,如果攻击者拥有物理访问权限,你就输了。
TL/DR:这不是预期的答案,但不要这么做。如果你出售你的解决方案,你将与你的客户签订一份法律合同,这种问题应该在法律层面上处理,而不是技术层面。你可以尝试,我甚至给了你一个提示,但在我看来,风险高于收益。
解决方案 3:
我知道这已经过去三年多了,但是......正在寻找相同类型的解决方案,我认为在容器内包含已编译的 python 代码(而不是源代码)对于试图访问您宝贵的源代码的人来说是一项具有挑战性的考验。
如果你运行它,pyinstaller --onefile yourscript.py
你将得到一个编译好的单个文件,该文件可以作为可执行文件运行。我只在 Raspberry 中测试过它,但据我所知,对于 Windows 来说也是如此。
当然,任何事物都可以进行逆向工程,但希望对于普通最终用户来说,这并不值得付出努力。
解决方案 4:
我认为这可能是一种解决方案,因为使用“容器”来保护我们的代码免受我们不允许他们访问的人的侵害。问题是docker不是一个安全的容器。由于主机的根对Docker容器拥有最强大的控制权,我们没有任何方法来保护根不访问容器内部。
我只是对安全容器有一些想法:
使用类似docker file的init文件构建容器,创建容器时必须设置密码;
容器建立完成后,我们需要使用密码才能访问内部,包括读取\复制\修改文件
所有存储在主机上的文件都应该加密。
没有提供“检索密码”或“--skip-grant-”模式。这意味着如果您丢失了密码,没有人可以访问容器内的数据。
如果我们有一个可信任的容器,可以在其中运行 tomcat 或Django
服务器,则不需要进行代码混淆。