我不喜欢输入密码须藤所以我禁用它
%sudo ALL=(ALL) NOPASSWD: ALL
现在我有一个不好的副作用,我运行的任何 shell 脚本都可以静默执行须藤代表我。
最典型的用例是打算将实验性的东西安装到 ${HOME}/local 并忘记配置字首。
问题- sudo 是否有一种开箱即用的方式来阻止非交互式调用(来自脚本)?在架构Linux, 再具体一点。
答案1
你不能做你想做的事,因为“脚本化 sudo”和“交互式 sudo”并不矛盾。脚本可以在终端中运行 sudo。可以在终端中以完全自动化的方式运行命令的一些工具示例包括script
、、、、等expect
。screen
tmux
即使 sudo 可以以某种方式检测到您“直接”运行它(情况并非如此,因为您是与键盘和鼠标等外围设备交互,而不是与进程交互),它也无法保护您免受流氓脚本的侵害。例如,流氓脚本可能会在您的帐户上植入虚假命令,以便您下次运行时sudo
它会调用一些包装器,该包装器会离散地利用您的访问权限。
无论如何,您所保护的威胁并不是特别相关。
如果您不相信某些软件不会做有问题的事情,例如窃取您的社交媒体帐户,请不要在您的帐户上运行它。至少在不同的帐户上运行它(当然,这不是 sudoer),没有 GUI 访问权限。为了更好地隔离,请在虚拟机中运行它。 (这仍然不完美,它可以安全地防御普通恶意软件,但如果政府针对您则不一定。)
答案2
此外吉尔斯的回答Can I block non-interactive sudo invocation?
根据您的问题的方面,我建议针对您的情况的这一特定要素采取解决方法:
我不喜欢输入 sudo 密码,所以我禁用了它
和
现在我有一个不好的副作用,我运行的任何 shell 脚本都可以代表我静默执行 sudo。
如果您的情况是,您通常会执行sudo
一堆不同的命令,但随后您发现自己正在执行脚本,这些脚本会默默地执行 sudo ,而不会提示您输入密码,从而意识到根级别的事情正在发生,您可以:
- 取消 NOPASSWD 选项
- 将时间戳超时时间延长到库存 5 分钟以上
- 在运行不受信任的脚本之前杀死 sudo 时间戳
您已经知道如何编辑该NOPASSWD
选项的 sudoers。
为了延长timestamp_timeout
在 sudoers 文件中,将其设置为非常高的值或负值。该参数的手册页中的相关片段:
时间戳超时
sudo 再次请求密码之前可以经过的分钟数。
默认值为 5。
如果设置为小于 0 的值,则用户的时间戳在系统重新启动之前不会过期。
当您发现自己要执行一个不确定的脚本时,只需运行sudo -k
“杀死”时间戳:
-k
当不使用命令使用时,会使用户的缓存凭据无效。换句话说,下次运行 sudo 时将需要密码。
如果您运行脚本并发现 sudo 提示您输入密码,您就会知道它sudo
已被调用,并且可以根据需要中断该脚本。
顺便说一句,我建议设置pass提示参数将文本包含sudo
在其中,例如:
Defaults passprompt="[sudo] password for %u:"
...因此,如果/何时 sudo 提示您输入密码(相对于任何其他工具),这是显而易见的。