Почему sudo меняет путь?


281

Это PATHпеременная без sudo:

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

Это PATHпеременная с sudo:

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

Насколько я могу судить, sudoпредполагается оставить PATHнетронутым. В чем дело? Как мне это изменить? (Это на Ubuntu 8.04).

ОБНОВЛЕНИЕ: насколько я вижу, ни один из сценариев не запускался как изменение root PATHникоим образом.

От man sudo:

Чтобы предотвратить подделку команд, sudo проверяет ``. '' И `` '' (оба обозначают текущий каталог) последними при поиске команды в ПУТИ пользователя (если один или оба находятся в ПУТИ). Однако обратите внимание, что фактическая переменная среды PATH не изменяется и передается без изменений в программу, которая выполняется sudo.


Есть ли у root что-нибудь, что устанавливает PATH в .bashrc? Это предполагает, что, поскольку вы работаете в Linux, sh на самом деле bash.
Грег Хьюгилл

Ответы:


241

Это раздражающая функция особенность sudo во многих дистрибутивах.

Чтобы обойти эту «проблему» в Ubuntu, я делаю следующее в моем ~ / .bashrc

alias sudo='sudo env PATH=$PATH'

Обратите внимание, что вышесказанное будет работать для команд, которые сами не сбрасывают $ PATH. Однако `su 'сбрасывает это $ PATH, поэтому вы должны использовать -p, чтобы запретить. IE:

sudo su -p

46
Эта «раздражающая функция» предотвращает попадание троянских программ. Я говорю, что форсирование определенного $ PATH - это особенность, а не ошибка - она ​​заставляет вас написать полный путь к программе, которая находится за пределами $ PATH.
Крис Джестер-Янг

29
Да, но это абсолютно нелогично. Наверное, это обманывает хороших парней больше, чем плохих.
Брайан Армстронг

31
Это не только нелогично, но и неправильно задокументировано. Читая справочные страницы по sudo и сравнивая конфигурацию с блоком Fedora, я подумал, что путь должен быть сохранен. Действительно, sudo -V даже говорит: «Переменные среды для сохранения: PATH».
Джейсон Р. Кумбс

6
это раздражает. период. если бы он мог «заполучить вас трояном» с помощью sudo, он мог бы сделать вас трояном без него. Конечно, сложнее, но если вы запускаете код не из того места, даже со своим обычным пользователем, то все уже достаточно плохо.
ГКБ

7
Не псевдоним sudo см. ответ @Jacob о настройках по умолчанию env_reset.
greg_1_anderson

121

В случае, если кто-то еще сталкивается с этим и хочет отключить изменение всех переменных пути для всех пользователей.
Доступ к файл sudoers, используя команду: visudo. Вы должны увидеть где-то следующую строку:

По умолчанию env_reset

который вы должны добавить следующее в следующей строке

По умолчанию! Secure_path

Secure_path включен по умолчанию. Эта опция указывает, что делать $ PATH при sudoing. Восклицательный знак отключает эту функцию.


6
по-другому:Defaults env_keep = "PATH"
gcb

1
По умолчанию! Secure_path отлично работал для меня на современных системах; на старой версии Ubuntu 8.04, по умолчанию env_keep = "PATH" сделали свое дело.
greg_1_anderson

29
Вместо отключения secure_path вы можете добавить к нему. Например, в моем случае я добавил строку «По умолчанию secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / some / custom / directory», где «some / custom / directory» - это нужный мне путь сделать доступным для sudo.
Гектор Корреа

Решение @HectorCorrea - лучший способ IMO.
Чакрит

32

PATH является переменной окружения, и поэтому по умолчанию сбрасывается с помощью sudo.

Вам нужно специальные разрешения, чтобы иметь возможность сделать это.

Из man sudo

       -E Опция -E (сохранить среду) переопределит env_reset
           вариант в sudoers (5)). Доступно только когда
           Команда ing имеет тег SETENV или опция setenv установлена ​​в sudo-
           ERS (5).
       Переменные среды, которые должны быть установлены для команды, также могут быть переданы
       командная строка в виде VAR = значение, например,
        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 будет сбрасывать среду, чтобы она содержала только
                       имя пользователя, SHELL, USER, USERNAME и SUDO_ *
                       ляющим. Любые переменные в среде вызывающего
                       соответствовать списки env_keep и env_check затем добавляются.
                       Содержимое по умолчанию для env_keep и env_check
                       списки отображаются, когда sudo запускается пользователем root с
                       -V вариант. Если sudo был скомпилирован с SECURE_PATH
                       опция, его значение будет использоваться для среды PATH
                       переменная. Этот флаг включен по умолчанию.

Поэтому, возможно, потребуется проверить, что это / не скомпилировано в.

Это по умолчанию в Gentoo

# ( 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

Похоже, эта ошибка существует уже довольно давно! Вот некоторые ссылки на ошибки, которые могут оказаться полезными (и вы можете подписаться на / голосовать, подсказка, подсказка ...):


Ошибка Debian # 85123 («sudo: SECURE_PATH все еще нельзя переопределить») (с 2001 года!)

Кажется, что ошибка # 20996 все еще присутствует в этой версии sudo. Список изменений говорит, что он может быть переопределен во время выполнения, но я еще не выяснил, как это сделать.

Они упоминают что-то вроде этого в вашем файле sudoers:

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

но когда я делаю это в Ubuntu 8.10 по крайней мере, это дает мне эту ошибку:

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

Ошибка Ubuntu # 50797 («sudo, созданный с помощью --with-secure-path, проблематичен»)

Что еще хуже, насколько я могу судить, невозможно переопределить secure_path в файле sudoers. Так что, если, например, вы хотите предложить своим пользователям легкий доступ к чему-либо в / 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 без безопасного пути


Ubuntu bug # 192651 («путь sudo всегда сбрасывается»)

Учитывая, что дубликат этой ошибки был первоначально подан в июле 2006 года, мне не ясно, как долго неэффективный env_keep работал. Какими бы ни были преимущества принуждения пользователей к использованию уловок, подобных перечисленным выше, безусловно, страницы руководства для sudo и sudoers должны отражать тот факт, что варианты изменения PATH фактически избыточны.

Изменение документации для отражения фактического выполнения не является дестабилизирующим и очень полезным.


Ошибка Ubuntu # 226595 («невозможно сохранить / указать путь»)

Мне нужно иметь возможность запускать sudo с дополнительными не стандартными двоичными папками в PATH. Уже добавив свои требования в / etc / environment, я удивился, когда получил ошибки об отсутствующих командах при запуске их под sudo .....

Я попытался следующее, чтобы исправить это без успеха:

  1. Использование sudo -Eопции « » - не сработало. Мой существующий PATH все еще был сброшен sudo

  2. Изменение " Defaults env_reset" на " Defaults !env_reset" в / etc / sudoers - также не работает (даже в сочетании с sudo -E)

  3. Раскомментирование env_reset(например, " #Defaults env_reset") в / etc / sudoers - также не сработало.

  4. Добавление ' Defaults env_keep += "PATH"' в / etc / sudoers - тоже не сработало.

Ясно, что, несмотря на документацию man, sudo полностью жестко запрограммирован в отношении PATH и не дает никакой гибкости в отношении сохранения пользовательского PATH. Очень раздражает, так как я не могу запустить нестандартное программное обеспечение с правами root с помощью sudo.


13

Казалось, это работает для меня

sudo -i 

который берет на себя не судо PATH


sudo -i не помогает в Ubuntu (я проверил Ubuntu 14.04.3 LTS). $ PATH по-прежнему изменяется sudo.
Марчин Рачиньски,

11

Я думаю, что на самом деле желательно, чтобы sudo сбрасывал PATH: в противном случае злоумышленник, взломавший вашу учетную запись, мог бы поместить версии всех видов инструментов с резервным копированием в PATH ваших пользователей, и они будут выполняться при использовании sudo.

(конечно, сброс sudo в PATH не является полным решением проблем такого рода, но это помогает)

Это действительно то, что происходит, когда вы используете

Defaults env_reset

в / etc / sudoers без использования exempt_groupили env_keep.

Это также удобно, поскольку вы можете добавлять каталоги, которые полезны только для пользователя root (например, /sbinи /usr/sbin), в путь sudo, не добавляя их в пути ваших пользователей. Чтобы указать путь, который будет использоваться sudo:

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

злоумышленник, получивший доступ к учетной записи sudoer, может совершать еще худшие вещи.
user508546

Достойный совет. На сервере Ubuntu 12.04 аналогичная настройка используется по умолчанию.
Цутому

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 может обновить свою конфигурацию для решения этой конкретной проблемы.
Джейсон Р. Кумбс

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

Просто закомментируйте «значения по умолчанию env_reset» в / etc / sudoers


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, просто сделайте

sudo visudo

И добавить

По умолчанию 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

закомментируйте оба "Default env_reset" и "Default secure_path ..." в файле / etc / sudores.


1

Вы также можете переместить ваш файл в каталог sudoers:

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

0

Э-э, это не совсем тест, если вы не добавили что-то на свой путь:

bill @ bill-desktop: ~ $ ls -l / opt / pkg / bin
всего 12
-rwxr-xr-x 1 root root 28 2009-01-22 18:58 foo
bill @ bill-desktop: ~ $ which foo
/ Опт / упак / bin / Foo
bill @ bill-desktop: ~ $ sudo su
root @ bill-desktop: / home / bill # which foo
корень @ счета-рабочий стол: / Главная / банкнота # 

0

PATH будет сброшен при использовании su или sudo по определению ENV_SUPATH и ENV_PATH, определенных в /etc/login.defs


0

$ PATH - это переменная среды, и это означает, что значение $ PATH может отличаться для других пользователей.

Когда вы входите в свою систему, настройки вашего профиля определяют значение $ PATH .

Теперь давайте посмотрим: -

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

Предположим, что это значения $ PATH для другого пользователя. Теперь, когда вы выполняете любую команду с помощью sudo, в действительности пользователь root выполняет эту команду.

Вы можете подтвердить, выполнив эти команды на терминале: -

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

Это причина. Я думаю, это ясно для вас.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.