Przekazywanie ŚCIEŻKI przez sudo

13

W skrócie : jak sprawić, by sudo nie spuszczało PATH za każdym razem?

Mam kilka stron internetowych wdrożonych na moim serwerze (testy Debiana) napisane przy użyciu Ruby on Rails. Używam Mongrel + Nginx do ich hostowania, ale jest jeden problem, który pojawia się, gdy muszę zrestartować Mongrel (np. Po wprowadzeniu pewnych zmian).

Wszystkie strony są sprawdzane w VCS (git, ale to nie jest ważne) i mają właściciela i grupę ustawioną dla mojego użytkownika, podczas gdy Mongrel działa w ramach użytkownika huh, kundla, który jest poważnie ograniczony w swoich prawach. Tak więc kundel musi zostać uruchomiony pod rootem (może automatycznie zmienić UID) lub kundlem.

Do zarządzania kundlem używam klejnotu mongrel_cluster, ponieważ pozwala on uruchamiać lub zatrzymywać dowolną liczbę serwerów Mongrel za pomocą jednego polecenia. Ale potrzebuje katalogu /var/lib/gems/1.8/bin, aby znajdował się w PATH: to nie wystarczy, aby uruchomić go z bezwzględną ścieżką .

Modyfikacja ŚCIEŻKI w katalogu głównym .bashrc nic nie zmieniła, poprawianie env_reset sudo i env_keep również nie zmieniły.

Więc pytanie: jak dodać katalog do PATH lub zachować PATH użytkownika w sudo?

Aktualizacja: kilka przykładów

$ 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

Mogę też powiedzieć, że działa dokładnie w ten sposób również w stabilnej wersji Debiana (lenny).

Whitequark
źródło

Odpowiedzi:

12

Walczyłem z tym samym problemem przez kilka godzin. W debian lenny możesz to naprawić, dodając

Defaults        exempt_group=<your group> 

do pliku sudoers.

Jest to jedyny sposób na obejście skompilowanej opcji --secure-path (o ile mi wiadomo).

Warto zauważyć, że będzie to również zwalniają użytkowników z konieczności wprowadzić swoje hasło gdy sudo.

Obrabować
źródło
3

Jeśli się secure_pathwłączyłeś /etc/sudoers, możesz grać z env_reset/ env_keepwszystkim, co lubisz i nie będzie to miało żadnego wpływu na ścieżkę. Jeśli widzisz coś takiego, skomentuj to.

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Draemon
źródło
Nie, oczywiście, że nie zostało ustawione.
whitequark
0

Powiedziałbym: spójrz na opcje env_reset i env_keep w man sudo . Ale wygląda na to, że już to zrobiłeś (po prostu omyłkowo nazywasz env_keep „keepenv”). Jeśli wyłączysz opcję env_reset (domyślnie jest włączona), myślę, że nie powinno to usuwać żadnych zmiennych env. Ale to jest mniej bezpieczne.

Istnieje również opcja bezpiecznej ścieżki do sudo; Myślę, że jest to domyślnie włączone. Możesz spróbować go wyłączyć.

Powyższe opcje są ustawione w pliku / etc / sudoers. Istnieje również -iopcja wiersza polecenia do sudo. Spowoduje to, że sudo uruchomi /root/.profile lub /root/.login. Możesz tam ustawić żądaną ścieżkę.

dubiousjim
źródło
1
Nie, gdy env_reset jest wyłączony, nadal zmienia (nie kasuje) ŚCIEŻKĘ. Prawdopodobnie zrobiono to, aby dodać katalog / * / sbin. Nie, opcja -i nie jest odpowiednia, ponieważ uruchamia interaktywną powłokę i muszę tylko uruchomić polecenie.
whitequark
Okej, problem zniknął po ponownej instalacji Debiana (z powodu migracji do LVM), a także RubyGems; Twoja odpowiedź była najbardziej użyteczna ze wszystkich, więc można ją teraz zaakceptować.
whitequark
-1

Robisz coś złego. Ponadto nie określiłeś, co zrobiłeś z plikiem / etc / sudoers. Oto, co powinieneś zrobić - to jest system CentOS, BTW:

Po pierwsze, jest to z właściwym ustawieniem env_keep (zauważ, że PATH tam jest):

sudo grep -5 ścieżka / itp / sudoers domyślne env_keep = "wyświetlania kolorów HOSTNAME HISTSIZE inputrc KDEDIR \ LS_COLORS MAIL PS1 PS2 QTDIR NAZWA_UŻYTKOWNIKA \ język 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 ścieżka"

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

Wygląda dobrze. Teraz usuńmy ustawienie env_keep i spróbuj ponownie:

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

Co za smutna ŚCIEŻKA:

 -> sudo sh -c 'echo $PATH'
 /usr/bin:/bin
Emmel
źródło
1
Sprawdziłem WIĘCEJ niż dwa razy! Sprawdź aktualizację pocztą.
whitequark
Mam ten sam problem, zdecydowanie mam odpowiednie ustawienia, o których wspominasz
Draemon