Dlaczego polecenie sudo nie potrzebuje hasła roota?

48

Używam Linuksa od jakiegoś czasu i za każdym razem, gdy pisałem sudo, myślałem, że przełączam się na użytkownika root w celu wykonania polecenia.

Najwyraźniej nie jest to prawdą, ponieważ wszystko, czego potrzebuję, to hasło do mojego konta użytkownika. Zgaduję, odkąd nie pracowałem z wieloma użytkownikami, tak naprawdę nie zauważyłem tego w prawdziwym świecie.

Nie jestem pewien, jak Ubuntu konfiguruje moje pierwsze konto. Czy jest użytkownik root? Czy jestem rootem? Zgaduję, że właśnie utworzyłem nowego użytkownika podczas instalacji, ale dało mi to uprawnienia roota? Po prostu trochę zdezorientowany tutaj ...

Dlaczego więc mogę uruchamiać komendy root z hasłem mojego użytkownika?

EGHDK
źródło
Za pomocą którego użytkownika potrzebujesz hasła, a w którym nie? Jakie polecenie wykonujesz? Pamiętaj, że sudo przechowuje twoje hasło przez pewien czas, zanim będziesz musiał je ponownie wpisać.
Braiam
11
sudoma ustawiony bit „setuid”. Działa więc jako użytkownik, który jest jego właścicielem (który nie mylę się jako root na wszystkich standardowych systemach), a nie użytkownik, który go uruchamia. sudonastępnie ładuje /etc/sudoersplik i sprawdza, co jest dozwolone w zależności od tego, kto go uruchomił.
LawrenceC,
1
Przepraszam, jeśli powtarzam coś, co powiedział ktoś inny, ale nie mogłem tego znaleźć. Odpowiedź brzmi: to decyzja polityczna. Moim zdaniem motywacja polega na tym, że w dużej instalacji, w której masz wiele sudouprzywilejowanych osób , być może pracujących w rozproszonych geograficznie lokalizacjach i na zmianach 24 × 7, chcesz mieć możliwość natychmiastowego cofnięcia uprzywilejowanego dostępu jednej osoby (np. podejrzewasz jego uczciwość). Jeśli wszyscy używają jedynego hasła roota, a Ty je zmienisz bez uprzedniej koordynacji, może dojść do chaosu. …
G-Man mówi „Reinstate Monica”
1
@HagenvonEitzen Wiem, że spóźniłem się kilka dni, ale jak to nie jest dupek naszego pytania?
strugee

Odpowiedzi:

65

Szczegółowo działa to w następujący sposób:

  1. /usr/bin/sudoplik wykonywalny ma ustawiony bit setuid , więc nawet jeśli jest wykonywany przez innego użytkownika, działa z identyfikatorem użytkownika właściciela pliku (w tym przypadku root).

  2. sudosprawdza w /etc/sudoerspliku, jakie masz uprawnienia i czy możesz uruchomić polecenie, które wywołujesz. Mówiąc wprost, /etc/sudoersto plik, który określa, którzy użytkownicy mogą uruchamiać polecenia za pomocą sudomechanizmu.

    Tak wygląda ten plik na moim Ubuntu:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    

    Trzecia linia prawdopodobnie Cię interesuje. Pozwala każdemu w grupie „sudo” wykonać dowolne polecenie jak każdy użytkownik.

    Kiedy Ubuntu konfiguruje pierwsze konto podczas instalacji, dodaje to konto do grupy „sudo”. Za pomocą polecenia możesz sprawdzić, do których grup należą użytkownicy group.

  3. sudoprosi o hasło. Biorąc pod uwagę fakt, że potrzebuje hasła użytkownika, a nie roota, jest to fragment instrukcji sudoers :

    Uwierzytelnianie i logowanie

    Zasady bezpieczeństwa sudoers wymagają, aby większość użytkowników uwierzytelniła się przed użyciem sudo. Hasło nie jest wymagane, jeśli użytkownik wywołujący jest rootem, użytkownik docelowy jest taki sam jak użytkownik wywołujący lub jeśli zasady wyłączyły uwierzytelnianie dla użytkownika lub polecenia. W przeciwieństwie do su (1), gdy sudoers wymaga uwierzytelnienia, sprawdza poświadczenia użytkownika wywołującego, a nie poświadczenia użytkownika docelowego (lub użytkownika root). Można to zmienić za pomocą flag rootpw, targetpw i runaspw, opisanych później.

    W rzeczywistości sudojednak do niczego nie potrzebuje hasła użytkownika. Prosi o to tylko po to, aby upewnić się, że naprawdę jesteś sobą i zapewnić ci jakieś ostrzeżenie (lub szansę przestać) przed wywołaniem potencjalnie niebezpiecznego polecenia. Jeśli chcesz wyłączyć pytanie o hasło, zmień wpis sudoers na:

    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. Po uwierzytelnieniu sudoodradza się proces potomny, który uruchamia wywołane polecenie. Dziecko dziedziczy identyfikator użytkownika root po rodzicu - sudoprocesie.


Odpowiadając dokładnie na pytania:

