`sudo --preserve-env=MY_VAR` 与 `sudo env MY_VAR=$MY_VAR`

`sudo --preserve-env=MY_VAR` 与 `sudo env MY_VAR=$MY_VAR`

我读了man sudo以下内容:

--preserve-env

向安全策略表明用户希望保留其现有的环境变量。如果用户没有保护环境的权限,安全策略可能会返回错误。

但我想知道,即使我没有这个许可,是什么阻止我跑步

sudo env MY_VAR=$MY_VAR <cmd>

答案1

有趣的问题。首先,手动设置环境很乏味,所以--preserve-env显然更好。

对于安全方面: sudo 配置可以禁止您env使用 sudo 执行,或者更好地只允许运行不包含env.

我认为 sudoer 配置不限于完全 root 访问的有限命令列表。这不仅仅是env。为什么不做呢sudo bash -c 'export MY_VAR="$MY_VAR"; exec <cmd>'。这与您不应逃脱的受限 shell 类似。如果您不严格限制可以运行的内容,则可能存在逃生路线。

我认为 sudoer 手册页的这一部分支持这一点:

SETENV 和 NOSETENV

这些标签根据每个命令覆盖 setenv 选项的值。请注意,如果已为命令设置 SETENV,则用户可以通过 -E 选项从命令行禁用 env_reset 选项。此外,在命令行上设置的环境变量不受env_checkenv_delete或施加的限制env_keep因此,只有受信任的用户才被允许以这种方式设置变量。如果匹配的命令是 ALL,则该命令隐含 SETENV 标记;使用 NOSETENV 标签可以覆盖此默认值。

因此,如果允许用户使用所有命令,包括env他/她也可以(默认情况下)使用--preserve-env.如果配置仅允许特定命令,则默认为 NOSETENV,因此用户既不能--preserve-env也不能调用env来绕过它。

TL;DR:您不太可能缺乏使用权限--preserve-env但能够使用env.

相关内容