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"

관련 정보