加密和安全的docker容器

时间:2014-09-24 00:35:10

标签: python security encryption docker

我们都知道当你无法开源并自由分发软件的情况时 - 我处于其中一种情况。

我有一个应用程序,它包含许多二进制文件(从C源代码编译)和python代码,它们将它们全部包装到系统中。此应用程序曾用作云解决方案,因此用户可以通过网络访问应用程序功能,但无法触及存储二进制文件和代码的实际服务器。

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

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

另外,也许有一些众所周知的解决方案不是基于docker的?

7 个答案:

答案 0 :(得分:23)

主机上的root用户(运行docker守护程序的用户)可以完全访问主机上运行的所有进程。这意味着控制主机的人总是可以访问应用程序的RAM以及文件系统。这使得无法隐藏用于解密文件系统或保护RAM免于调试的密钥。

在标准Linux机器上使用模糊处理,可以使文件系统和RAM更难以读取,但是无法使其无法运行或容器无法运行。

如果您可以控制运行操作系统的硬件,那么您可能希望查看系统启动后立即启动系统验证的Trusted Platform Module。理论上,您可以在root用户访问系统之前执行操作以隐藏密钥并对文件系统进行强加密。即便如此,在物理访问机器的情况下,确定的攻击者总能获得解密数据。

答案 1 :(得分:6)

您所询问的内容称为obfuscation。它与Docker无关,是一个特定于语言的问题;对于数据,你总是可以做任何你想要的修改,但是虽然你可以希望阻止攻击者,但它永远不会安全。即使是最先进的加密方案也无济于事,因为程序(您提供的)必须包含密钥。

C通常很难进行逆向工程,对于Python,您可以尝试pyobfuscatesimilar

对于数据,我找到this question(关键字:encrypting files game)。

答案 2 :(得分:6)

如果您想要一个完全安全的解决方案,那么您就是在寻找圣杯'机密性:同形加密。简而言之,您希望加密您的应用程序和数据,将它们发送到PC,让这台PC在没有其所有者,操作系统或其他任何人能够挖掘数据的情况下运行它们。 这样做没有大量的性能损失是一个积极的研究项目。至少有one project管理了这个,但它仍有局限性:

  1. 仅限Windows -
  2. CPU可以访问密钥(即,您必须信任英特尔)
  3. 针对云方案进行了优化。如果要将其安装到多台PC上,您需要以安全的方式提供密钥(即自己去那里并自行输入)给您要安装应用程序的PC之一,这台PC应该能够安全地将密钥传播到其他PC。
  4. Andy关于使用TPM的建议与第2点和第3点有类似的含义。

答案 3 :(得分:4)

听起来像Docker不是正确的工具,因为它从来没有打算用作一个完整的沙盒(至少基于我一直在阅读的内容)。你为什么不使用更全面的VirtualBox方法?至少那时你可以锁定登录后面的虚拟机(就像锁定其他人的计算机上的物理安装一样)并运行它隔离的加密文件系统和整个九码。

你既可以轻量级打开,也可以打开胖子。我不知道有一个“轻量级和封闭式”选项。

答案 4 :(得分:3)

我有完全相同的问题。目前,我能够发现的是波纹管。

A。异步(https://asylo.dev

  1. Asylo要求使用C ++编写程序/算法。
  2. Asylo库已集成在docker中,似乎可以基于Asylo创建自定义的döcker映像。
  3. Asylo依赖于许多不太流行的技术,例如“ proto缓冲区”和“ bazel”等。在我看来,学习曲线不会很陡峭,即创建docker镜像/(程序)的人将需要很多是时候了解如何做到了。
  4. Asylo免费
  5. Asylo是一个崭新的事物,它具有所有的优点和缺点。
  6. Asylo由Google生产,但根据其页面上的免责声明,它不是官方支持的Google产品。
  7. Asylo承诺即使具有root特权的用户也可以保存受信任环境中的数据。但是,缺乏文档,目前尚不清楚如何实现。

B。烤饼(https://sconedocs.github.io

  1. 它与INTEL SGX技术绑定在一起,但还具有仿真模式(用于开发)。
  2. 它不是免费的。它只有一小部分功能是不付费的。
  3. 似乎支持许多安全功能。
  4. 易于使用。
  5. 他们似乎拥有更多的文档和说明,如何使用其技术来构建自己的Docker映像。

答案 5 :(得分:0)

对于Python部分,您可以考虑使用Pyinstaller(带有适当的选项),它可以将整个python应用程序打包在一个可执行文件中,这将不需要最终用户运行python安装。它在打包的代码上有效地运行了python解释器,但是它具有一个cipher选项,允许您加密字节码。

是的,密钥将位于可执行文件的周围,非常精明的客户可能会提取该密钥,从而解开了一个不太可读的代码。由您决定代码是否包含一些重大秘密,您需要不惜一切代价将其隐藏。如果我想为部署的产品中的任何错误解决收取大量费用,我可能不会这样做。如果客户具有良好的合规性标准,并且不是潜在的竞争对手,也不能期望支付更多的许可证,则可以使用它。

虽然我已经做过一次,但是老实说我会避免再做一次。

关于C代码,如果可以将其编译为可执行文件和/或共享库可以包含在Pyinstaller生成的可执行文件中。

答案 6 :(得分:0)

我有同样的问题。我考虑过将应用程序的核心组件创建为共享库(.so),并在容器启动时将其下载到ramdisk中。

当然,并非所有代码都受保护,但是如果没有这一核心组件(使用C ++或C编译),您会尝试使其无效。

这只是一个想法,没有任何实际的实现细节。