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

3
我希望能够在我的系统上以root身份运行特定的Perl脚本,即使“用户”不是以root身份运行它们。
对于每个脚本,我可以编写一个C包装器,为该包装器设置setuid root;包装器将更改UID为0,然后调用Perl脚本,而Perl脚本本身不会设置setuid位。这避免了在尝试运行setuid root脚本时出现的不幸阻碍。
但我不想为每个脚本编写一个C包装器。我只想要一个C包装器来完成整个系统的工作。我也不希望任何脚本都能使用这个C包装器;C包装器本身应该能够检查Perl脚本的某些特定特征,以确定将UID更改为root是否可接受。
我还没有看到任何其他关于此问题的Stack Overflow问题。
我知道风险,我拥有该系统,并且不希望有任何东西通过阻挡我的方式来任意地照顾我。
3个回答

4
你正在尝试做的事情非常困难,即使是专家也很难。由于这个原因,以及现今不再需要,曾经与 perl 一起使用的 setuid 包装器已不再存在。Linux 和其他现代 Unix 系统支持 setuid 脚本,因此您无需使用高度脆弱和复杂的包装器。
如果你真的需要一个包装器,那么不要重复造轮子; 直接使用 sudo

1
所以使用一个包装器,将perl脚本作为参数执行,并让C包装器将脚本的长度和SHA-3或SHA-2哈希值与预期值进行比较。

这个提议的解决方案很好,因为它需要root执行某些操作来赋予建议的脚本权限,以便C包装器知道将其作为root执行。但我希望这种授权(仍然只能由root完成)可以成为Perl脚本本身的一部分,这样就不需要每次添加、删除或修改脚本时维护单独的哈希列表了。 - Bill Evans at Mariposa
然后,您希望perl脚本在没有root权限的情况下调用包装器来调用自身。但是,任何perl脚本都可以这样做,这样您基本上就没有安全性可言了。 - ysth
如果你可以花费精力对Perl脚本进行标记,那么你也可以花费精力运行一些东西来重新编译带有更新哈希的包装器。 - ysth
@BillEvansatMariposa 但是要“标记Perl脚本”,根必须在添加脚本时采取行动,否则“任何脚本”都可以通过。那么为什么不正确地识别脚本呢?更新也可以自动化,并且可能也可以由脚本本身触发。或者只需让它们在一个平面文件中被根“注册”,但这非常基础。 - zdim
1
不要忘记避免将脚本名称传递给 perl,而是使用用于读取文件的虚拟路径作为您的检查方式(例如,在 Linux 上使用 / proc /####/fd/####)。 - ikegami
显示剩余5条评论

1
在一些头脑风暴之后:
所有需求可以通过以下步骤满足。首先我们展示只需要进行一次的步骤。
第一步。由于每个应该作为根用户运行的脚本都必须以某种方式由root用户标记(否则,任何用户都可以执行此操作),系统管理员利用其特权状态选择一个将永远不会分配给任何人的用户ID。在这个例子中,我们使用用户ID 9999。
第二步。编译特定的C包装器,并让目标代码以suid root方式运行。该包装器的源代码可以在这里找到。
然后,针对每个要作为根用户运行的Perl脚本,执行以下两个步骤。
第一步。在每个Perl脚本开头加入以下代码。
if($>)
{
  exec { "/path-to-wrapper-program" }
       ( "/path-to-wrapper-program",$0,@ARGV);
}

第二步。作为root用户(显然),将Perl脚本的所有者更改为用户9999。就这样。不需要更新数据库或文本文件。运行Perl脚本的所有要求都包含在脚本本身中。

关于第一步的评论:实际上,我将上述Perl代码片段放置在以下几行代码之后:

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

...但随你便。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接