sudo에서 환경 변수를 어떻게 보존합니까?


47

Solaris 5.10에서 sudo 1.7.4p4 및 RHEL4 u6에서 sudo 1.6.7p5 사용 환경 변수 (예 : $ PYTHONPATH)를 보존하는 방법을 알 수 없습니다. 이 줄을 sudoers에 추가했지만 아무런 차이가 없습니다.

Defaults !env_reset

내가 잘못하고 있거나 sudo 설치가 단순히 env_reset 플래그를 존중하지 않습니까?

편집 : 적어도 Solaris에서는이 문제가 쉘에 달려 있음을 발견했습니다! 표준 루트 쉘은 Bourne입니다. sudo bash반면에 sudo ( )에서 bash를 실행하면 ! env_preset은 환경 (PATH 및 LD_LIBRARY_PATH 포함)을 보존합니다. 이것은 내가 말해야 할 혼란스러운 행동입니다.


답변:


44

sudo 및 변수에 보안 문제가 있습니다.

에서 man sudoers당신이 사용하는 것을 발견

기본값 env_reset
기본값 env_keep + = "PYTHONPATH OTHERVARIABLE YETANOTHER"

우분투에서는 sudo일부 변수를 유지합니다. sudo -i루트로 로그인 한 다음 명령을 실행하는 것과 비슷합니다. 둘 다 불편할 수 있습니다. 전자는 sudo nano myfile집에 루트 소유 파일 을 남겨두고 후자는 sudo -i nano myfile/ root / myfile을 열려고 시도합니다.


운영

sudo printenv PATH

그것이 무엇을 주는지보십시오. 여기에

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

예를 들어. 이제 sudo visudo라인을 실행 하고 추가하십시오

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

방금 전에 찾은 것으로 대체하십시오. 필요한 경우 새 경로를 추가하십시오.

라이브러리 정보 :

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

리눅스 배포판은 많은주의를 기울여야하며 PATH, 실제로 사용하기 전에주의해야한다. " ." 또는와 같은 경로 추가에 특히주의하십시오 /home/username. 안전하지 않습니다.

경로를 추가 할 때의 위험 중 하나는 경로에 파일이 실행될 가능성을 root열어서 악의적 인 소프트웨어가 악용 할 수있는 시스템 보안 창을 여는 것입니다. 다른 위험이있을 수 있습니다. 지금하고있는 일을 알아야합니다. sudo보안 조치를 무시하면 Solaris가 Windows XP만큼 안전해질 수 있습니다.


제안 해 주셔서 감사합니다. Solaris에서는 최소한 PATH 및 LD_LIBRARY_PATH를 무시하므로 env_keep은 부분적으로 만 작동하는 것으로 보입니다. 아마도 sudo는 "위험한"변수의 보존을 거부하는 설정으로 만들어 졌습니까?
aknuds1

AKNUDS와 같은 다른 통풍 장치와 함께 작동 했습니까? sudo sudo -V (예, 두 번 sudo!)를 실행하여 그 내용을 확인할 수도 있습니다. 위의 솔루션은 PYTHONPATH와 잘 작동하지만 PATH는 실제로 특별 해 보입니다. 진정한 문제는 PATH입니다. 우분투에서 그들은 의도적으로 PATH를 재설정하는 sudo를 빌드합니다.
user39559

env_keep은 나를 위해 PYTHONPATH와 HOME을 유지하므로 필터링이 명확하게 진행됩니다.
aknuds1

수정 된 솔루션에서 secure_path를 수정하여 sudo PATH를 고정 배선하는 것이 좋습니다. 나는 그것을하고 싶지 않다고 생각합니다. 우리는 아마 내 질문에 대한 대답에 가깝습니다. sudo는 env_keep으로 지정된 경우 reset_env를 무시하고 PATH 및 LD_LIBRARY_PATH와 같은 변수를 무시하도록 작성되었다고 생각합니다. sudo에서 PATH / LD_LIBRARY_PATH를 유지하지 않고 할 수 있다고 생각합니다. 큰 문제는 아니지만 왜 작동하지 않는지 아는 것은 여전히 ​​흥미 롭습니다. :)
aknuds1

