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"

関連情報