Чому судо змінює ПАТ?


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).

ОНОВЛЕННЯ: наскільки я можу бачити, жоден із скриптів не починався як коренева зміна PATH.

Від man sudo:

Щоб запобігти підробленню команд, sudo перевіряє, що "". Однак зауважте, що фактична змінна середовища PATH не модифікується і передається без змін програмі, що виконує sudo.


Чи має у root щось, що встановлює PATH у .bashrc? Це припущення, що оскільки ви працюєте в Linux, ш дійсно баш.
Грег Хьюгілл

Відповіді:


241

Це дратівливу функцію особливість судо у багатьох дистрибутивах.

Щоб вирішити цю "проблему" на 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
це дратує. періоду. якби він міг «змусити вас потрапити до троянди» судо, ви могли б змусити вас туди ж без нього. надано, важче, але якщо ви запускаєте код з неправильного місця навіть зі своїм звичайним користувачем, то справи вже досить погані.
gcb

7
Не псевдонімо судо; див. відповідь від @Jacob про параметри за замовчуванням env_reset.
greg_1_anderson

121

У випадку, якщо хтось інший працює через це і хоче просто відключити зміну всіх змінних шляхів для всіх користувачів.
Доступ до файл sudoers, використовуючи команду: visudo. Ви повинні десь побачити такий рядок:

За замовчуванням env_reset

який слід додати наступне у наступному рядку

За замовчуванням! Secure_path

secure_path увімкнено за замовчуванням. Цей параметр вказує, що робити $ PATH під час вибору. Знак оклику відключає функцію.


6
інший спосіб:Defaults env_keep = "PATH"
gcb

1
За замовчуванням! Secure_path чудово працював для мене в сучасних системах; на старому вікні ubuntu 8.04 Defaults env_keep = "PATH" зробив цю справу.
greg_1_anderson

29
Замість того, щоб вимикати захисний шлях, ви можете додати його. Наприклад, у моєму випадку я додав рядок "За замовчуванням secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / some / custom / каталог", де "деякий / custom / каталог" - це шлях, який мені потрібен зробити доступними для судо.
Гектор Кореа

@HectorCorrea - це кращий спосіб ІМО.
чакрит

32

PATH є змінною середовища, і як таке за замовчуванням скидається sudo.

Для цього вам потрібні спеціальні дозволи.

З man sudo

       -E Параметр -E (зберегти середовище) замінить env_reset
           варіант у судорах (5)). Він доступний лише тоді, коли
           Команда ing має тег SETENV або параметр setenv встановлений в sudo-
           ers (5).
       Змінні середовища, які слід встановити для команди, також можуть передаватися
       командний рядок у вигляді VAR = значення, наприклад
        LD_LIBRARY_PATH = / usr / local / pkg / lib. Змінні передавали команду
       лінії підпадають під ті ж обмеження, що і для звичайного середовища
       вміє за одним важливим винятком. Якщо параметр setenv встановлений
       sudoers, команда, яку потрібно виконати, має встановлений тег SETENV або команду
       збігається ВСЕ, користувач може встановлювати змінні, які надмірно були б для-
       биден Додаткову інформацію див. У судорах (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_ * vari-
                       вміє. Будь-які змінні в середовищі абонента, які
                       відповідати env_keep і env_check списки додаються.
                       Вміст за замовчуванням env_keep та env_check
                       списки відображаються, коли sudo запускається під коренем разом із
                       -V варіант. Якщо судо було складено разом із 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 побудовано за допомогою - із безпечним контуром проблематично")

Що ще гірше, наскільки я можу сказати, неможливо дотримуватися 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 "$@"

то ваше звичайне судо працює так само, як і судо-незахищений шлях


Помилка Ubuntu # 192651 ("шлях sudo завжди скидається")

З огляду на те, що дублікат цієї помилки був спочатку поданий у липні 2006 року, мені не ясно, як довго працював неефективний env_keep. Незалежно від того, що заслуговує на те, щоб змусити користувачів використовувати такі трюки, як перераховані вище, неодмінно, що довідкові сторінки для судо та судорів повинні відображати той факт, що варіанти зміни PATH фактично зайві.

Змінення документації для відображення фактичного виконання не є дестабілізуючим і дуже корисним.


Помилка Ubuntu # 226595 ("неможливо зберегти / вказати PATH")

Мені потрібно мати змогу запускати судо з додатковими не std бінарними папками в 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 - теж не вийшло.

Зрозуміло, що - незважаючи на документацію на людину - 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_groupабо env_keep.

Це також зручно, оскільки ви можете додавати каталоги, корисні лише для root (наприклад, /sbinта /usr/sbin) до шляху sudo, не додаючи їх до шляхів користувачів. Щоб вказати шлях, який повинен використовувати sudo:

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

зловмисник, який отримує доступ до акаунта судора, може зробити ще гірші речі.
user508546

Гідна порада. На сервері ubuntu 12.04 аналогічний параметр за замовчуванням.
Цутому

7

Зараз працює з судо з кармічних сховищ. Деталі з моєї конфігурації:

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 **? Чому ПАТХ потрібен **?
CMCDragonkai

@CMCDragonkai Він був відформатований як жирний (у розмітці), але хтось (переповнення стека не дасть мені вказати пальцями) відредагував його, щоб позначити його як код.
1j01

2

Secure_path - ваш друг, але якщо ви хочете звільнити себе від secure_path, просто зробіть це

судо візудо

І додавати

За замовчуванням izuzetpt_group = your_goup

Якщо ви хочете звільнити купу користувачів, створіть групу, додайте до неї всіх користувачів і використовуйте це як свою виняткову групу. людина 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

прокоментувати як "За замовчуванням env_reset", так і "За замовчуванням secure_path ..." у файлі / etc / sudores працює для мене


1

Ви також можете перемістити файл у каталозі використовуваних судорів:

    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

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, то в корені фактичного значення користувач виконує цю команду.

Ви можете підтвердити, виконавши ці команди на терміналі: -

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

Це причина. Я думаю, це вам зрозуміло.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.