sudo작가가 당신이 그것을하지 않도록주의 했기 때문에 작동하지 않습니다 . sudo가 사용하는 경로에서 악성 라이브러리가 발견되어로드되기를 원하지 않습니다. 그래서 이것이 재설정되는 이유입니다. 루트로 실행되도록 코딩 된 항목을 적절한 시스템 디렉토리에 복사하십시오.
user39559

8

sudoers다른 사람들이 말했듯이 다루는 것은주의해서 수행해야합니다.

보존하려는 특정 환경 변수가있는 간단한 경우에 대한 간단한 접근 방법은 sudo를 통해 직접 원하는 환경 변수를 전달하는 것입니다 (이는 [VAR=value]sudo cmdline 도움말에 표시됨).

하나 이상의 변수에 대해서도 설명 한이 작은 예를 참조하십시오.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

PYTHONPATH질문 의 원래 예제의 경우 다음을 사용하십시오.

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

이런 유형의 별명을 작성하는 것이 편리합니다. 이렇게 :

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'

1
별칭 sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python'
Able Mac

@AbleMac 당신이 맞아요. 그건 실수 였어. 내가 고칠 게. 감사!
Russ

3

당신의 Defaults !env_reset외모는 OK, 당신은 또한에 sudo를 호출하지 않는 가정 할 -E옵션을 선택합니다.

해당 항목을 완전히 제거해 볼 수 있습니다.

올바른 sudoers 파일을 편집하고 있는지 확인 했습니까? 나는 그것이 될 수 같은데요 /etc/sudoers또는 /usr/local/etc/sudoers설치된 방법에 따라. ?를 사용하여 편집 했습니까 visudo?

sudo를 어떻게 운영하고 있습니까? sudo python, sudo su, sudo su -, sudo -s, 뭔가 다른? 만 sudo python하고 sudo su환경을 보존하는 것입니다.

무엇합니까 env | grep PYTHONPATH말은? 아무것도 없으면 PYTHONPATH를 실행 export PYTHONPATH하여 내보내고 다시 시도하십시오.

무엇합니까 sudo env | grep PYTHONPATH말은? 예상 값을 인쇄하면 PYTHONPATH 값을 덮어 쓰는 것입니다. 루트의 .bashrc 또는 .bash_profile 또는 시스템 전체 구성 파일 일 수 있습니다.


1
sudo에 해당하는 설치 접두사를 사용하여 올바른 sudoers를 편집하고 있다고 확신합니다. sudo를 "sudo su"로 실행하고 있습니다. 며칠 안에 안타깝게도 나머지 제안에 대해 알려 드리겠습니다. 감사!
aknuds1

1
editor또는 passprompt파일 과 같은 중요하지 않은 설정을 변경 하여 올바른 파일이 있는지 확인하십시오. 또는 strace, dtrace, truss 또는 이와 유사한 것을 사용하고 어떤 파일이 열리는 지 확인하십시오.
Mikel

환경 | 사용자가 예상 값을 인쇄 할 때 grep PYTHONPATH를 지정하지만 sudo에서는 아무것도 인쇄되지 않습니다. sudoers를 편집하면 "env_keep"을 수정하여 PYTHONPATH가 유지되도록 할 수 있습니다. 그러나 env_keep은 PATH 또는 LD_LIBRARY_PATH를 유지하지 않습니다. sudo에 PATH 및 LD_LIBRARY_PATH와 같은 변수를 보존하지 않는 보안 제한이 있다고 생각합니까? 아마도 빌드 타임 설정입니까?
aknuds1

1
! env_reset은 내가 알 수있는 한 무시되지만 내일 다시 확인할 수 있습니다. env_delete가 설정되어 있지 않다고 확신하지만 확인할 수도 있습니다.
aknuds1

1
! env_reset이 무시되고 env_delete가 설정되지 않았 음을 확인했습니다.
aknuds1

-1

LD_LIBRARY_PATH에 대한 Ubuntu 설명서에 따르면 :

/etc/ld.so.conf.d/*.conf 구성 파일을 사용해야합니다

그때:

  1. 추가 ld.so로 구성 파일을 /etc/ld.so.conf.d/경로로LD_LIBRARY_PATH

  2. 다음을 사용하여 캐시를 업데이트하십시오.

    sudo ldconfig -v
    

좋지만 질문은 우분투에 관한 것이 아닙니다. 힌트 : 다음에는 질문 아래의 태그를보십시오.
DavidPostill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.