su vs sudo -s vs sudo -i vs sudo bash


89

Jaka jest różnica między następującymi poleceniami:

su
sudo -s
sudo -i
sudo bash

Wiem, subo muszę znać hasło roota, i sudomuszę być w sudoerspliku, ale po wykonaniu jaka jest różnica?

Wiem, że istnieje różnica między sui sudo -sponieważ mój katalog domowy jest /rootpo uruchomieniu su, ale mój katalog domowy jest nadal /home/mynamepo sudo -s. Ale podejrzewam, że to tylko objaw podstawowej różnicy, której mi brakuje.


3
Wolę używać W sudo su - ten sposób nie potrzebujesz hasła roota, a -upewnia się, że katalog domowy jest ustawiony poprawnie.
Jens Timmerman

Odpowiedzi:


114

Dzięki sustajesz się innym użytkownikiem - domyślnie rootem, ale potencjalnie innym użytkownikiem. Jeśli powiesz su -, twoje środowisko zostanie również zastąpione środowiskiem logowania tego użytkownika, dzięki czemu to, co widzisz, jest nie do odróżnienia od zalogowania się jako ten użytkownik. W żaden sposób system nie może powiedzieć, co robisz, gdy jesteś suzalogowany do innego użytkownika na podstawie działań tego użytkownika.

Zupełnie inaczej jest z sudo:

  • Polecenia, które sudo wykonujesz, wykonują się jako użytkownik docelowy - domyślnie root, ale można je zmieniać -u- ale rejestruje polecenia, które wykonujesz , oznaczając je swoją nazwą użytkownika, aby można było później przypisać winę. :)

  • sudojest bardzo elastyczny. Możesz na przykład ograniczyć polecenia, które może wykonywać dany użytkownik lub grupa użytkowników. Z su, wszystko albo nic.

    Ta funkcja jest zwykle używana do definiowania ról. Na przykład można zdefiniować grupę „kopii zapasowych”, która może być uruchamiana, dumpi tarkażda z nich wymaga dostępu do konta root, aby poprawnie wykonać kopię zapasową dysku systemowego.

    Wspominam o tym tutaj, ponieważ oznacza to, że możesz dać komuś sudoprzywileje, nie dając im sudo -sani sudo bashumiejętności. Mają tylko uprawnienia, których potrzebują, aby wykonywać swoją pracę, a wraz z sunimi działają cały system. Musisz jednak zachować ostrożność: jeśli dasz komuś zdolność do powiedzenia sudo vi, na przykład, może on wystrzelić vii mieć efektywnie taką samą moc jak z sudo -s.

  • Ponieważ pobiera hasło sudoera zamiast hasła roota, sudoizoluje uprawnienia między wieloma sudoerami.

    To rozwiązuje problem administracyjny su, który polega na tym, że kiedy zmienia się hasło roota, wszyscy ci, którzy musieli go znać, sumusieli zostać poinformowani. sudoumożliwia niezależne zmienianie haseł sudoers. W rzeczywistości powszechne jest blokowanie hasłem konta użytkownika root w systemie w sudocelu wymuszenia wykonania wszystkich zadań sysadmin przez sudo. W dużej organizacji z wieloma zaufanymi sudoerami oznacza to, że kiedy jeden z sysadminów odejdzie, nie musisz zmieniać hasła roota i przekazywać go pozostałym administratorom.

Główna różnica między sudo bashi sudo -spolega na tym, że -sjest krótsza i pozwala na przekazywanie poleceń do wykonania w domyślnej powłoce użytkownika na kilka sposobów:

  1. Możesz powiedzieć, sudo -s some-commandktóry działa some-commandpod twoją powłoką. Zasadniczo jest to skrót sudo $SHELL -c some-command.

  2. Zamiast tego możesz przekazać polecenia do standardowego wejścia powłoki, np sudo -s < my-shell-script. Możesz użyć tego z heredoc, aby wysłać kilka poleceń do jednego sudowywołania, unikając konieczności sudowielokrotnego pisania .

