优化加密/解密脚本的建议?[现在在Sourceforge上]

时间:2009-04-08 06:04:05

标签: c unix encryption scripting

UPDATE2:

感谢您的投入。我已经实现了算法,可以在SourceForge下载。这是我的第一个开源项目,所以请怜悯。

更新:

我不确定我是否足够清楚,或者每个人都对此有所了解,了解贝壳消耗的方式#!输入类型。一本很好看的书是Advanced Unix Programming。只需调用popen并将其标准输入提供给here.

即可

原始问题:

我们的脚本在具有许多用户的高度分布式环境中运行。由于许多原因,使用权限隐藏它们是有问题的。

由于第一行可用于为脚本指定“解释器”,因此初始行可用于定义解密器

#!/bin/decryptandrun
*(&(*S&DF(*SD(F*SDJKFHSKJDFHLKJHASDJHALSKJD
SDASDJKAHSDUAS(DA(S*D&(ASDAKLSDHASD*(&A*SD&AS
ASD(*A&SD(*&AS(D*&AS(*D&A(SD&*(A*S&D(A*&DS

鉴于我可以编写脚本来加密并放置适当的头我想要解密脚本(它本身可能有一个解释器行,如#!/ bin / perl在它的顶部),而不做任何愚蠢的事情把它写出来一个临时文件。我发现了一些愚蠢的商业产品。我认为这可以在几个小时内完成。是否有一个众所周知的方法用管道而不是编码系统调用?我在考虑使用execvp,但是更换当前进程或创建子进程是否更好?

4 个答案:

答案 0 :(得分:8)

如果您的用户可以执行decryptandrun程序,那么他们可以读取它(以及它需要读取的任何文件,如解密密钥)。因此,他们只需提取代码即可自行解密脚本。

你可以通过制作decrtyptandrun suid来解决这个问题。但是,它中的任何错误都可能导致用户获得root权限(或至少拥有解密密钥的帐户的权限)。所以这可能不是一个好主意。当然,如果您通过使用户无法读取这些解密脚本的内容或密钥而烦恼,那么为什么不能对脚本的内容执行相同的操作呢?我试图隐藏?

此外,您不能将#!解释的可执行文件作为另一个#!已解释的可执行文件的解释器。

密码学的基本规则之一是,除非您是经验丰富的密码分析师,否则不要发明自己的加密算法(或工具)。

这让我想知道为什么你觉得需要加密用户将运行的脚本。他们看到脚本的内容有什么问题吗?

答案 1 :(得分:3)

Brian Campbell's answer有正确的想法,我会把它说出来:

您需要让您的脚本不可读但可由用户(jbloggs)执行,并使decodeandrun为setuid。您可以将它设置为setuid root,但是为某个组decodegroup设置setgid会更安全,然后将脚本文件的组设置为decodegroup。您需要确保decodegroup对脚本文件具有读取和执行权限,并且jbloggs不是该组的成员。

请注意,decodegroup需要decodeandrun的读取权限才能读取脚本文件的文本。

通过此设置,可以(至少在Linux上)jbloggs执行脚本但不能查看它。但请注意,此使解密过程本身不必要 - 脚本文件也可能是纯文本,因为jbloggs无法读取它。

[更新:刚刚意识到此策略无法处理加密内容本身是以#!开头的脚本的情况。哦,好吧。]

答案 2 :(得分:2)

你正在解决错误的问题。问题是您拥有不希望用户访问的数据,并且该数据存储在用户可以访问的位置。首先尝试解决用户访问多于他们需要的访问权限的问题...

如果无法保护整个脚本,则可能需要考虑保护数据。将其移至单独的位置并加密。使用只能通过特定ID(最好不是root)访问的密钥来加密数据,并编写一个小的suid程序来访问数据。在你的setuid程序中,验证谁应该运行程序,并比较调用程序的名称/校验和(你可以检查进程的命令行与调用进程的cwd一起找到路径,使用lsof或/ proc文件系统)在解密之前具有预期值。

如果需要更多,您确实需要重新评估系统上的用户状态 - 他们要么访问权限太多,要么信任度太低。 :)

答案 3 :(得分:0)

您链接的所有exec() - 系列函数都接受文件名,而不是内存地址。我根本不确定你会怎么做你想做的事情,即在解密例程中“挂钩”然后重新指向解密的脚本#!解释

这将要求您将脚本解密为临时文件,并将该文件名传递给exec()调用,但您(非常合理地)表示您不希望通过将脚本放入临时文件。

如果有可能告诉内核用内存中的现有进程替换新进程,那么你将有一条路可以遵循,但据我所知,事实并非如此。所以我不认为这样做“链式”#会很容易!以下