몇 가지 환경 변수를 설정한 다음 결국 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"