Прохождение PATH через sudo

13

Короче говоря : как заставить sudo не сбрасывать PATH каждый раз?

У меня есть несколько сайтов, развернутых на моем сервере (тестирование Debian), написанных на Ruby on Rails. Я использую Mongrel + Nginx для их размещения, но есть одна проблема, которая возникает, когда мне нужно перезапустить Mongrel (например, после внесения некоторых изменений).

Все сайты проверяются в VCS (git, но это не важно) и имеют владельца и группу, настроенные для моего пользователя, в то время как Mongrel работает от имени пользователя mongrel, который строго ограничен в своих правах. Таким образом, Mongrel должен быть запущен под root (он может автоматически менять UID) или mongrel.

Для управления mongrel я использую gem mongrel_cluster, потому что он позволяет запускать или останавливать любое количество серверов Mongrel всего одной командой. Но для этого нужно, чтобы каталог /var/lib/gems/1.8/bin находился в PATH: этого недостаточно для запуска с абсолютным путем .

Модификация PATH в корне .bashrc ничего не изменила, не изменив настройки sudo env_reset и env_keep.

Итак, вопрос: как добавить каталог в PATH или сохранить PATH пользователя в sudo?

Обновление: несколько примеров

$ env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/var/lib/gems/1.8/bin
$ sudo cat /etc/sudoers | egrep -v '^$|^#'
Defaults    env_keep = "PATH"
root    ALL=(ALL) ALL
%sudo ALL=NOPASSWD: ALL
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Также могу сказать, что так же работает и в стабильной Debian (lenny).

whitequark
источник

Ответы:

12

Боролся с той же проблемой в течение нескольких часов. В Debian Lenny вы можете исправить это, добавив

Defaults        exempt_group=<your group> 

в файл sudoers.

Это единственный способ обойти скомпилированную опцию --secure-path (насколько я знаю).

Примечательно, что это также освобождает пользователей от необходимости вводить свой пароль при выполнении sudo.

обкрадывать
источник
3

Если вы secure_pathустановили /etc/sudoers, вы можете играть с env_reset/ env_keepвсе, что вам нравится, и это не будет иметь никакого значения для пути. Если вы видите что-то подобное, закомментируйте это.

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Draemon
источник
Нет, конечно, это не было установлено.
Уайткварк
0

Я бы сказал, посмотрите параметры env_reset и env_keep в man sudo . Но похоже, что вы уже сделали это (вы просто по ошибке называете env_keep "keepenv"). Если вы отключите опцию env_reset (по умолчанию включено), я думаю, что она не должна стирать никакие переменные env. Но это менее безопасно.

Есть также опция secure_path для sudo; Я думаю, что это включено по умолчанию. Вы можете попробовать отключить его.

Предыдущие параметры задаются в вашем файле / etc / sudoers. Там также-i опция командной строки для sudo. Это заставит sudo запустить /root/.profile или /root/.login. Вы можете установить желаемый путь там.

dubiousjim
источник
1
Нет, когда env_reset выключен, он все еще изменяет (не стирает) PATH. Вероятно, это сделано для добавления / * / sbin dirs. Нет, опция -i не подходит, потому что она запускает интерактивную оболочку, и мне нужно только запустить команду.
whitequark
Хорошо, проблема исчезла после переустановки Debian (из-за перехода на LVM), а также RubyGems; Ваш ответ был самым полезным из всех, поэтому его можно принять сейчас.
whitequark
-1

Ну, вы делаете что-то не так. Кроме того, вы не указали, что вы сделали с вашим файлом / etc / sudoers. Вот что вы должны были сделать - это система CentOS, кстати:

Во-первых, это с правильной настройкой env_keep (обратите внимание, что там есть PATH):

Sudo Grep -5 ПУТЬ / и т.д. / sudoers по умолчанию env_keep = "дисплей цветов HOSTNAME HISTSIZE INPUTRC KDEDIR \ LS_COLORS MAIL PS1 PS2 QTDIR ИМЯ_ПОЛЬЗОВАТЕЛЯ \ LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY lc_name LC_NUMERIC \ LC_PAPER LC_TELEPHONE LC_TIME LC_ALL ЯЗЫК LINGUAS \ _XKB_CHARSET XAUTHORITY PATH"

Defaults   timestamp_timeout = 15 

## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple

-> export PATH=$PATH:hithere
-> sudo sh -c 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/bin:hithere

Выглядит хорошо. Теперь давайте удалим настройку env_keep и попробуем снова:

-> sudo visudo
-> sudo grep -5 PATH /etc/sudoers
                    LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                    LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                    LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                    LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                    _XKB_CHARSET XAUTHORITY"
 #_XKB_CHARSET XAUTHORITY PATH"

Какой печальный путь

 -> sudo sh -c 'echo $PATH'
 /usr/bin:/bin
Emmel
источник
1
Я проверил это БОЛЬШЕ, чем дважды! Проверьте обновление в посте.
whitequark
У меня та же проблема, я определенно имею правильные настройки, которые вы упоминаете
Draemon