我们都知道当你无法开源并自由分发软件的情况时 - 我处于其中一种情况。
我有一个应用程序,它包含许多二进制文件(从C源代码编译)和python代码,它们将它们全部包装到系统中。此应用程序曾用作云解决方案,因此用户可以通过网络访问应用程序功能,但无法触及存储二进制文件和代码的实际服务器。
现在我们想要提供我们系统的“本地”版本。该应用程序将在我们的用户将拥有的PC上运行。我们知道一切都可能被破坏,但至少希望尽可能保护应用程序免受可能的复制和逆向工程。
我知道docker是一个很棒的部署工具,所以我想知道:有可能创建加密的docker容器,没有人能看到容器文件系统中存储的任何数据吗?这个问题有一个已知的解决方案吗?
另外,也许有一些众所周知的解决方案不是基于docker的?
答案 0 :(得分:23)
主机上的root
用户(运行docker
守护程序的用户)可以完全访问主机上运行的所有进程。这意味着控制主机的人总是可以访问应用程序的RAM以及文件系统。这使得无法隐藏用于解密文件系统或保护RAM免于调试的密钥。
在标准Linux机器上使用模糊处理,可以使文件系统和RAM更难以读取,但是无法使其无法运行或容器无法运行。
如果您可以控制运行操作系统的硬件,那么您可能希望查看系统启动后立即启动系统验证的Trusted Platform Module。理论上,您可以在root用户访问系统之前执行操作以隐藏密钥并对文件系统进行强加密。即便如此,在物理访问机器的情况下,确定的攻击者总能获得解密数据。
答案 1 :(得分:6)
您所询问的内容称为obfuscation。它与Docker无关,是一个特定于语言的问题;对于数据,你总是可以做任何你想要的修改,但是虽然你可以希望阻止攻击者,但它永远不会安全。即使是最先进的加密方案也无济于事,因为程序(您提供的)必须包含密钥。
C通常很难进行逆向工程,对于Python,您可以尝试pyobfuscate和similar。
对于数据,我找到this question(关键字:encrypting files game)。
答案 2 :(得分:6)
如果您想要一个完全安全的解决方案,那么您就是在寻找圣杯'机密性:同形加密。简而言之,您希望加密您的应用程序和数据,将它们发送到PC,让这台PC在没有其所有者,操作系统或其他任何人能够挖掘数据的情况下运行它们。 这样做没有大量的性能损失是一个积极的研究项目。至少有one project管理了这个,但它仍有局限性:
Andy关于使用TPM的建议与第2点和第3点有类似的含义。
答案 3 :(得分:4)
听起来像Docker不是正确的工具,因为它从来没有打算用作一个完整的沙盒(至少基于我一直在阅读的内容)。你为什么不使用更全面的VirtualBox方法?至少那时你可以锁定登录后面的虚拟机(就像锁定其他人的计算机上的物理安装一样)并运行它隔离的加密文件系统和整个九码。
你既可以轻量级打开,也可以打开胖子。我不知道有一个“轻量级和封闭式”选项。
答案 4 :(得分:3)
我有完全相同的问题。目前,我能够发现的是波纹管。
A。异步(https://asylo.dev)
B。烤饼(https://sconedocs.github.io)
答案 5 :(得分:0)
对于Python部分,您可以考虑使用Pyinstaller(带有适当的选项),它可以将整个python应用程序打包在一个可执行文件中,这将不需要最终用户运行python安装。它在打包的代码上有效地运行了python解释器,但是它具有一个cipher选项,允许您加密字节码。
是的,密钥将位于可执行文件的周围,非常精明的客户可能会提取该密钥,从而解开了一个不太可读的代码。由您决定代码是否包含一些重大秘密,您需要不惜一切代价将其隐藏。如果我想为部署的产品中的任何错误解决收取大量费用,我可能不会这样做。如果客户具有良好的合规性标准,并且不是潜在的竞争对手,也不能期望支付更多的许可证,则可以使用它。
虽然我已经做过一次,但是老实说我会避免再做一次。
关于C代码,如果可以将其编译为可执行文件和/或共享库可以包含在Pyinstaller生成的可执行文件中。
答案 6 :(得分:0)
我有同样的问题。我考虑过将应用程序的核心组件创建为共享库(.so),并在容器启动时将其下载到ramdisk中。
当然,并非所有代码都受保护,但是如果没有这一核心组件(使用C ++或C编译),您会尝试使其无效。
这只是一个想法,没有任何实际的实现细节。