防止脚本执行 sudoing

防止脚本执行 sudoing

我有一个每两天运行一次实用程序的脚本。这个实用程序在我的系统上做了一些事情。它是一款非常知名、广泛使用的开源软件。

#!/usr/bin/env bash

#...do stuff here
utility

有时(但并非总是)utility需要我输入密码才能完成其任务。我没有看utilityrun,也没有看任何输出1>/dev/null。所以我希望任何尝试utility都会sudo自动失败。稍后我可以手动运行它并查看它需要超级用户访问权限来做什么。

问题是这不是我的脚本 sudoing,而是utility.utility定期更新,所以我不想编辑它。将 SUDO_ASKPASS 设置为无用的东西看起来很有希望,但它需要sudo已使用-Afrom进行了校准utilityutility手册页和在线文档也没有办法“阻止 sudo”,我也没有运气在谷歌上搜索“阻止系统范围的 sudo”。

我正在考虑使用这个fake-sudo-test.bash

#!/usr/bin/env bash

FAKE_SUDO="/usr/local/bin/sudo"
echo "echo 'no sudo for you $0' && exit 1" > $FAKE_SUDO
chmod u+x $FAKE_SUDO
sudo echo "I got superuser access"
\rm $FAKE_SUDO

这是有效的,因为我的 $PATH/usr/local/bin前面有/usr/bin.

你知道更好的方法吗?

PS: utilitybrew,来自 macOS 的自制程序包管理器,我正在使用brew upgrade有问题的。我认为让问题更通用会让它更有用。

$ sudo -V
Sudo version 1.8.17p1
    Sudoers policy plugin version 1.8.17p1
    Sudoers file grammar version 45
    Sudoers I/O plugin version 1.8.17p1

答案1

在 Linux 上,您可以通过启用该标志来禁用 setuid 位对进程以及从该进程启动的所有其他进程的影响no_new_privs(请参阅 参考资料prctl(2))。在 shell 脚本中,您可以使用包setpriv中的实用程序来执行此操作util-linux

$ setpriv --no-new-privs sudo -v
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?

因此,只要您可以忍受上面嘈杂的错误消息,修改您的脚本以运行setpriv --no-new-privs utility而不是应该可以完成这项工作。utility

(不幸的是,你提到了brew,这可能在 macOS 上不起作用......但也许它仍然对其他人有帮助。)

答案2

如果它没有与终端关联,它就不能要求输入密码:

setsid brew < /dev/null &> /dev/null

或者,如果您想捕获其输出:

setsid brew < /dev/null |& cat

也就是说,假设你有setsid,这显然可能无法在 MacOS 上使用。如果你想要但没有的话,这里有可用的实现

如果你没有sedsid但你有at:

[ -e ~/brew_$$.log ] && rm ~/brew_$$.log
at now << eof
brew > ~/brew_$$.lo_ 2>& 1 || true
mv ~/brew_$$.lo_ ~/brew_$$.log
eof
while ! [ -e ~/brew_$$.log ]; do sleep 1; done
cat ~/brew_$$.log && rm ~/brew_$$.log

brew将脱离终端运行now-ish,捕获输出并将其复制到脚本的输出流中。

答案3

  1. 把自己带出去/etc/sudoers。这将使所有 sudo 尝试失败。

    您可能需要注释掉这一行:

    %sudo   ALL=(ALL:ALL) ALL
    

    确保您有其他获取 root 权限的方法(例如 root 密码),以便可以撤消此操作。

  2. 修改此行/etc/sudoers

    Defaults        env_reset
    

    进入

    Defaults        env_reset,timestamp_timeout=-1
    

    这使得 sudo 永远不会要求输入密码。 (来源。

  3. 所有失败的 sudo 尝试都会记录到/var/log/auth.log.运行utility,并在 中查找类似这样的行auth.log

    Jul  4 12:23:07 host sudo: test_perm : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/nick ; USER=root ; COMMAND=/bin/echo
    

    (这可能会记录到 macOS 上的其他地方;我不确定。)

相关内容