[path] sudo가 PATH를 변경하는 이유는 무엇입니까?

이것은 PATHsudo가없는 변수입니다.

$ echo 'echo $PATH' | sh
/opt/local/ruby/bin:/usr/bin:/bin

이것은 PATHsudo를 가진 변수입니다 :

$ echo 'echo $PATH' | sudo sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

내가 알 수있는 한, sudo그대로 PATH두어야합니다. 무슨 일이야? 이것을 어떻게 변경합니까? (이것은 우분투 8.04에 있습니다).

업데이트 : 내가 아는 한, 어떤 스크립트도 루트 변경 PATH으로 시작되지 않았습니다.

보낸 사람 man sudo:

명령 스푸핑을 방지하기 위해 sudo는 사용자의 PATH에서 명령을 검색 할 때“. ”및“ ”(현재 디렉토리를 나타냄)를 마지막으로 확인합니다 (하나 또는 둘 다가 PATH에있는 경우). 그러나 실제 PATH 환경 변수는 수정되지 않으며 sudo가 실행하는 프로그램으로 변경되지 않은 상태로 전달됩니다.



답변

이것은 성가신 기능 많은 배포판에서 sudo 의 기능 .

우분투 에서이 “문제”를 해결하려면 ~ / .bashrc에서 다음을 수행하십시오.

alias sudo='sudo env PATH=$PATH'

위의 $ PATH 자체를 재설정하지 않는 명령에서 작동합니다. 그러나`su ‘는 $ PATH를 재설정하므로 -p를 사용하지 말아야한다. IE :

sudo su -p


답변

다른 사람이 이것을 가로 질러 실행하고 모든 사용자에 대해 모든 경로 변수 변경을 비활성화하려는 경우.
다음 명령을 사용하여 sudoers 파일에 액세스하십시오 visudo.. 어딘가에 다음 줄이 표시되어야합니다.

기본값 env_reset

다음 줄에 다음을 추가해야합니다.

기본값! secure_path

secure_path는 기본적으로 사용됩니다. 이 옵션은 sudoing 할 때 $ PATH를 만들 것을 지정합니다. 느낌표는 기능을 비활성화합니다.


답변

PATH 환경 변수이며 기본적으로 sudo에 의해 재설정됩니다.

이를 위해서는 특별한 권한이 필요합니다.

에서 man sudo

       -E -E (환경 보존) 옵션은 env_reset를 대체합니다.
           sudoers (5)의 옵션). 일치하는 경우에만 사용할 수 있습니다.
           ing 명령에 SETENV 태그가 있거나 setenv 옵션이 sudo-
           ers (5).
       명령에 설정할 환경 변수도 전달 될 수 있습니다VAR = value
       형식의 명령 행 ( 예 :
        LD_LIBRARY_PATH = / usr / local / pkg / lib) 명령에 전달 된 변수
       일반 환경 변수와 동일한 제한이 적용됩니다.
       한 가지 중요한 예외가 있습니다. setenv 옵션이 설정된 경우
       sudoers, 실행할 명령에 SETENV 태그가 설정되었거나
       matched가 ALL이면 사용자는 과도하게 변수를 설정할 수 있습니다.
       입찰했다. 자세한 내용은 sudoers (5)를 참조하십시오.

사용 예 :

cat >> test.sh
env | grep "MYEXAMPLE" ;
^D
sh test.sh 
MYEXAMPLE=1 sh test.sh
# MYEXAMPLE=1
MYEXAMPLE=1 sudo sh test.sh 
MYEXAMPLE=1 sudo MYEXAMPLE=2 sh test.sh 
# MYEXAMPLE=2

최신 정보

남자 5 명 sudoers :

     env_reset 설정되면 sudo는 다음을 포함하도록 환경을 재설정합니다.
                       LOGNAME, SHELL, USER, USERNAME 및 SUDO_ * 변수
                       능력. 발신자 환경의 모든 변수
                       env_keep과 일치하면 env_check 목록이 추가됩니다.
                       env_keep 및 env_check의 기본 내용
                       루트로 sudo를 실행할 때 목록이 표시됩니다.
                       -V 옵션. sudo가 SECURE_PATH로 컴파일 된 경우
                       옵션은 해당 값이 PATH 환경에 사용됩니다.
                       변하기 쉬운. 이 플래그는 기본적으로 켜져 있습니다.

따라서 이것이 컴파일되어 있는지 확인해야 할 수도 있습니다.

젠투 에서는 기본적으로

# ( From the build Script )
....
ROOTPATH=$(cleanpath /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin${ROOTPATH:+:${ROOTPATH}})
....
econf --with-secure-path="${ROOTPATH}" 


답변

이 버그가 꽤 오랫동안 존재 한 것 같습니다! 다음은 도움이 될만한 버그 참조입니다 (구독, 투표, 힌트, 힌트 …).


데비안 버그 # 85123 ( “sudo : SECURE_PATH는 여전히 재정의 될 수 없습니다”) (2001 년부터)

이 버전의 sudo에는 여전히 Bug # 20996이있는 것 같습니다. 변경 로그에 따르면 런타임에 재정의 할 수 있지만 아직 방법을 찾지 못했습니다.

그들은 sudoers 파일에 다음과 같은 것을 넣는 것을 언급합니다.

Defaults secure_path="/bin:/usr/bin:/usr/local/bin"

그러나 적어도 우분투 8.10에서 그렇게하면이 오류가 발생합니다.

visudo: unknown defaults entry `secure_path' referenced near line 10

우분투 버그 # 50797 ( “with-secure-path로 빌드 된 sudo는 문제가 있습니다”)

설상가상으로 sudoers 파일에서 secure_path를 다시 지정할 수는 없습니다. 예를 들어, 사용자가 / opt 아래의 항목에 쉽게 액세스 할 수 있도록하려면 sudo를 다시 컴파일해야합니다.


예. 다시 컴파일 할 필요없이이 “기능”을 재정의하는 방법 이 필요 합니다. 환경에 가장 적합한 것이 무엇인지 알려주고이를 해제 할 수있는 방법을 제공하지 않는 것보다 보안 문제는 더 나쁘지 않습니다.


이것은 정말로 성가신 일입니다. 보안상의 이유로 기본적으로 현재 동작을 유지하는 것이 현명 할 수 있지만 소스 코드에서 다시 컴파일하는 것 이외의 방법으로 재정의하는 방법이 있어야합니다! 많은 사람들이 PATH 상속이 필요합니다. 왜 관리자가 조사하지 않는지 궁금합니다. 수용 가능한 해결책을 찾기가 쉽습니다.


나는 이것을 다음과 같이 해결했다.

mv /usr/bin/sudo /usr/bin/sudo.orig

그런 다음 다음을 포함하는 / usr / bin / sudo 파일을 작성하십시오.

#!/bin/bash
/usr/bin/sudo.orig env PATH=$PATH "$@"

일반 sudo는 비보안 경로 sudo와 동일하게 작동합니다.


우분투 버그 # 192651 ( “스도 경로는 항상 재설정됩니다”)

이 버그의 복제본이 원래 2006 년 7 월에 제출되었다는 점을 고려할 때, 효과가없는 env_keep이 얼마나 오래 작동했는지는 확실하지 않습니다. 사용자가 위에 나열된 것과 같은 트릭을 사용하도록 강요하더라도 sudo 및 sudoers의 매뉴얼 페이지에는 PATH 수정 옵션이 사실상 중복된다는 사실이 반영되어야합니다.

실제 실행을 반영하도록 문서를 수정하는 것은 불안정하지 않으며 매우 유용합니다.


우분투 버그 # 226595 ( “경로 유지 / 지정 불가능”)

PATH에 추가 비표준 바이너리 폴더로 sudo를 실행할 수 있어야합니다. / etc / environment에 이미 요구 사항을 추가 한 후 sudo에서 명령을 실행할 때 누락 된 명령에 대한 오류가 발생했을 때 놀랐습니다 …..

