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


281

이것은 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가 실행하는 프로그램으로 변경되지 않은 상태로 전달됩니다.


root에 .bashrc에 PATH를 설정하는 것이 있습니까? 이것은 Linux를 사용하고 있기 때문에 sh가 실제로 배쉬라고 가정합니다.
Greg Hewgill

답변:


241

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

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

alias sudo='sudo env PATH=$PATH'

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

sudo su -p

46
이 "성가신 기능"은 트로이 목마가되는 것을 방지합니다. 특정 $ PATH를 강제하는 것은 버그가 아닌 기능이라고 말합니다. $ PATH 외부에있는 프로그램의 전체 경로를 작성하게합니다.
Chris Jester-Young

29
예, 그러나 완전히 반 직관적입니다. 아마 나쁜 사람들보다 좋은 사람들을 속일 것입니다.
Brian Armstrong

31
직관적이지 않을뿐만 아니라 잘못 기록되어 있습니다. sudo에 대한 매뉴얼 페이지를 읽고 구성을 Fedora 상자와 비교하면 경로가 유지되어야한다고 생각했습니다. 실제로, "sudo -V"는 심지어 "경로를 보존 할 환경 변수 : PATH"라고 말합니다.
Jason R. Coombs

6
짜증나. 기간. sudo를 통해 '트로이 목마를 얻을 수'있다면 그것 없이도 트로이 목마를 얻을 수 있습니다. 당연하지만 더 어렵지만 일반 사용자와 함께 잘못된 위치에서 코드를 실행하는 경우 상황이 이미 충분하지 않습니다.
gcb

7
별명을 지정하지 마십시오. Defaults env_reset에 대한 @Jacob의 답변을 참조하십시오.
greg_1_anderson

121

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

기본값 env_reset

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

기본값! secure_path

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


6
다른 방법 :Defaults env_keep = "PATH"
gcb

1
기본값! secure_path는 최신 시스템에서 훌륭하게 작동했습니다. 오래된 우분투 8.04 상자에서 기본값 env_keep = "PATH"가 트릭을 수행했습니다.
greg_1_anderson

29
secure_path를 비활성화하는 대신 추가 할 수 있습니다. 예를 들어 필자의 경우 "Defaults secure_path = / sbin : / bin : / usr / sbin : / usr / bin : / some / custom / directory"줄을 추가했습니다. 여기서 "some / custom / directory"는 필요한 경로입니다. sudo를 사용할 수있게합니다.
헥터 코레아

@HectorCorrea 솔루션이 더 나은 IMO 방법입니다.
chakrit

32

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}" 

17

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


데비안 버그 # 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를 사용하여 루트 권한으로 기본 소프트웨어가 아닌 소프트웨어를 실행할 수 없으므로 매우 짜증납니다.


13

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

sudo -i 

비 스도에 걸리는 PATH


'sudo -i'는 Ubuntu에서 도움이되지 않습니다 (Ubuntu 14.04.3 LTS를 확인했습니다). $ PATH는 여전히 sudo에 의해 수정됩니다.
Marcin Raczyński

11

실제로 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"

sudoer 계정에 액세스 한 공격자는 더 나쁜 작업을 수행 할 수 있습니다.
user508546

괜찮은 조언. 우분투 12.04 서버에서도 비슷한 설정이 기본값입니다.
Tsutomu

7

업장 저장소에서 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:~$ 

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


4
아마도 Karmic을 새로 설치 한 사람이이 특정 문제를 해결하기 위해 구성을 업데이트하는 방법을 나타 내기 위해 이것을 다시 작성하는 것이 좋습니다.
Jason R. Coombs

4
# cat .bash_profile | grep PATH
PATH=$HOME/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
export PATH

# cat /etc/sudoers | grep Defaults
Defaults    requiretty
Defaults    env_reset
Defaults    env_keep = "SOME_PARAM1 SOME_PARAM2 ... PATH"

3

/ etc / sudoers에서 "기본값 env_reset"을 주석 처리하십시오.


3

그냥 편집 env_keep에서/etc/sudoers

다음과 같이 보입니다 :

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE"

끝에 PATH를 추가하면 변경 후 다음과 같이 나타납니다.

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE PATH"

터미널을 닫았다가 다시 엽니 다.


PATH 대기 2 **? PATH에 왜 **가 필요합니까?
CMCDragonkai

@CMCDragonkai 굵은 체로 표시되었지만 (마크 다운에서) 누군가 (스택 오버플로로 인해 손가락으로 가리지 않음) 편집하여 코드로 표시했습니다.
1j01

2

Secure_path는 친구이지만 secure_path에서 자신을 면제하려면 다음을 수행하십시오.

스도 비스도

그리고 추가

기본값 exempt_group = your_goup

다수의 사용자를 면제하려면 그룹을 작성하고 모든 사용자를 그룹에 추가 한 후 exempt_group으로 사용하십시오. 더 많은 것을 위해 남자 5 명의 sudoers.


1

OpenSUSE 배포판에 대한 의견의 권장 솔루션은 다음과 같이 변경하도록 제안합니다.

Defaults env_reset

에:

Defaults !env_reset

그런 다음 필요하지 않은 다음 줄을 주석 처리하십시오.

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE    MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L    ANGUAGE LINGUAS XDG_SESSION_COOKIE"

1

/ etc / sudores 파일의 "Default env_reset"과 "Default secure_path ..."를 모두 주석 처리하십시오.


1

sudoers used 디렉토리에서 파일을 이동할 수도 있습니다.

    sudo mv $HOME/bash/script.sh /usr/sbin/ 

0

어, 경로에 무언가를 추가하지 않으면 실제로 테스트가 아닙니다.

bill @ bill-desktop : ~ $ ls -l / opt / pkg / bin
총 12
-rwxr-xr-x 1 루트 루트 28 2009-01-22 18:58 foo
bill @ bill-desktop : ~ $ 어느 foo
/ opt / pkg / bin / foo
bill @ bill-desktop : ~ $ sudo su
root @ bill-desktop : / home / bill # 어느 foo
root @ bill-desktop : / home / bill # 

0

ENV_SUPATH 및 /etc/login.defs에 정의 된 ENV_PATH의 정의에 의해 su 또는 sudo를 사용하면 PATH가 재설정됩니다.


0

$ PATH 는 환경 변수이며 $ PATH 값은 다른 사용자마다 다를 수 있습니다.

시스템에 로그인 할 때 프로파일 설정이 $ PATH 값을 결정합니다 .

이제 살펴 보겠습니다 :-

User       |        Value of $PATH
--------------------------
root                /var/www
user1               /var/www/user1
user2               /var/www/html/private

다른 사용자에 대한 $ PATH 값이라고 가정하십시오. 이제 sudo 명령을 실행할 때 실제로 루트 사용자는 해당 명령을 실행합니다.

터미널에서 다음 명령을 실행하여 확인할 수 있습니다.

user@localhost$ whoami
username
user@localhost$ sudo whoami
root
user@localhost$ 

이것이 이유 다. 나는 당신에게 분명하다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.