W jaki sposób sudo nie zmienia $ HOME w Ubuntu i jak wyłączyć to zachowanie?

39

Na Ubuntu 12.04, kiedy I sudo -szmienna $ HOME nie jest zmieniana, więc jeśli mój zwykły użytkownik jest regularuser, sytuacja wygląda następująco:

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser

Dawno temu zrezygnowałem z Ubuntu, więc nie jestem pewien, ale myślę, że jest to zachowanie domyślne. Tak więc moje pytania to:

Pytanie 1 Jak to się robi? Gdzie jest konfiguracja?

Q2 Jak mogę to wyłączyć?

Edycja: Dzięki za odpowiedzi, które nieco to wyjaśniły, ale chyba muszę dodać kilka pytań, aby uzyskać odpowiedź, której szukam.

Pytanie 3 W Debianie sudo -szmienia zmienną $ HOME na /root. Z tego, co otrzymałem z odpowiedzi i man sudopowłoki, z którą uciekłem, sudo -sjest ta podana /etc/passwd, prawda?

Pytanie 4 Jednak zarówno w Ubuntu, jak i Debianie, powłoką podaną /etc/passwddla roota jest /bin/bash. W żadnym systemie również nie mogę znaleźć, gdzie jest różnica .profilelub w .bashrcplikach, jeśli chodzi o $ HOME, więc zachowanie się sudo -sróżni. Jakaś pomoc na ten temat?

alki
źródło
Odpowiedziałeś na część swojego pytania w komentarzu do mojej odpowiedzi, ale pomyślałem, że umieściłem tutaj link unix.stackexchange.com/questions/38175/… . Myślę, że twoje twierdzenie w Q3 jest spowodowane tym, że niektóre osoby ustawiają swoje profile i pliki rc, aby działały tak samo, niezależnie od tego, czy są w powłoce logowania, czy nie. Myślę, że jest bardzo mało prawdopodobne, aby sudozachowywał się inaczej między Debianem a Ubuntu.
msw,
@msw Jeśli chodzi o różnicę między Debianem a Ubuntu (12.04) sudo, myślę, że rzeczywiście istnieje różnica domyślnie. Jednak nie stawiam na to, ponieważ jestem na polu, które zostało ustawione przez kogoś innego i działa od dłuższego czasu. W każdym razie dla wszystkich zainteresowanych znalazłem security.stackexchange.com/questions/18369/... i bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140 .
alxs

Odpowiedzi:

51

Sudo ma wiele opcji konfiguracji czasu kompilacji. Możesz wymienić ustawienia w swojej wersji za pomocą sudo -V. Jedną z różnic między konfiguracją w wheezy Debiana i Ubuntu 12.04 jest to, że HOMEzmienna środowiskowa jest zachowana w Ubuntu, ale nie w Debianie; obie dystrybucje usuwają wszystkie zmienne środowiskowe z wyjątkiem kilku, które są wyraźnie oznaczone jako bezpieczne do zachowania. W ten sposób sudo -szachowuje się HOMEna Ubuntu, podczas gdy na Debianie HOMEjest usuwany, a sudonastępnie ustawia go w katalogu osobistym użytkownika docelowego.

Możesz zastąpić to zachowanie w sudoerspliku. Uruchom, visudoaby edytować sudoersplik. Istnieje kilka odpowiednich opcji:

  • env_keepokreśla, które zmienne środowiskowe są zachowywane. Służy Defaults env_keep += "HOME"do zachowania HOMEzmiennej środowiskowej dzwoniącego lub Defaults env_keep -= "HOME"do jej skasowania (i zastąp ją katalogiem osobistym użytkownika docelowego).
  • env_resetokreśla, czy zmienne środowiskowe są w ogóle resetowane. Resetowanie zmiennych środowiskowych jest często konieczne w przypadku reguł, które pozwalają na uruchomienie określonej komendy, ale nie zapewnia bezpośredniej korzyści bezpieczeństwa dla reguł, które i tak pozwalają na uruchamianie dowolnych komend.
  • always_set_home, jeśli jest ustawiony, powoduje HOMEzastąpienie, nawet jeśli został zachowany z powodu env_resetwyłączenia lub HOMEpozostania na env_keepliście. Ta opcja nie działa, jeśli i HOMEtak nie zostanie zachowana.
  • set_homejest jak always_set_home, ale dotyczy tylko sudo -s, a nie podczas wywoływania sudoza pomocą jawnego polecenia.