나는 이것을 성공적으로 해결하기 위해 다음을 시도했다.

  1. sudo -E“옵션을 사용하면 작동하지 않습니다. 기존 경로는 여전히 sudo에 의해 재설정되었습니다.

  2. / etc / sudoers에서 ” Defaults env_reset“를 ” Defaults !env_reset“로 변경해 도 작동하지 않습니다 (sudo -E와 결합 된 경우에도)

  3. / etc / sudoers에서 주석 해제 env_reset(예 : ” #Defaults env_reset“)도 작동하지 않았습니다.

  4. Defaults env_keep += "PATH"/ etc / sudoers에 ‘ ‘를 추가 해도 작동하지 않았습니다.

man 문서에도 불구하고 sudo는 PATH와 관련하여 완전히 하드 코딩되어 있으며 사용자 PATH 유지와 관련된 유연성을 허용하지 않습니다. sudo를 사용하여 루트 권한으로 기본 소프트웨어가 아닌 소프트웨어를 실행할 수 없으므로 매우 짜증납니다.


답변

이것은 나를 위해 일하는 것 같았다

sudo -i

비 스도에 걸리는 PATH


답변

실제로 sudo가 PATH를 재설정하는 것이 바람직하다고 생각합니다. 그렇지 않으면 사용자 계정을 손상시킨 공격자가 백도어 버전의 모든 도구를 사용자의 PATH에 넣을 수 있으며 sudo를 사용할 때 실행됩니다.

(물론 PATH를 재설정하는 것은 이러한 종류의 문제에 대한 완벽한 해결책은 아니지만 도움이됩니다)

이것은 실제로 사용하면 어떻게됩니까

Defaults env_reset

에서의 / etc /의 sudoers 사용하지 않고 exempt_groupenv_keep.

또한 루트에만 유용한 디렉토리 (예 : /sbin/usr/sbin)를 사용자 경로에 추가하지 않고 sudo 경로에 추가 할 수 있기 때문에 편리 합니다. sudo가 사용할 경로를 지정하려면 다음을 수행하십시오.

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


답변

업장 저장소에서 sudo를 사용하여 작동합니다. 내 구성의 세부 사항 :

root@sphinx:~# cat /etc/sudoers | grep -v -e '^$' -e '^#'
Defaults    env_reset
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/grub-1.96/sbin:/opt/grub-1.96/bin"
root    ALL=(ALL) ALL
%admin ALL=(ALL) ALL
root@sphinx:~# cat /etc/apt/sources.list
deb http://au.archive.ubuntu.com/ubuntu/ jaunty main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ jaunty main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted universe

deb http://security.ubuntu.com/ubuntu jaunty-security main restricted universe
deb-src http://security.ubuntu.com/ubuntu jaunty-security main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ karmic main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ karmic main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe

deb http://security.ubuntu.com/ubuntu karmic-security main restricted universe
deb-src http://security.ubuntu.com/ubuntu karmic-security main restricted universe
root@sphinx:~#

root@sphinx:~# cat /etc/apt/preferences
Package: sudo
Pin: release a=karmic-security
Pin-Priority: 990

Package: sudo
Pin: release a=karmic-updates
Pin-Priority: 960

Package: sudo
Pin: release a=karmic
Pin-Priority: 930

Package: *
Pin: release a=jaunty-security
Pin-Priority: 900

Package: *
Pin: release a=jaunty-updates
Pin-Priority: 700

Package: *
Pin: release a=jaunty
Pin-Priority: 500

Package: *
Pin: release a=karmic-security
Pin-Priority: 450

Package: *
Pin: release a=karmic-updates
Pin-Priority: 250

Package: *
Pin: release a=karmic
Pin-Priority: 50
root@sphinx:~# apt-cache policy sudo
sudo:
  Installed: 1.7.0-1ubuntu2
  Candidate: 1.7.0-1ubuntu2
  Package pin: 1.7.0-1ubuntu2
  Version table:
 *** 1.7.0-1ubuntu2 930
         50 http://au.archive.ubuntu.com karmic/main Packages
        100 /var/lib/dpkg/status
     1.6.9p17-1ubuntu3 930
        500 http://au.archive.ubuntu.com jaunty/main Packages
root@sphinx:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/grub-1.96/sbin:/opt/grub-1.96/bin
root@sphinx:~# exit
exit
abolte@sphinx:~$ echo $PATH
/home/abolte/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/grub-1.96/sbin:/opt/grub-1.96/bin:/opt/chromium-17593:/opt/grub-1.96/sbin:/opt/grub-1.96/bin:/opt/xpra-0.0.6/bin
abolte@sphinx:~$

해킹을 사용하지 않고 마침내이 문제를 해결하는 것이 좋습니다.