允许用户仅运行具有 root 权限/特权的特定二进制文件

允许用户仅运行具有 root 权限/特权的特定二进制文件

我想允许特定用户只能使用 sudo /sbin/iptables

我有一个配置 iptables 的 bash 脚本。问题是仅配置/sbin/iptables为 sudoable 是不够的 - 脚本本身也必须是 sudoable。

问题是该文件可以由用户编辑(他可以更改其中的配置),从而使他能够以 root 身份运行任何命令。

解决这个问题的正确方法是什么?

答案1

我可以看到两种方法:

  1. 允许用户不受限制/sbin/iptables地使用sudo(这是危险的,这意味着您以某种方式信任该用户),并以用户的权限运行脚本。该脚本将在sudo每次/sbin/iptables需要时调用。这是假设脚本执行速度很快,因为最终需要定期输入一些密码。

    • 优点:您不需要对脚本有任何信任。
    • 缺点:正如已经提到的,让用户/sbin/iptables不受限制地使用是有危险的。
  2. 允许用户仅通过调用脚本sudo

    • 优点:使用/sbin/iptables受脚本限制。
    • 缺点:剧本必须完美无缺。

关于你提到的问题:如果脚本的所有者是比方说root并且具有通常的权限:rwxr-xr-x,其他用户无法修改它,他们只能执行它(最终通过sudo获得更多权限)。

对于解决方案 2,对于 shell 脚本(与更强大的二进制文件/程序相比),请注意环境变量和可能修改脚本执行的几个外部因素。检查您的 sudo 配置是否正确重置了每个潜在有害变量的定义。


1.其实如果需要的话sudo可以配置NOPASSWD

答案2

来自维基百科:

setuid 和 setgid(分别是“执行时设置用户 ID”和“执行时设置组 ID”的缩写)[1] 是 Unix 访问权限标志,允许用户以可执行文件所有者或组的权限运行可执行文件。它们通常用于允许计算机系统上的用户以临时提升的权限运行程序,以执行特定任务。虽然提供的假定用户 ID 或组 ID 权限并不总是提升,但至少它们是特定的。

尝试这样的事情

stefan@linux-ulsk:/usr/bin> zypper up
Root privileges are required for updating packages.
linux-ulsk:~ # whereis zypper
zypper: /usr/bin/zypper /usr/bin/X11/zypper /usr/include/zypper /usr/share/zypper /usr/share/man/man8/zypper.8.gz
linux-ulsk:~ # chmod u+s /usr/bin/zypper
linux-ulsk:~ # exit
stefan@linux-ulsk:/usr/bin> zypper up
Retrieving repository ...

我可以在不成为 root 的情况下启动 zypper,这是我以前做不到的。

小心 setuid 和 setgid!部分书籍引用:

切勿授予 shell 脚本 setuid 权限。破坏它们的几种技术是众所周知的。

答案3

您可以尝试更改文件的组所有者并将您的用户添加到该组。然后您可以chmod为该文件分配组权限,这将允许您执行您需要的操作。

这是一个不稳定的解决方案,但它会起作用。

答案4

确保您(或适当的帐户)是该文件的所有者,并使该文件只能由您写入,而不能由组写入。因此,假设您的用户位于正确的组中,您的权限将类似于 750。

如果他们可以执行但不能写入文件,那么您可以安全地将该命令添加到他们的 sudo 列表中。

相关内容