我想允许特定用户只能使用 sudo /sbin/iptables
。
我有一个配置 iptables 的 bash 脚本。问题是仅配置/sbin/iptables
为 sudoable 是不够的 - 脚本本身也必须是 sudoable。
问题是该文件可以由用户编辑(他可以更改其中的配置),从而使他能够以 root 身份运行任何命令。
解决这个问题的正确方法是什么?
答案1
我可以看到两种方法:
允许用户不受限制
/sbin/iptables
地使用sudo
(这是危险的,这意味着您以某种方式信任该用户),并以用户的权限运行脚本。该脚本将在sudo
每次/sbin/iptables
需要时调用。这是假设脚本执行速度很快,因为最终需要定期输入一些密码。- 优点:您不需要对脚本有任何信任。
- 缺点:正如已经提到的,让用户
/sbin/iptables
不受限制地使用是有危险的。
允许用户仅通过调用脚本
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 列表中。