我希望能够以root身份在我的系统上运行某些Perl脚本,即使" user"调用它们不是以root身份运行。
对于每个脚本,我可以编写一个C包装器,为该包装器设置setuid root;包装器会将UID更改为0,然后调用Perl脚本,该脚本本身不会设置setuid位。这样可以避免在尝试运行setuid根脚本时遇到不幸的障碍。
但我不想为每个脚本编写一个C包装器。我只想要一个C包装器来完成整个系统的工作。我也不希望任何脚本能够使用这个C包装器; C包装器本身应该能够检查Perl脚本的某些特定特性,以查看是否可以将UID更改为root。
我还没有看到任何解决此问题的Stack Overflow问题。
我知道风险,我拥有这个系统,而且我不想通过阻挡任意保护我的东西。
答案 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";
......但适合自己。