加密和安全的Docker容器

59

我们都知道有些情况下你不能采用开源方式自由分发软件——我现在就处于这种情况。

我的应用程序由一些二进制文件(从C源代码编译而来)和Python代码组成,将其全部包装成一个系统。这个应用程序曾经作为云解决方案运行,因此用户可以通过网络访问应用程序功能,但无法触及存储二进制文件和代码的实际服务器。

现在我们想要提供本地版本的系统。该应用程序将在用户拥有物理控制权的PC上运行。我们知道一切都可能被破坏,但至少希望尽可能地保护应用程序免受可能的复制和逆向工程攻击。

我知道Docker是一个很棒的部署工具,所以我想知道:是否可能创建加密的Docker容器,使得没有人能够看到容器文件系统中存储的任何数据?是否已知有解决这个问题的解决方案?

此外,也许有一些不基于Docker的已知方案吗?


2
CoreOS 正试图通过 Rocket 来解决这个问题。他们将实现类似 Golang 的导入系统,允许您从私有存储库中拉取。不过目前仍在积极开发中。请收听此播客以获取更多信息。 - mauvm
1
嘿,你找到这个问题的解决方案了吗?非常感谢任何回复。 - Abdul Jabbar
我没有找到任何基于Docker的解决方案,我认为这是一个死胡同。至少在这里,Docker确实没有给你带来优势。 - Aleksei Petrenko
6个回答

30

Docker守护进程所在的主机上的root用户可以完全访问主机上运行的所有进程。这意味着控制主机的人始终可以访问应用程序的RAM以及文件系统。这使得隐藏用于解密文件系统或保护RAM免受调试的关键字成为不可能。

在标准Linux系统上使用混淆技术,可以使读取文件系统和RAM变得更加困难,但无法做到使其变得不可能,否则容器将无法运行。

如果您可以控制运行操作系统的硬件,则可以查看可信平台模块,该模块会在系统启动时开始系统验证。然后,理论上您可以在根用户访问系统之前执行隐藏关键字和强加密文件系统的操作。即使如此,有决心的攻击者仍然可以在获得物理访问权限后获取解密数据。


Andy,感谢你的回答。正如我在帖子中提到的:“我们知道一切都可能被破解”-所以我意识到了这一点。我只是认为有“标准”的方法来做这些事情,并且我也希望有一个基于docker的已知解决方案。现在我想我们只会有一个混淆+某种许可文件-只是基本的保护,但比没有好。顺便说一句,谢谢你的链接,我会去看看的。 - Aleksei Petrenko

12
你所询问的是混淆,它与Docker无关,是一个非常特定于语言的问题;对于数据,你总是可以进行任何操作,但是虽然你可以希望阻止攻击者,但它永远不会是安全的。即使是最先进的加密方案也无法帮助,因为程序(由您提供)必须包含密钥。
C通常很难反向工程化,对于Python,您可以尝试pyobfuscatesimilar
对于数据,我找到了这个问题(关键词:encrypting files game)。

4
你好!感谢您的回答。混淆显然是我们考虑的一个问题,但它只解决了反向工程中的一个问题(并且不完全解决)。我真正想要的是一个看起来像黑盒子的沙盒容器。您可以与其输入和输出进行交互,但无法看到其内部内容。我想知道是否可能在容器内使用某种加密文件系统来实现这一点。谢谢您提供的这些链接,我会查看它们! - Aleksei Petrenko
1
如果您加密容器,则仍需要在发送给用户的内容中出现密钥,否则将无法运行。而且,如果您分发它,则用户有可能会找到它... - remram
1
我也理解这个问题。但说实话,我并不是第一个遇到这种问题的人。我知道应该有一些Linux发行版包含了这样的安全功能 - 加密文件系统等等。好吧,也许我得自己想办法解决。无论如何,还是谢谢你。 - Aleksei Petrenko
1
问题在于,通过混淆来实现安全本质上在开源社区中并不受欢迎。不过祝你好运 :) - remram
对于 Python,你读过这个问题吗?除此之外,我只能说 Docker 不能提供帮助。 - remram

