如何在 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"

相關內容