是否可以防止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 bundle
(sudo
其中的 指的是组名称,而不是命令),当该bundle
程序调用sudo
(命令)时,它将要求您输入密码才能继续。