Opcje te można ustawić dla danego użytkownika źródłowego, określonego użytkownika docelowego lub danego polecenia; szczegóły w sudoersinstrukcji obsługi.

Zawsze możesz przesłonić HOMEdane połączenie sudo, podając opcję -H.

Powłoka nigdy nie zastąpi wartości HOME. ( HOMEUstawiłby się, gdyby był rozbrojony, ale sudozawsze ustawia w HOMEtaki czy inny sposób)

Jeśli uruchomisz sudo -i, sudosymuluje początkowe logowanie. Obejmuje to ustawienie HOMEkatalogu domowego użytkownika docelowego i wywołanie powłoki logowania .

Gilles „SO- przestań być zły”
źródło
17

Użyj sudo -H -izamiast, sudo -saby uzyskać interaktywną powłokę główną logowania:

sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

Od man sudo:

-H      The -H (HOME) option sets the HOME environment variable to
        the homedir of the target user (root by default) as
        specified in passwd(5).  By default, sudo does not modify
        HOME (see set_home and always_set_home in sudoers(5)).
franco
źródło
-iimplikuje -H.
x-yuri
5

Nie ma to wiele wspólnego z zachowaniem sudoi ma wiele wspólnego z różnicą między „powłoką logowania” a „powłoką bez logowania”. Szybka poprawka to

$ sudo -i

jak widać z:

$ sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ sudo -i
# echo $HOME
/root
# pwd
/root

Jak zauważono w podręczniku sudo:

Opcja -i (symuluj początkowe logowanie) uruchamia powłokę określoną przez wpis bazy danych haseł użytkownika docelowego jako powłokę logowania. Oznacza to, że pliki zasobów specyficzne dla logowania, takie jak .profile lub .login, zostaną odczytane przez powłokę. Jeśli podano polecenie, jest ono przekazywane do powłoki w celu wykonania za pomocą opcji -c powłoki. Jeśli nie podano polecenia, wykonywana jest powłoka interaktywna.

msw
źródło
Dzięki za dodatkowe szczegóły, wyjaśnili mi trochę więcej rzeczy. Chyba muszę sprawdzić różnicę między pociskami. Dla każdego, kto to czyta, w tej samej sytuacji ze mną, sprawdź to: unix.stackexchange.com/questions/38175/…
alxs
1
Nie, czy sudo się zmienia, HOMEczy nie, wszystko ma związek z konfiguracją sudo.
Gilles „SO- przestań być zły”,
@Gilles: Jak więc skonfigurowano sudo? W /etc/sudoersDebianie i Ubuntu nie ma nic innego jak $ HOME.
alxs
1
@alxs IIRC Debian i Ubuntu mają różne wartości domyślne czasu kompilacji. Możesz je zastąpić za pomocą opcji always_set_homei set_homew sudoers.
Gilles „SO- przestań być zły”
@Gilles: Dziękuję. Właśnie takiej odpowiedzi szukam, zarówno dlaczego tak się dzieje, jak i jak to cofnąć. Jeśli nie masz nic przeciwko opublikowaniu go, zaakceptuję go jako odpowiedź. Mógłbym to zrobić sam, ale nie chcę tego przypisywać.
alxs
2

Dość popularnym sposobem uzyskania powłoki roota jest również:

 $ sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root
Satanowski
źródło
Zwykle używam sudo -i -H, ale nie udało się zainstalować globalnego pakietu npm z git. Dzięki sudo su -temu działa! Dziękuję Ci.
Laurent,
0

Aby pozbyć się różnych zachowań odpowiednio sudo -sUbuntu i Debiana, możesz użyć sudowrappera (odpowiedź na pytanie 4):

sudos() {
   local PATH="$(getconf PATH)" root_homedir
   root_homedir="$(sudo -H sh -c 'printf "%s" "$HOME"')"
   sudo sh -c 'export HOME="$0"; exec sh -i' "$root_homedir"
   return 0
}

sudo -k
sudos
{
logname
whoami
id -un
id -ur
echo "PATH: $PATH"
}
exit
echo "PATH: $PATH"
tacz
źródło