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

257

Это переменная 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).

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

От человека sudo:

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

Теги:
path
sudo

17 ответов

239

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

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

alias sudo='sudo env PATH=$PATH'

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

sudo su -p
  • 44
    Эта «раздражающая функция» предотвращает попадание троянских программ. Я говорю, что форсирование определенного $ PATH - это функция, а не ошибка - она заставляет вас написать полный путь к программе, которая находится за пределами $ PATH.
  • 28
    Да, но это абсолютно нелогично. Наверное, это обманывает хороших парней больше, чем плохих.
Показать ещё 11 комментариев
113

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

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

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

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

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

  • 1
    Это работало для меня на Ubuntu 10.10.
  • 0
    Это просто работает. Debian 6 (сжатие)
Показать ещё 4 комментария
30

PATH - это переменная среды, и по умолчанию она является reset sudo.

Для этого вам нужны специальные разрешения.

От man sudo

       -E  The -E (preserve environment) option will override the env_reset
           option in sudoers(5)).  It is only available when either the match-
           ing command has the SETENV tag or the setenv option is set in sudo-
           ers(5).
       Environment variables to be set for the command may also be passed on
       the command line in the form of VAR=value, e.g.
       LD_LIBRARY_PATH=/usr/local/pkg/lib.  Variables passed on the command
       line are subject to the same restrictions as normal environment vari-
       ables with one important exception.  If the setenv option is set in
       sudoers, the command to be run has the SETENV tag set or the command
       matched is ALL, the user may set variables that would overwise be for-
       bidden.  See sudoers(5) for more information.

Пример использования:

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

Обновление

man 5 sudoers : 

     env_reset       If set, sudo will reset the environment to only contain
                       the LOGNAME, SHELL, USER, USERNAME and the SUDO_* vari-
                       ables.  Any variables in the caller environment that
                       match the env_keep and env_check lists are then added.
                       The default contents of the env_keep and env_check
                       lists are displayed when sudo is run by root with the
                       -V option.  If sudo was compiled with the SECURE_PATH
                       option, its value will be used for the PATH environment
                       variable.  This flag is on by default.

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

Это по умолчанию в 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. changelog говорит, что его можно переопределить во время выполнения, но я еще не обнаружили, как.

Говорят, что в вашем файле 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 # 192651 ( "путь sudo всегда reset" )

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

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


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

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

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

  • Использование опции "sudo -E" не работает. Мой существующий PATH был reset по sudo

  • Изменение "Defaults env_reset" до "Defaults !env_reset" в /etc/sudoers также не помогло (даже в сочетании с sudo -E)

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

  • Добавление 'Defaults env_keep += "PATH"' в /etc/sudoers также не помогло.

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

13

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

sudo -i 

который принимает не-sudo PATH

  • 0
    sudo -i не помогает в Ubuntu (я проверил Ubuntu 14.04.3 LTS). $ PATH по-прежнему изменяется sudo.
  • 0
    Работал как по волшебству :)
10

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

(конечно, имея sudo reset, 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"
  • 0
    Злоумышленник, получивший доступ к учетной записи sudoer, может совершать еще худшие вещи.
  • 0
    Достойный совет. На сервере 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_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"

Закройте терминал, а затем снова откройте.

  • 0
    Ждать PATH нужно 2 **? Зачем нужен PATH **?
  • 0
    @CMCDragonkai Он был отформатирован жирным шрифтом (в уценке), но кто-то (переполнение стека не позволяет мне указывать пальцем) отредактировал его, чтобы пометить его как код.
3

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

2

Secure_path - ваш друг, но если вы хотите освободить себя от secure_path, просто выполните

sudo visudo

И добавьте

Defaults exempt_group=your_goup

Если вы хотите освободить группу пользователей, создайте группу, добавьте к ней всех пользователей и используйте это как свою исключенную группу. man 5 sudoers для больше.

1

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

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

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

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

Вот почему. Я думаю, что это ясно для вас.

0

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню