每次使用特定命令时,如何强制 `sudo` 要求输入密码?

pa4*_*080 20 command-line sudo password

有没有办法强制sudo命令每次使用时都要求输入密码sudo rm /path/file

我想保护我自己免受愚蠢的错误,当我从历史中运行一些命令时,由于注意力不集中而犯下的错误。

sud*_*ace 25

如其他答案中所述,sudo可以在缓存的凭据时间戳上设置超时。这可以专门针对给定的命令使用Defaultsin 完成sudoers

Defaults!/bin/rm timestamp_timeout=0
Run Code Online (Sandbox Code Playgroud)

永远记得sudoersvisudo. 我建议使用插入文件/etc/sudoers.d而不是/etc/sudoers直接编辑。例如:

sudo visudo -f /etc/sudoers.d/always-ask-pass-for-rm
Run Code Online (Sandbox Code Playgroud)

联机帮助页sudoers

默认值

某些配置选项可以在运行时通过一行或多Default_Entry行更改其默认值。这些可能会影响任何主机上的所有用户、特定主机上的所有用户、特定用户、特定命令或以特定用户身份运行的命令。请注意,每个命令条目可能不包含命令行参数。如果您需要指定参数,请定义 aCmnd_Alias并引用它。

Default_Type ::= 'Defaults' |
                 'Defaults' '@' Host_List |
                 'Defaults' ':' User_List |
                 'Defaults' '!' Cmnd_List |
                 'Defaults' '>' Runas_List

Default_Entry ::= Default_Type Parameter_List

Parameter_List ::= Parameter |
                   Parameter ',' Parameter_List

Parameter ::= Parameter '=' Value |
              Parameter '+=' Value |
              Parameter '-=' Value |
              '!'* Parameter
Run Code Online (Sandbox Code Playgroud)

请注意,它确实说您可以影响“以特定用户身份运行的命令”,但没有提及由特定用户运行命令,因此可能无法仅对您的用户进行限制。联机帮助页中示例不包含任何内容。

  • @bac0n 我的假设是,这更多是为了阻止意外的枪对脚场景,而不是防止蓄意攻击。否则,允许任何具有 shell 访问权限的帐户使用任意“sudo”命令将是非常愚蠢的。 (7认同)
  • @Kulfy `sudo` 只运行外部命令。`sudo alias` 给出错误“sudo: alias: command not found”,这是在你*也*有一个名为 `alias` 的外部命令的异常情况之外。一些 shell,比如 Bash,有一些隐藏外部命令的内置命令。如果尝试使用 `sudo` 运行它们,那么实际上运行的是同名的外部命令。例如,`sudo kill`、`sudo printf` 和`sudo echo` 运行外部命令。请参阅 [为什么 \`sudo cd /var/named\` 不起作用?](https://askubuntu.com/q/291666),[为什么有 /bin/echo 以及我为什么要使用它?](https://askubuntu.com/q/960822)。 (2认同)

Kul*_*lfy 14

您可以使用k选项sudo来重置时间戳。

如果 sudo -k用作命令,它将立即使缓存的凭据过期/无效。

但是如果sudo -k与某些命令一起使用,例如,,sudo -k rm /some/file即使某些凭据已经缓存,shell 也会要求输入密码。在这种情况下,不会缓存新凭据。这意味着如果sudo在此之后执行另一个命令,它不会要求输入密码(如果以前缓存了凭据)。

sudo 的联机帮助页

-k [命令]

        单独使用时,sudo 的 -k(kill)选项会使用户的缓存凭据无效。下次运行 sudo 时将需要密码。此选项不需要密码,添加此选项是为了允许用户从 .logout 文件中撤销 sudo 权限。并非所有安全策略都支持凭据缓存。

        当与可能需要密码的命令或选项结合使用时,-k 选项将导致 sudo 忽略用户的缓存凭据。因此,sudo 将提示输入密码(如果安全策略需要密码)并且不会更新用户的缓存凭据。

如果你想在sudok每次都使用的情况下为特定命令询问密码,你可以在.bashrc. 例如,来自pa4080 的评论

sudo() { if [[ $@ =~ ^rm ]]; then /usr/bin/sudo -k "$@"; else /usr/bin/sudo "$@"; fi; }
Run Code Online (Sandbox Code Playgroud)

  • @bac0n,我同意这很容易规避,但我不认为这意味着它给人一种错误的安全感。这里的用例就像一个有盖子的火警;封面不是阻止恶意用户触发警报,而是阻止粗心的用户不小心靠在按钮上。故意绕过很容易这一事实是一种意图,而不是一种利用。 (3认同)