Oba te zachowania są opcjonalne. O wiele częściej dajesz -ssam, więc po prostu uruchamia interaktywnie powłokę użytkownika. W tym trybie różni się sudo bashtym, że może uruchamiać inną powłokę niż bash, ponieważ najpierw wygląda w SHELLzmiennej środowiskowej, a następnie, jeśli nie jest ustawiona, w ustawieniach powłoki logowania użytkownika, zwykle w /etc/passwd.

Powłoka uruchamiana przez sudo -sdziedziczy twoje aktualne środowisko użytkownika. Jeśli to, czego naprawdę chcesz, to czyste środowisko, takie jak dostajesz zaraz po zalogowaniu, zamiast tego chcesz sudo -i, to stosunkowo nowy dodatek sudo. Z grubsza mówiąc, sudo -ijest sudo -stak, jak su -jest su: resetuje wszystkie oprócz kilku kluczowych zmiennych środowiskowych i odsyła cię z powrotem do katalogu domowego użytkownika. Jeśli nie wydasz komendy, aby działała pod tą powłoką przez standardowe wejście lub sudo -i some-commanduruchomi tę powłokę jako interaktywną powłokę logowania, aby skrypty startowe użytkownika (np. .bash_profile) Zostały uruchomione ponownie.

Wszystko to czyni sudo -iznacznie bezpieczniejszym niż sudo -s. Dlaczego? Ponieważ jeśli ktoś może wcześniej zmodyfikować twoje środowisko sudo -s, może spowodować wykonanie niezamierzonych poleceń. Najbardziej oczywistym przypadkiem jest modyfikacja SHELL, ale może się to również zdarzyć mniej bezpośrednio, na przykład przez, PAGERjeśli powiesz, man foogdy jesteś pod sudo -s.

Możesz powiedzieć: „Jeśli mogą modyfikować PAGER, mogą modyfikować PATH, a następnie mogą po prostu zastąpić zły sudoprogram”, ale ktoś wystarczająco paranoiczny może powiedzieć, /usr/bin/sudo /bin/bashaby uniknąć tej pułapki. Prawdopodobnie nie jesteś tak paranoikiem, że unikniesz pułapek we wszystkich innych podatnych zmiennych środowiskowych. Czy pamiętasz również, aby sprawdzić EDITORna przykład przed uruchomieniem jakiegokolwiek polecenia VCS ? W ten sposób sudo -i.

Ponieważ sudo -izmienia również katalog roboczy na katalog domowy użytkownika, możesz nadal chcieć używać sudo -sw sytuacjach, w których wiesz, że chcesz pozostać w tym samym katalogu, cdw którym byłeś podczas uruchamiania sudo. Jednak nadal jest bezpieczniej tam sudo -iiz cdpowrotem.


2
Co rozumiesz przez „shell out of vi”?
crisron

11
@crisron: Od wewnątrz viwpisz :shi naciśnij Enter. Teraz jesteś w podpowłoce ze wszystkimi przywilejami viprocesu, który spowodował powstanie tej powłoki. Jeśli vidziała z uprawnieniami roota, to również powłoka. Lub możesz uruchomić coś innego niż powłokę przez :!cmd, odczytać dane wyjściowe polecenia z bufora edycji przez :r !cmditp. Jeśli wszystkie są zablokowane, Makefilecelem są skrypty powłoki, a Vim ma :makepolecenie, które skutecznie pozwala uruchomić dowolną powłokę skrypty z poziomu edytora. Możliwości psot są zdecydowanie zbyt duże, aby można było je zachować.
Warren Young,

2
jeśli ktoś może włożyć fałszywkę do twojej ŚCIEŻKI, wtedy ten ktoś może umieścić fałszywą sudo w ŚCIEŻCE. aby być naprawdę pewnym, musisz wywołać sudo przy użyciu pełnej ścieżki:/usr/bin/sudo
lesmana

1
@lesmana: Zajęłam się tym w edycji; w zasadzie PATHnie jest to jedyny problem.
Warren Young,

6
Świetne wyjaśnienie; wielki ból głowy podczas czytania.
lobi

27

Z postu ubuntuforums, który napisałem jakiś czas temu:

Rozważ następujący eksperyment:

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

Oto różnice, które znalazłem:

Z sudo -s:

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

Z sudo su:

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

Zauważ różnicę w $HOME. Bycie rootem i $HOMEustawienie normalnego domu użytkownika może powodować problemy. Na przykład, jeśli uruchomisz aplikację graficzną, zwykły użytkownik ~/.Xauthoritymoże zostać zastąpiony przez root. Powoduje to późniejsze problemy ze zwykłymi użytkownikami, takie jak niemożność uruchamiania niektórych aplikacji graficznych za pośrednictwem crona.

Podsumowując:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games prawdopodobnie ustawione przez /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Najważniejsze sudo -ijest właściwe polecenie, które należy uruchomić, gdy chcesz powłoki root, która nie jest skażona przez środowisko użytkownika.


1
To, jak bardzo środowisko jest skażone, zależy również od konfiguracji sudo(w /etc/sudoersplikach powiązanych i powiązanych). Ustawień konfiguracyjnych, takich jak always_set_home, env_reset, env_keep, env_checki env_reset, i mogą one się zmieniać w zależności od użytkownika i polecenia. Zobacz sekcję „Środowisko dowodzenia” i OPCJE SUDOERS na stronie podręcznika sudoers (5) .
Curt J. Sampson,

Osobiście używam, sudo -Hsgdy chcę, aby środowisko nie było skażone przez moje ustawienia, ponieważ używam zsh i wszystkich kont aplikacji, które mogę zmienić, aby używać bash. To pozwala pewnej liczbie zmiennych środowiskowych przejść bez przeszkód, ale zwykle uważam, że te, które mają znaczenie, zostają zastąpione przez /etc/profile.d/*.
Ed Grimm,

7

su( s witch u ser lub s ubstitute u ser) umożliwia zmianę użytkownika. suw zasadzie uruchamia inną instancję powłoki z uprawnieniami zamierzonego użytkownika. Domyślnie przełącza cię do rootużytkownika, jeśli chcemy zmienić konkretnego użytkownika, musimy przekazać go w następujący sposób:

$ su bob  # switches to bob (requires bob's password)

su -oznacza, że ​​zmienne środowiskowe zostaną zresetowane do katalogu głównego i suoznacza zmienne środowiskowe jak stary użytkownik.

na przykład: katalog domowy root, jeśli używasz, su -lub katalog domowy starego użytkownika, jeśli używasz su.

sudo ( s uper u ser do ) to narzędzie wiersza polecenia, które pozwala użytkownikom uruchamiać programy z uprawnieniami bezpieczeństwa innego użytkownika, domyślnie jest to administrator root. Wykorzystuje plik konfiguracyjny, /etc/sudoersktóry wyświetla listę użytkowników, którzy mają prawa do określonych działań

sudo należy czytać jako / ˈsuːduː / . składnia, sudo commandtj. s witch u ser i wykonaj to polecenie.

  • sujest równoważny sudo -ii symuluje logowanie do konta root. Twój katalog roboczy będzie /rooti będzie czytał root'a .profileitp. Monit zmieni się z $ na #, wskazując, że masz dostęp do roota.

  • sudo -s uruchamia powłokę jako root, ale nie zmienia katalogu roboczego.

  • sudo bash gdzie bashjest polecenie do uruchomienia sudo. To polecenie działa bashjako superużytkownik.

  • Za pomocą sudomożna rejestrować wszystko, co ktoś robi.
  • Użycie sudouniemożliwia użytkownikowi poznanie hasła roota.
  • Za pomocą sudomożemy ograniczyć wykonywanie poleceń.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.