为当前 shell 禁用我自己的 sudo?

为当前 shell 禁用我自己的 sudo?

是否可以防止sudo无密码获取root仅在当前会话中(例如bash shell进程?)

我注意到 ruby​​ 在没有询问的情况下bundle秘密地使用了我的sudo权力来写入系统目录。无论如何,也许我对这个美妙工具的了解还不够,但是有没有办法暂时撤回 sudo 的祝福而无需重新配置/etc/sudoers*

编辑:我目前已NOPASSWD启用该sudo组,我是该组的成员。我宁愿让当前进程无法sudo(例如通过使用类似的东西newgrp)也不愿放弃 NOPASSWD。

答案1

$ 别名 sudo="echo sudon"

$ sudo su - 根

sudon 不要su - root

这只会在调用 sudo 的地方破坏它,除非它调用像 /usr/bin/sudo 这样的完整路径

答案2

您的想法可以通过一个小的“set-userID-root”程序轻松实现,该程序只会setgroups(2)对除该组之外的所有当前组(根据getgroups(2))执行 a sudo,从而有效地删除它。 set-userID-root 是必需的,因为setgroups(2)这是一项特权操作。

在 Linux 上,它甚至可以更简单,因为您可以利用capabilities(7)因此使可执行程序setcap(8)成为 -edCAP_SETGID而不是 set-userID-root。那时,这样的专用程序只需要capset(2)自身具备该功能即可执行setgroups(2)

另一方面, 尽管,谨防无意中删除/更改组成员身份,因为作为一个团体的成员也习惯于减少通过特意放置的 ACL 访问文件和目录等权限。

也就是说,通过利用(Linux 特定的)setpriv(1)命令(如果您的系统上可用),您可以利用作为 shell 函数制作的概念验证,如下所示,我在其中使用sudo自身(假设您是NOPASSWD) “set-userID-root 启用程序”:

# NOTE: this one uses Bash facilities
dropgrp() {
    local groups grp="${1:?Specify group to drop}" IFS=; shift
    IFS=: read -ra grent < <(getent group "$grp")
    groups=(${GROUPS[@]/${grent[2]}})
    IFS=,; sudo setpriv --reuid "$EUID" --regid "$GROUPS" --groups "${groups[*]}" "$@"
}

然后您将运行$ dropgrp sudo bundlesudo其中的 指的是组名称,而不是命令),当该bundle程序调用sudo(命令)时,它将要求您输入密码才能继续。

相关内容