[Ubuntu] sudo изменяет PATH - почему?


Answers

Это раздражающая функция особенность sudo на ubuntu. Обратите внимание, что это не происходит в Fedora, например, поскольку sudo не построен с опцией --with-secure-path.

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

alias sudo='sudo env PATH=$PATH'

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

sudo su -p
Question

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

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

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




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

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




Я думаю, что на самом деле желательно, чтобы sudo сбросил PATH: в противном случае злоумышленник, скомпрометировавший вашу учетную запись пользователя, мог бы поставить backdoored версии всех видов инструментов в 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"



Работает теперь с использованием 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:~$ 

Замечательно, наконец, решить эту проблему без использования взлома.




Просто редактируйте 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"

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




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




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# 



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



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

Ошибка 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 # 192651 («путь sudo всегда сбрасывается»)

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

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

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

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

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

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

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

  3. env_reset (например, « #Defaults env_reset ») в файле / etc / sudoers также не работает.

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

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




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




Мне это показалось для меня

sudo -i 

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




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

sudo visudo

И добавить

Defaults exempt_group=your_goup

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




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

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



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

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

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

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

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




PATH - это переменная среды, и по умолчанию она по умолчанию восстанавливается 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's 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}" 



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




рекомендуемое решение в комментариях к дистрибутиву 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"