Myślałem, że przełączam się na użytkownika root dla polecenia.

Miałeś rację. Każde polecenie poprzedzone sudouruchomieniem z identyfikatorem użytkownika root.

Czy jest użytkownik root?

Tak, istnieje konto użytkownika root, niezależne od konta użytkownika utworzonego podczas instalacji systemu. Jednak domyślnie w Ubuntu nie można zalogować się do interaktywnego terminala jako użytkownik root.

Czy jestem rootem?

Nie, nie jesteś rootem. Masz tylko uprawnienia do uruchamiania poszczególnych poleceń jako root , korzystając z sudomechanizmu opisanego powyżej.

Dlaczego więc mogę uruchamiać komendy root z hasłem mojego użytkownika?

Musisz wprowadzić hasło użytkownika tylko ze względu na sudowewnętrzny mechanizm bezpieczeństwa. Można to łatwo wyłączyć. Zyskujesz swoje uprawnienia roota z powodu setuid /usr/bin/sudo, a nie z powodu wprowadzonych haseł.

Piotr Jurkiewicz
źródło
6
Odpowiedź powinna zaczynać się od części setuid, ponieważ jest to powód, dla którego jest to rzeczywiście możliwe. / etc / sudoers jest tylko powodem elastyczności polecenia sudo.
Daniel Kullmann
Ciekawy. Nie wiedziałem, że możesz określić, że sudomożna uruchomić bez podawania hasła. Świetna odpowiedź!
jwir3
1
Zauważ, że sudo można skonfigurować tak, aby pytało o hasło roota z rootpwflagą w sudoers.
Przywróć Monikę - M. Schröder
2
W rzeczywistości możesz zalogować się jako użytkownik root: sudo su - rootzrobi to i da terminal root. Jednak nie można łatwo zalogować się do sesji pulpitu jako root.
jmiserez,
1
Zasadniczo sam sudoma uprawnienia roota i decyduje, czy przekazać to użytkownikowi na podstawie pliku konfiguracyjnego.
Siyuan Ren,
15
  • Chodzi o sudoto, aby przyznać ci czyjeś uprawnienia (zwykle rootowanie) bez pytania o hasło do tego konta (w przeciwieństwie do su).

  • sudo prosi o podanie hasła, aby upewnić się, że przechodzący nie nadużyje odblokowanego terminala.

  • Ubuntu i wiele innych systemów Linux i Unix przyznają początkowe konto utworzone w czasie instalacji prawo do uruchamiania dowolnych poleceń jako root.

  • Chociaż rootnadal jest kontem w systemie Linux, bezpośrednie rootlogowanie jest domyślnie wyłączone dla lepszego bezpieczeństwa i identyfikowalności.

jlliagre
źródło
7
Chociaż bezpośrednie logowanie do roota jest rzeczywiście domyślnie wyłączone, nadal istnieje konto root w Ubuntu. Nie jest już kontem przynajmniej w systemie Solaris, gdzie domyślnie jest rolą.
jlliagre
Wielkie dzięki - zawsze zastanawiałem się, jak to w ogóle działało, a teraz ma o wiele więcej sensu.
mikeserv
5

Piotr bardzo dobrze wyjaśnił, jak sudodziała. Jednak tak naprawdę nie motywował, dlaczego tak działa, więc postaram się to tutaj dodać.

Przed utworzeniem sudopolecenia mieliśmy supolecenie. To polecenie pozwala jednemu użytkownikowi na wykonywanie poleceń jako inny użytkownik, zwykle root(jak w przypadku sudo, jest to domyślny użytkownik docelowy). To było całkowicie bezdyskryminacyjne, możesz wykonać dowolne polecenie. Ponieważ może być używany przez dowolnego użytkownika, był faktycznie równoważny logowaniu się jako ten użytkownik, wymagał znajomości hasła użytkownika docelowego.

W pewnym momencie dodano nieco więcej kontroli dostępu: aby korzystać su, trzeba było być członkiem wheelgrupy. Ale ponieważ nadal możesz wykonać dowolne polecenie, nadal sensowne jest wymaganie znajomości hasła.

Wymaganie od użytkowników znajomości hasła lub hasła administratora nie było jednak zbyt bezpieczne. Często chcesz po prostu dać pewnym użytkownikom ograniczony dostęp do innego konta (jest to część koncepcji bezpieczeństwa zwanej zasadą najmniejszych uprawnień ). Utrudnia to także rozliczalność: jeśli wiele osób zna hasło do konta, a to konto bierze udział w pomyłce lub nadużyciu, nie możesz powiedzieć, która z nich faktycznie to zrobiła.

Tak sudopowstało. Zamiast pozwalać użytkownikom na wykonywanie dowolnego polecenia, ma on rozbudowany plik konfiguracyjny, krótko omówiony w odpowiedzi Piotra, który dokładnie określa, kto może z niego korzystać, do jakich użytkowników może się przełączać i jakie polecenia mogą wykonywać. Dzięki tej drobiazgowej kontroli nad tym, kto może robić komu, nie musimy już podawać użytkownikom hasła do konta docelowego; gdybyśmy to zrobili, mogliby z łatwością ominąć wszystkie elementy sterujące w pliku konfiguracyjnym, logując się jako ten użytkownik. Zamiast tego zwykle wymagamy od nich, aby udowodnili, że są tymi, którzy się zalogowali, wprowadzając własne hasło - ma to na celu zapobiec korzystaniu z konta, jeśli terminal pozostanie bez nadzoru.

