我正在开发一种必须部署在客户端私有云上的软件。客户端具有root访问权限以及硬件。我不希望客户对我们的软件进行逆向工程。
我们可以控制两件事:
Docker部署能阻止我们的客户端对我们的代码进行逆向工程吗?我们计划打开一个端口并使用SSL来保护传入和传出的数据。
答案 0 :(得分:0)
如果用户有root用户,或者他能够使用他的自定义内核(甚至是内核模块),他可以做任何事情 - 转储内存,停止进程,附加调试器 - 开始逆向工程。如果用户可以访问硬件,他也可以获得root或自定义内核。保护用户软件的唯一方法是使用良好的DRM,例如借助TPM(可信平台模块)或ARM TrustZone。 SecureBoot不能完全保护您的软件(在x86上通常可能会关闭)。其他变体使用防篡改硬件(http://www.emc.com/emc-plus/rsa-labs/standards-initiatives/what-is-tamper-resistant-hardware.htm),就像用于存储库(http://en.wikipedia.org/wiki/Hardware_security_module)中的主加密密钥(处理引脚代码)的内容一样,但是这种硬件的成本非常高。
众所周知,Docker不会保护用户的代码: https://stackoverflow.com/a/26108342/196561 -
主机上的root用户(docker守护程序运行的位置)可以完全访问主机上运行的所有进程。这意味着控制主机的人总是可以访问应用程序的RAM以及文件系统。这使得无法隐藏用于解密文件系统或保护RAM免于调试的密钥。
任何能够部署docker容器的用户(来自docker group的用户)都拥有对容器fs的完全访问权限,具有对容器进程的root访问权限,并且可以调试它们并转储它们的内存。 https://www.andreas-jung.com/contents/on-docker-security-docker-group-considered-harmful
只允许受信任的用户控制您的Docker守护程序
http://docs.docker.com/articles/security/#docker-daemon-attack-surface
Docker允许您在Docker主机和来宾容器之间共享目录;它允许您这样做而不限制容器的访问权限。
所以, Docker不会对用户的代码提供额外的保护;我们可以像其他包装系统一样考虑它,比如rpm和deb。 Rpm和deb允许您将代码打包到单个文件和列表依赖项中,docker将您的代码和依赖项打包到单个文件中。
我们的解决方案托管在客户的云服务器上,因此他们可以访问root和硬件。但是,我们在这里有两个优点:1)我们可以访问一个安全端口,我们可以使用它来发送令牌来解密代码,并审核可疑活动; 2)我们可以手动安装(在安装时键入令牌)
如果您拥有的代码在您拥有的硬件上运行,则可以仅保护您拥有的代码(关闭所有NSA / IntelME / IPMI / UEFI后门到自己的硬件)。如果用户在他的硬件上运行您的代码,他将拥有所有二进制文件并且能够进行内存转储(在收到您的令牌后)。
他的硬件上的虚拟化不会为您的代码提供任何额外的保护。
“安全端口”是指SSL / TLS / SSH吗?仅在网络上发送数据时保护数据是安全的;两个端点都将以简单,未加密的形式提供数据。
离开用户的数据中心后,手动安装无助于保护代码。
我认为您可以购买一些常用的软件保护解决方案,例如flexlm,可能需要一些运行该软件所需的硬件令牌。但任何保护都可能被破解,早期(更便宜)将更容易破解,现代(更昂贵)的保护更难以破解。
您也可以在自己的服务器上运行部分软件;这一部分不会破解。
或者如果必须的话,使用防篡改硬件。
如果用户服务器中没有此类硬件,则无法使用防篡改硬件。它非常昂贵。