运行 的 Perl 脚本作为 root(通用)

Perl script to run as root (generalized)

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

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

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

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

我知道风险,我拥有这个系统,我不希望有人挡着我的路来任意照顾我。

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

你正在尝试做的事情非常困难,即使是专家也是如此。 setuid 包装器曾经与 ​​perl 一起提供,因此不再存在,因为现在不再需要它了。 Linux 并且我假设其他现代 unix 系统支持 setuid 脚本,因此您不需要 highly-fragile 和复杂的包装器。

如果你真的需要包装器,不要 re-invent 轮子;只需使用 sudo!

经过一些头脑风暴:

所有要求都可以通过以下步骤来满足。首先我们展示只完成一次的步骤。

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

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

然后,以下两个步骤对每个Perl脚本都做一次运行作为root。

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

if($>)
{
  exec { "/path-to-wrapper-program" }
       ( "/path-to-wrapper-program",[=10=],@ARGV);
}

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

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

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

...但适合自己。