我有一组脚本(bash、ruby、python),想要将所有内容放入一个类似文件的容器中,这样我就可以在很多服务器上部署这个容器。该脚本需要防止其他用户(包括 root 用户)的访问。所以我的想法是创建一个包含所有敏感脚本的加密容器,并在启动时将其安装到 RAM 中。但是安装此容器后,有权访问该文件的每个人都可以从系统访问这些文件。
是否有某种技术可以将解释脚本(bash,ruby,...)部署到系统上并且没有人可以随时看到其内容?我不想运行一些“混淆”脚本。
答案1
不可能使正在执行该程序的用户无法读取该程序。特别是,root 可以读取所有文件。
你所要求的毫无意义。您可以将加密的容器放在计算机上,其管理员将无法读取它。但是,如果您想使用位于该容器中的内容,则需要解密该内容,然后管理员才能读取它。
您可以使用文件权限来保护文件免受非 root 用户的访问。加密对此没有什么用处:加密仅在某人有权访问包含数据的介质时才对保护数据有用(例如,保护存储在磁盘上的数据免遭访问该磁盘的人的侵害,或者保护传输中的数据免受其他人的侵害)。可以窃听通信频道的人)。
如果您不希望人们能够复制您的软件,那么首先就不要向他们提供您的软件。您也许可以安排软件的敏感部分在您自己的服务器上运行,并且只发送一些愚蠢的客户端。如果您想限制客户运行的副本数量,请通过法律合同来实现。
答案2
这取决于你所说的混淆是什么意思。这是一种允许您将脚本包装在可编译程序中的方法,允许您将它们转换为二进制可执行文件。编写一个如下所示的 C 程序:
#include <stdio.h> #include <stdlib.h> ︙ 文件 *sh; sh = popen("/bin/sh", "w"); // 使用“/bin/bash”如果你需要, // 或任何你需要的解释器。 if (sh == (FILE *)NULL) { 错误(“popen”); 退出(1); } /* 在此处嵌入您的脚本。 */ fprintf(sh, "x 为红蓝绿\n"); fprintf(sh, "做\n"); fprintf(sh, " echo x = \"$x\"\n"); fprintf(sh, "完成\n"); /* 脚本结束。 */ fclose(sh);
如果它不仅仅是几行,将其存储为字符串数组可能更易于管理。然后编译这个程序。
- 如果您希望程序/脚本可由非 root 用户执行,请将二进制文件设置为仅执行(例如,模式 710 或 711)。
- 当然,无论其模式如何,root 都能够读取该文件。虽然二进制可执行文件乍一看只是一个二进制可执行文件,但使用命令提取脚本文本很简单
strings
。您可以通过添加一些脚本文本的轻量级伪加密来稍微缓解这个问题在C 程序;例如,一些微不足道的事情,例如将每个字节与一个常量(最好是设置了 0x80 位的字节)进行异或。这不能提供真正的安全;由于程序必须包含“解密”脚本的逻辑,因此任何分析师都可以做同样的事情。这仅提供了一点“通过默默无闻的安全性”。
没有任何解决方案是万无一失的,因为(至少对于 shell 脚本来说)用户将能够通过ps
在另一个窗口中使用来查看正在运行的命令;但这只能让他们对剧本有片断的了解。
当然,如果你的脚本的逻辑真的很敏感,那么真正的答案是将其翻译成可编译的语言。
(改编自避免用户破坏和使用脚本.)