8
如果你想要完全安全的解决方案,你正在寻找机密性的“圣杯”:同态加密。简而言之,你想要对你的应用程序和数据进行加密,将它们发送到一台计算机上,并在没有其所有者、操作系统或其他人能够窥视数据的情况下运行它们。 但是,这样做而不会受到巨大的性能损失正在进行积极的研究项目。至少有一个项目成功地实现了这一点(参见链接),但仍然存在以下限制:
  1. 仅适用于Windows系统
  2. CPU可以访问密钥(即你必须信任英特尔)
  3. 它被优化用于云场景。如果你想要将其安装到多台计算机上,则需要以安全的方式提供密钥(例如,只需前往某个计算机并手动输入)到其中一台要安装应用程序的计算机上,并且此计算机应该能够安全地将密钥传播到其他计算机。
安迪建议使用TPM具有类似于2和3的影响。

1
是的,当我在研究这个主题时,我有点想通了(关于同态加密)。顺便说一句,谢谢你提供这篇信息丰富的文章! - Aleksei Petrenko

6
听起来Docker不是合适的工具,因为它从未被设计成用作完整的沙盒(至少根据我所阅读的内容)。为什么不使用更完整的VirtualBox方法?这样至少可以将虚拟机锁定在登录后(尽可能地锁定在他人计算机上进行的物理安装),并运行隔离,加密文件系统和所有其他措施。
您可以选择轻量级和开放式,或者厚重而封闭。我不知道是否有“轻量级且封闭”的选项。

好的观点。由于性能问题,我不想采用VM方法。我认为最终我们会更轻盈和开放,而不是沉重和封闭 :) - Aleksei Petrenko
5
虚拟机对此并没有帮助。从镜像中挂载文件系统和找到容器的根目录一样容易。而加密仍然不是一个选择。 - remram
1
此外,轻松转储正在运行的VirtualBox VM的整个RAM。因此,即使您的客户无法登录且文件系统已加密,一旦加载了Python源代码,他们仍然可以轻松访问。我想我使用了以下命令: $ vboxmanage debugvm“您的VM名称”dumpguestcore--filename ram.elf $ grep“源代码片段”ram.elf http://wiki.yobi.be/wiki/RAM_analysis - mh8020

5
我有完全相同的问题。 目前我能够发现以下内容。
A. Asylo (https://asylo.dev)
  1. Asylo要求程序/算法必须用C++编写。
  2. Asylo库集成在docker中,似乎可以创建基于Asylo的自定义docker镜像。
  3. Asylo依赖许多不太流行的技术,如“proto buffers”和“bazel”等。对我来说,学习曲线会很陡峭,这意味着创建docker映像/(程序)的人需要很长时间才能理解如何做。
  4. Asylo是免费的。
  5. Asylo是崭新的,具有所有优点和缺点。
  6. Asylo由Google制作,但根据其页面上的免责声明,它不是Google官方支持的产品。
  7. Asylo承诺,可将可信环境中的数据保存甚至从具有root权限的用户中获取。然而,目前缺乏文档,并不清楚如何实现这一点。
B. Scone (https://sconedocs.github.io)
  1. 它绑定到INTEL SGX技术,但还有模拟模式(用于开发)。
  2. 它不是免费的。它只有一小部分功能是免费的。
  3. 似乎支持许多安全功能。
  4. 易于使用。
  5. 他们似乎有更多的文档和指南,介绍如何使用他们的技术构建自己的docker映像。

1
我认为你的意思是Asylo的学习曲线确实很陡峭 :) - Jan Clemens Stoffregen

1
对于Python部分,您可以考虑使用Pyinstaller,通过适当的选项,它可以将整个Python应用程序打包成一个单独的可执行文件,而无需用户安装Python即可运行。它在打包的代码上有效地运行Python解释器,但它有一个密码选项,允许您加密字节码。
是的,密钥将在可执行文件附近某个位置,并且非常精明的客户可能有手段提取它,从而揭示一个不太可读的代码。由您决定是否需要隐藏一些重要机密。如果我想为部署的产品收费解决任何错误,我可能不会这样做。如果客户具有良好的合规标准,不是潜在竞争对手,也不需要支付更多的许可证费用,我可以使用它。
虽然我已经做过一次,但老实说,我会避免再次这样做。
关于C代码,如果您可以将其编译为可执行文件和/或共享库,则可以将其包含在由Pyinstaller生成的可执行文件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接