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



Answers

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

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

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

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

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

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.




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



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




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

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



Я думаю, что на самом деле желательно, чтобы 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"



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

Ошибка 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.




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

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




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



Links