对私有云上的 Docker 部署进行逆向工程
Reverse engineering a Docker deployment on private cloud
我正在开发一个必须部署在客户私有云上的软件。客户端具有根访问权限以及硬件。我不希望客户对我们的软件进行逆向工程。
我们可以在这里控制两件事:
- 我们可以访问服务器的安全端口,我们可以使用该端口发送令牌来解密代码,并在必要时将其关闭;
- 我们可以手动安装(安装时输入密码),或者如果必须的话使用防篡改设备。
Docker 部署能否阻止我们的客户对我们的代码进行逆向工程?我们计划开放单个端口并使用 SSL 来保护传入和传出数据。
如果用户有 root 权限,或者他能够使用他的自定义内核(甚至内核模块),他可以做任何事情——转储内存、停止进程、附加调试器——来开始逆向工程。如果用户有权访问硬件,他还可以获得 root 或自定义内核。保护软件免受用户侵害的唯一方法是使用良好的 DRM,例如借助 TPM(可信平台模块)或 ARM TrustZone。 SecureBoot 不会完全保护您的软件(在 x86 上它通常可能被关闭)。其他变体是使用防篡改硬件(http://www.emc.com/emc-plus/rsa-labs/standards-initiatives/what-is-tamper-resistant-hardware.htm), like what is used to store master encryption keys (to process pin-codes) in banks (http://en.wikipedia.org/wiki/Hardware_security_module),但这种硬件成本非常高。
已知 Docker 不对用户的代码提供保护:
-
The root user on the host machine (where the docker daemon runs) has full access to all the processes running on the host. That means the person who controls the host machine can always get access to the RAM of the application as well as the file system. That makes it impossible to hide a key for decrypting the file system or protecting RAM from debugging.
任何能够部署 docker 容器的用户(来自 docker 组的用户)都具有对容器 fs 的完全访问权限,对容器进程具有 root 访问权限,并且可以调试它们并转储它们的内存。
https://www.andreas-jung.com/contents/on-docker-security-docker-group-considered-harmful
Only trusted users should be allowed to control your Docker daemon
http://docs.docker.com/articles/security/#docker-daemon-attack-surface
Docker allows you to share a directory between the Docker host and a guest container; and it allows you to do so without limiting the access rights of the container.
因此,Docker 不会为您的代码提供额外的保护以防用户;我们可以把它当作其他打包系统来考虑,比如 rpm 和 deb。 Rpm 和 deb 允许您将代码打包到单个文件中并列出依赖项,docker 将您的代码和依赖项打包到单个文件中。
Our solution is hosted on our client's cloud server, so they do have access to both root and the hardware. However, we have two advantages here: 1) we have access to a secure port, which we can use to send tokens to decrypt the code, and audit suspicious activities; 2) we can do manual installation (key in a token at the time of installation)
您只能保护自己的代码,如果它在您自己的硬件上 运行ning(关闭所有 NSA/IntelME/IPMI/UEFI 自己硬件的后门)。如果用户 运行 在他的硬件上使用你的代码,他将拥有所有二进制文件并且能够进行内存转储(在收到你的令牌后)。
他的硬件上的虚拟化不会给你的代码任何额外的保护。
"secure port" 是否意味着 SSL/TLS/SSH?只有在网络上发送数据时才保护数据是安全的;两个端点都将以明文、未加密的形式拥有数据。
离开用户的数据中心后,手动安装将无助于保护代码。
我认为您可以购买一些常用的软件保护解决方案,例如 flexlm,可能带有 运行 软件所需的一些硬件令牌。但是任何保护都可能被破解,早期的(便宜的)更容易破解,而现代的(更昂贵的)保护更难破解。
您也可以 运行 软件的某些部分在您自己的服务器上;这部分就不破解了
or use Tamper resistance hardware if we have to.
如果用户的服务器中没有防篡改硬件,您将无法使用此类硬件。而且很贵。
我正在开发一个必须部署在客户私有云上的软件。客户端具有根访问权限以及硬件。我不希望客户对我们的软件进行逆向工程。
我们可以在这里控制两件事:
- 我们可以访问服务器的安全端口,我们可以使用该端口发送令牌来解密代码,并在必要时将其关闭;
- 我们可以手动安装(安装时输入密码),或者如果必须的话使用防篡改设备。
Docker 部署能否阻止我们的客户对我们的代码进行逆向工程?我们计划开放单个端口并使用 SSL 来保护传入和传出数据。
如果用户有 root 权限,或者他能够使用他的自定义内核(甚至内核模块),他可以做任何事情——转储内存、停止进程、附加调试器——来开始逆向工程。如果用户有权访问硬件,他还可以获得 root 或自定义内核。保护软件免受用户侵害的唯一方法是使用良好的 DRM,例如借助 TPM(可信平台模块)或 ARM TrustZone。 SecureBoot 不会完全保护您的软件(在 x86 上它通常可能被关闭)。其他变体是使用防篡改硬件(http://www.emc.com/emc-plus/rsa-labs/standards-initiatives/what-is-tamper-resistant-hardware.htm), like what is used to store master encryption keys (to process pin-codes) in banks (http://en.wikipedia.org/wiki/Hardware_security_module),但这种硬件成本非常高。
已知 Docker 不对用户的代码提供保护: -
The root user on the host machine (where the docker daemon runs) has full access to all the processes running on the host. That means the person who controls the host machine can always get access to the RAM of the application as well as the file system. That makes it impossible to hide a key for decrypting the file system or protecting RAM from debugging.
任何能够部署 docker 容器的用户(来自 docker 组的用户)都具有对容器 fs 的完全访问权限,对容器进程具有 root 访问权限,并且可以调试它们并转储它们的内存。 https://www.andreas-jung.com/contents/on-docker-security-docker-group-considered-harmful
Only trusted users should be allowed to control your Docker daemon
http://docs.docker.com/articles/security/#docker-daemon-attack-surface
Docker allows you to share a directory between the Docker host and a guest container; and it allows you to do so without limiting the access rights of the container.
因此,Docker 不会为您的代码提供额外的保护以防用户;我们可以把它当作其他打包系统来考虑,比如 rpm 和 deb。 Rpm 和 deb 允许您将代码打包到单个文件中并列出依赖项,docker 将您的代码和依赖项打包到单个文件中。
Our solution is hosted on our client's cloud server, so they do have access to both root and the hardware. However, we have two advantages here: 1) we have access to a secure port, which we can use to send tokens to decrypt the code, and audit suspicious activities; 2) we can do manual installation (key in a token at the time of installation)
您只能保护自己的代码,如果它在您自己的硬件上 运行ning(关闭所有 NSA/IntelME/IPMI/UEFI 自己硬件的后门)。如果用户 运行 在他的硬件上使用你的代码,他将拥有所有二进制文件并且能够进行内存转储(在收到你的令牌后)。
他的硬件上的虚拟化不会给你的代码任何额外的保护。
"secure port" 是否意味着 SSL/TLS/SSH?只有在网络上发送数据时才保护数据是安全的;两个端点都将以明文、未加密的形式拥有数据。
离开用户的数据中心后,手动安装将无助于保护代码。
我认为您可以购买一些常用的软件保护解决方案,例如 flexlm,可能带有 运行 软件所需的一些硬件令牌。但是任何保护都可能被破解,早期的(便宜的)更容易破解,而现代的(更昂贵的)保护更难破解。
您也可以 运行 软件的某些部分在您自己的服务器上;这部分就不破解了
or use Tamper resistance hardware if we have to.
如果用户的服务器中没有防篡改硬件,您将无法使用此类硬件。而且很贵。