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、以下の2行をコメントアウトします。コメントアウトだけではenv_reset機能しません。

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

関連情報