Bash保护脚本不被用户复制

时间:2014-05-11 01:18:49

标签: bash security scripting

我最近写了一个bash脚本,根据每天的到达/离开时间计算一个月的工作小时数。一些同事有兴趣购买它。但我只是希望他们能够执行该文件,而无法更改代码,或将其发送给其他人免费使用。我知道我可以使用chmod命令来设置权限,但他们也可以。是否有任何其他命令或程序可用于保护脚本不被复制或附加到电子邮件中?

如果您认为这与" stackoverflow.com"

无关,请告诉我。

修改 好的,这是我想要具体知道的: 无论如何,您是否可以将bash脚本设置为rx权限,以便用户只能运行脚本,而无需更改权限?我的问题是用户也可以使用chmod命令更改权限。所有用户都使用Windows,因此脚本将使用Cygwin运行。我可以写一个C / C ++或Java程序做同样的事情,但我想知道如何为bash脚本bash做这个,因为我学习bash。我宁愿不尽可能长时间地实现受密码保护的脚本。

我不太担心用户是否可以更改此脚本,但我真的很想知道是否有一个不太复杂的方法来执行此操作以供将来参考,因为我'我计划做很多bash脚本。

如果问题仍然广泛,或者我仍需要编辑问题,请发表评论。

2 个答案:

答案 0 :(得分:1)

没有真正的方法可以做到这一点。您要求的是复制保护,没有人能想到一个好的方法。基本上,为了执行脚本,他们的计算机必须能够读取它;如果你无法控制的东西可以读取脚本,你就失去了对脚本的控制。

对于shell脚本,可能最接近的是使用shc加密和“编译”脚本(说明here)。但是,对加密可执行文件具有读访问权限的任何人都可以decrypt it,恢复原始脚本,并使用它复制/修改/执行任何操作。

答案 1 :(得分:1)

如果您使用的是类Unix系统并且可以访问C编译器,并且不介意具有root权限(或sudo权限)的人可以在以后获取脚本所有,那么你可以谨慎地考虑使用SUID程序来运行脚本。

在其他人无法修改的目录中将脚本worked_hours的权限设置为500(仅为所有者读取和执行)(我假设为/home/you/bin/worked_hours)。请注意,要真正安全,其他人不应该修改//home/home/you/home/you/bin - 您无法停止root修改这些目录,因此您必须信任您的root - 特权用户。

从源代码hours_worked创建一个程序hours_worked.c

#include <unistd.h>

int main(int argc, char **argv)
{
    argv[0] = "/home/you/bin/worked_hours";
    execv(argv[0], argv);
    return 1;
}

编译它,放在你信任的目录中,其他人可以使用它而不是修改它 - 所以对你拥有的目录有755的权限 - 我假设你使用/home/you/bin。将hours_worked上的权限设置为4511(SUID,所有者可读并可执行 - you - 并且可由其他人执行。)

现在告诉人们运行/home/you/bin/hours_worked。他们无法读取此可执行文件;他们无法读取它运行的shell脚本。但是可执行文件可以运行shell脚本。只要您确信脚本在自己运行时具有必要的权限,您应该没问题。 (除非有人用bash搞砸了,以便它将有效的UID重置为真正的UID,或者任何愚蠢的 - 或者至少是不方便的 - 就像那样。)

安全风险在哪里?我假设您可以控制您的主目录及其下的bin目录,并且您信任您的计算机上具有超级用户权限的同事不要滥用其权限来阅读脚本等。您可以不可靠地阻止拥有超级用户权限的人。程序中最少的代码行可以避免许多风险。使用像这样的绝对路径就像你可以做到的那样安全。该代码确实将用户的命令行参数转发给脚本。

它确实假设你可以编写一个足够安全的shell脚本 - 这是有问题的。请注意,脚本运行的所有命令都将像运行它一样运行。如果您的脚本运行编辑器,或运行运行编辑器的程序,则必须假定用户可以使用您的权限访问shell并运行任意命令。发送的任何电子邮件(很可能)都会像发送时一样发送。等等。确保所有工作都按预期工作是棘手的。如果您可以创建另一个自我用户(不同的用户名和用户ID)并使程序SUID为该用户(并且该用户也拥有该脚本),那么您可以避免被直接牵连 - 但它暗示您拥有{{1在机器上设置alter ego用户的权限。您需要确信脚本正在运行您希望它运行的程序,而不是您的用户希望它运行的程序。除此之外,您还需要考虑PATH的设置,还要担心rootLD_LIBRARY_PATH或它们的等价物(尽管程序是SUID的事实应该阻止LD_PRELOAD正在使用的变量。)

这还够吗?正如我已经明确指出的那样,它并不完美,因为您必须信任LD_* - 特权用户。如果你可以信任他们,那就适度有效。它远非完美,但其他所有技术都是如此。使用alter ego用户拥有并运行脚本,您可以获得合理的安全性。如果需要,您可以编写类似的程序来撤消SUID权限:

root

将其称为#include <unistd.h> int main(int argc, char **argv) { setegid(getgid()); seteuid(getuid()); execv(argv[1], &argv[1]); return 1; } 。使用unsetsugid

在您的秘密脚本中运行任何可怕命令(编辑器等)的前缀
unsetsugid

这意味着运行该脚本的任何人都将在没有您的权限的情况下自行运行编辑器。棘手,但很有帮助。

我认为这是一个好主意吗?不,不是真的。为什么如此担心保密?它是开源的对立面。你永远不会知道,他们可能会在你的代码中发现问题。