여러 환경 변수를 설정한 다음 마지막으로 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"