如何在 sudo 中保留特定命令的*所有*环境变量?

如何在 sudo 中保留特定命令的*所有*环境变量?

我有一个脚本设置几个环境变量,然后最终使用 sudo 调用另一个脚本。

使用 sudo 运行的脚本必须能够获取这些变量,并且我并不总是确定这些变量是什么。

有没有办法配置此 sudoers 条目以允许命令完全访问调用者环境变量?

%deploy ALL=NOPASSWD: /bin/build.sh

当我从脚本运行 sudo 命令时:

sudo -E build.sh "$@"

我得到:

sudo: sorry, you are not allowed to preserve the environment

谷歌搜索我只找到了保留特定变量的方法,而不仅仅是所有变量。

答案1

在测试了第一个答案并仍然得到 后sudo: sorry, you are not allowed to preserve the environment,我决定四处寻找更好的解决方案。

经过一番测试后,我发现重要的选项是setenv.

Defaults!/bin/build.sh setenv

为了使其更安全,我们可以添加一些设置:

Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11/bin"
Defaults!/bin/build.sh setenv,env_reset,env_delete+=PATH,env_delete+=LD_PRELOAD,env_delete+=LD_LIBRARY_PATH,env_delete+=SSH_AUTH_SOCK,env_delete+=PYTHONPATH,env_delete+=PERL5LIB
%deploy  ALL=(ALL) NOPASSWD: /bin/build.sh *

答案2

如果您想允许deploy组中的用户使用几乎任何环境变量运行任何命令:

Defaults:%deploy !env_reset,env_delete-=PYTHONPATH,env_delete-=PERL5LIB
%deploy ALL = (ALL) ALL

运行sudo -V看看哪些变量被删除了。

如果允许用户保留所有环境变量,那么限制命令就没有什么意义,因为这可能允许用户通过某些变量运行任意代码。

如果您仔细检查了脚本并且确定拥有需要删除的环境变量的详尽列表,则可以指定应删除这些环境变量并保留所有其他环境变量。

Defaults!/bin/build.sh !env_reset,env_delete+=DANGEROUS_VAR
%deploy ALL = (ALL) /bin/build.sh

答案3

运行sudo visudo并注释掉如下所示的两行。只注释掉env_reset是不行的

#Defaults       env_reset
Defaults        mail_badpass
#Defaults       secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH"

相关内容