Wymóg ten jest zniesiony dla superużytkownika - to konto może zrobić prawie wszystko w systemie bez użycia sudo, więc zostało uznane za zbyteczne. Możliwe jest również określenie w pliku konfiguracyjnym, że użytkownicy wcale nie muszą wprowadzać hasła - niektóre organizacje używają tego, gdy uważają, że fizyczne bezpieczeństwo środowiska stacji roboczej jest wystarczające, aby zapobiec nadużyciom.

Barmar
źródło
Nie zgłębiałem tego, ale rozumiem, że jedną z cech sudo, których nie ma w su, jest to, że (jest w stanie?) Prowadzić dziennik poleceń uruchomionych przez użytkownika, aby ułatwić śledzenie problemów z powrotem do ich źródła. Właśnie spojrzałem na mój system kubuntu i nie widzę takiego dziennika, więc może nie jest to zachowanie domyślne.
Joe
Właśnie znalazłem logowanie do sudo /var/log/auth.log - wraz z wieloma innymi rzeczami, w tym niektórymi adresami IP z Chin próbującymi uzyskać dostęp root ssh do mojego systemu - więc jeśli chcesz zobaczyć sudo, musisz przefiltrować poprzez grep lub podobny.
Joe
Poprawny. surównież loguje, ale ponieważ po prostu uruchamia nową powłokę, po prostu rejestruje fakt, że ktoś ją uruchomił.
Barmar
Nie możesz polegać na dziennikach, każdy, kto może uzyskać uprawnienia roota, może zmienić dzienniki (chyba że zalogujesz się na innym komputerze i upewnisz się, że nie dajesz dostępu do czasu zakończenia transakcji rejestrowania). Jednakże sudodopuszcza przywileje mają być odwołane, bez konieczności ponownego wydać hasło roota dla wszystkich, że potrzebuje.
ctrl-alt-delor
1
@richard Ponieważ sudopozwala ograniczyć, które polecenia może wykonywać użytkownik, możesz spróbować upewnić się, że nie dajesz dostępu do poleceń, które zastąpiłyby dziennik.
Barmar
3

Odpowiedź na twoje pytanie brzmi:

Kiedy uruchamiasz polecenie w sudo , uruchamiasz polecenie z podwyższonymi uprawnieniami , czyli uprawnieniami roota . Musisz tylko wpisać swoje normalne hasło użytkownika, ponieważ zostałeś (użytkownik) dodany do pliku sudoers, który daje uprawnienia roota .

coś tam coś tam
źródło
2
Tyle że sudo nie implikuje podwyższonych uprawnień, tylko inne niż dla bieżącego użytkownika. Np. Możesz uruchomić program jako zwykły użytkownik, który nie ma powłoki. Ponadto przebywanie w pliku sudoers nie daje uprawnień roota.
James Tocknell,
1
@aragilar yes sudonie zawsze daje podwyższone uprawnienia, ale działa po podniesieniu uprawnień, po zrobieniu tego (sprawdzanie uwierzytelnienia, może upuścić uprawnienia). Wymaga tych podwyższonych uprawnień, aby móc zmienić użytkownika.
ctrl-alt-delor
1
Jasne, sudonie korzystać z podwyższonymi uprawnieniami (ale to nie jest przypisany do sudo, np mocowanie ma również), ale polecenie, które nazywają czyli commandw sudo commandnie może (w zależności od tego, co znajduje się w /etc/sudoers).
James Tocknell,
1

Po pierwsze, wyłączenie konta odbywa się zwykle poprzez ustawienie zaszyfrowanego hasła na *, które nie jest zaszyfrowaną wartością żadnego łańcucha. Nie mogę teraz sprawdzić, ale wierzę, że to właśnie robi Ubuntu dla roota. Więc technicznie nie ma hasła roota na Ubuntu.

Ale sudo poprzedza Ubuntu; został zaprojektowany dla systemów, w których z pewnością były hasła roota. Dlaczego więc nie wymaga hasła roota? Zasadniczo sudo zostało zaprojektowane tak, aby udzielać uprawnień do uruchamiania określonych poleceń określonym użytkownikom --- np. Umożliwiać programistom dostęp do roota w celu ponownego uruchomienia aplikacji internetowej, ale nie w celu uruchamiania dowolnych serwerów. Natomiast znajomość hasła roota daje nieograniczony dostęp; możesz użyć login lub su, aby otworzyć powłokę roota i uruchomić dowolne polecenia. Ponieważ sudo musi działać dla osób bez tego poziomu dostępu, nie może wymagać uruchomienia hasła roota.

Jonathan Cast
źródło
Umożliwia także cofnięcie uprawnień użytkownika root bez konieczności zmiany hasła użytkownika root.
Ian D. Scott,