sudo의 특정 명령에 대해 *모든* 환경 변수를 어떻게 유지할 수 있나요?

sudo의 특정 명령에 대해 *모든* 환경 변수를 어떻게 유지할 수 있나요?

여러 환경 변수를 설정한 다음 마지막으로 sudo를 사용하여 다른 스크립트를 호출하는 스크립트가 있습니다.

sudo로 실행되는 스크립트는 해당 변수를 선택할 수 있어야 하며, 해당 변수가 무엇인지 항상 확신할 수는 없습니다.

명령이 호출자 env vars에 대한 완전한 액세스를 허용하도록 이 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"

관련 정보