以root身份运行的Perl脚本(通用)

时间:2017-02-06 00:39:36

标签: perl setuid

我希望能够以root身份在我的系统上运行某些Perl脚本,即使" user"调用它们不是以root身份运行。

对于每个脚本,我可以编写一个C包装器,为该包装器设置setuid root;包装器会将UID更改为0,然后调用Perl脚本,该脚本本身不会设置setuid位。这样可以避免在尝试运行setuid根脚本时遇到不幸的障碍。

但我不想为每个脚本编写一个C包装器。我只想要一个C包装器来完成整个系统的工作。我也不希望任何脚本能够使用这个C包装器; C包装器本身应该能够检查Perl脚本的某些特定特性,以查看是否可以将UID更改为root。

我还没有看到任何解决此问题的Stack Overflow问题。

我知道风险,我拥有这个系统,而且我不想通过阻挡任意保护我的东西。

3 个答案:

答案 0 :(得分:5)

即使是专家,你要做的事情也很难。过去setuid包含的perl包装因此而不再存在,并且因为现在不再需要它了。 Linux和我认为其他现代的unix系统都支持setuid脚本,所以你不需要高度脆弱和复杂的包装器。

如果你真的需要一个包装纸,不要重新发明轮子;只需使用sudo

答案 1 :(得分:1)

因此,使用单个包装器,将perl脚本作为参数执行,并让C包装器将脚本的长度与脚本内容的SHA-3或SHA-2哈希值与期望值进行比较。

答案 2 :(得分:1)

经过一番头脑风暴后:

通过以下步骤可以满足所有要求。首先,我们展示仅执行一次的步骤。

第一步。由于每个应该以root身份运行的脚本必须以某种方式由用户root标记(否则,任何用户都可以这样做),系统管理员利用其特权状态来选择永远不会分配给任何人的用户ID 。在此示例中,我们使用用户ID 9999。

第二步。编译一个特定的C包装器,让目标代码运行suid root。可以找到该包装器的源代码here

然后,为root每个Perl脚本执行以下两个步骤。

第一步。使用以下代码开始每个Perl脚本。

if($>)
{
  exec { "/path-to-wrapper-program" }
       ( "/path-to-wrapper-program",$0,@ARGV);
}

第二步。以root(显然)为例,将Perl脚本的所有者更改为用户9999.这就是它。没有更新数据库或文本文件。以root身份运行Perl脚本的所有要求都与脚本本身有关。

评论第一步:我实际上将以上Perl片段放在这些行之后:

use strict;
use warnings FATAL=>"all";

......但适合自己。