Dlaczego musimy być rootem w terminalu, aby zamknąć i uruchomić ponownie?

65

Kiedy instalujemy / usuwamy / aktualizujemy pakiety lub dokonujemy jakichkolwiek zmian, które wymagają uprawnień administratora, pojawia się monit o hasło administratora, który ma sudouprawnienia - dzieje się to zarówno poprzez GUI, jak i terminal.

monit za pośrednictwem GUI

Jeśli jednak spróbujemy zamknąć i uruchomić ponownie za pośrednictwem terminala, narzeka, że ​​musimy root:

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

Ale nigdy nie jesteśmy proszeni o hasło, gdy wykonujemy te czynności za pomocą koła zębatego w prawym górnym rogu.

menu koła zębatego

Dlaczego jest taka rozbieżność?

Aditya
źródło
5
Dobre pytanie .. Wiesz o co chciałem zadać to samo. Moim scenariuszem było zamknięcie Ubuntu za pomocą klawiszy skrótu. i, e kiedykolwiek nacisnę jakiś przypisany klawisz, taki jak ctrl + super + s , wykonuje polecenie, sudo shutdown -h nowale problem polegał na tym, że bez pozwolenia dostępu do shutdownniego nigdy nie działa. Ponieważ gdzie / jak poprosi o hasło po naciśnięciu klawisza skrótu .. Mam nadzieję, że rozumiesz moją sytuację .. :)
Saurav Kumar
zobacz także: askubuntu.com/questions/1190/...
Takkat

Odpowiedzi:

50

Wyłączenie koła zębatego sprawdza, czy możesz wyłączyć maszynę. Odbywa się to za pośrednictwem PolicyKit. W przypadku zamknięcia ta instrukcja w pliku /usr/share/polkit-1/actions/org.freedesktop.consolekit.policyjest sprawdzana:

<action id="org.freedesktop.consolekit.system.stop">
  <description>Stop the system</description>
  <message>System policy prevents stopping the system</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>yes</allow_active>
  </defaults>
</action>

PolicyKit wyzwala dbus-sendpolecenie. W przypadku wyłączenia byłoby to:

dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

W tle działa demon z uprawnieniami administratora, który wywołuje dla ciebie polecenie zamknięcia.

Jeśli chcesz móc zamknąć maszynę „starym sposobem” za pomocą wiersza poleceń ( shutdown, reboot, halt, ...), musisz dodać bit suid do tych poleceń. Pamiętaj jednak, że każdy w twoim systemie, który ma dostęp do powłoki, może wtedy zamknąć twój komputer.

chaos
źródło
14
Nieco bezpieczniejszą opcją byłoby zezwolenie sudoerom na zamykanie bez hasła itp. Można to łatwo osiągnąć: wprowadź sudo visudo, dodaj %sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot, zapisz i wyjdź. W ten sposób ponowne uruchomienie wiersza polecenia będzie nadal wymagać sudo reboot, ale nie będziesz musiał wprowadzać hasła.
Sebastian Thürrschmidt
27

Ubuntu to dystrybucja systemu operacyjnego GNU / Linux, który z kolei należy do rodziny systemów uniksowych - wspólnej architektury dla wielu nowoczesnych systemów operacyjnych.

Tradycyjnie Unix działał na komputerach mainframe. Centralne urządzenia komputerowe obsługujące dziesiątki lub setki użytkowników za pośrednictwem zdalnych terminali. Ponieważ wszyscy użytkownicy polegali na dostępności komputera mainframe, żaden pojedynczy użytkownik nie mógł wydać polecenia zamknięcia. Pomysł, który ma fundamentalne znaczenie dla architektury Uniksa - jądro systemu nigdy nie zainicjuje wyłączenia, chyba że odpowiednia funkcja zostanie wywołana przez proces administratora.

We współczesnych systemach komputerowych programiści podjęli pewne starania, aby wyłączenie było dostępne dla zwykłego użytkownika pulpitu. Powszechną techniką jest umożliwienie menedżerowi logowania, który zwykle działa w kontekście bezpieczeństwa użytkownika root, obsługi zamykania i ponownego uruchamiania. W takim przypadku powłoka graficzna wysyła do menedżera logowania żądanie wyłączenia komputera. Wiąże się to z wykorzystaniem komunikacji międzyprocesowej (IPC), zwykle za pośrednictwem usługi dbus.

Wyżej wymieniony zestaw zasad rozszerza ten proces, zapewniając ustandaryzowaną strukturę, dzięki której menedżer logowania (lub jakikolwiek program zapewniający usługę zamykania) może sprawdzić, którzy użytkownicy mogą spowodować zamknięcie, i za pomocą których administrator może odpowiednio skonfigurować te uprawnienia.

Niektóre środowiska pulpitu nie używają usług opartych na IPC, ale raczej zestaw programów pomocniczych zapewniających te same lub podobne funkcje. Te programy pomocnicze byłyby wywoływane za pomocą mechanizmów, pozwalających na przejście w kontekst administratora, takich jak sudo, suid lub mechanizm policykit podobny do sudo.

W każdym razie głupi tradycyjny program zamykający w powłoce nie działa w ten sposób. Wymaga to zobaczenia, że ​​jest uruchamiany w kontekście superużytkownika.

Paul Hänsch
źródło
14

Ponieważ Linux jest powszechnie używany jako serwer lub podobny element, a SSHing w Linuksie, nawet zwykły laptop Ubuntu, jest dość powszechny.

Chodzi o to, że możesz nie chcieć, aby osoby z dostępem SSH mogły go zamknąć, szczególnie gdy inni użytkownicy mogą z niego korzystać zdalnie. Ktoś z dostępem do GUI - cóż, i tak może go wyłączyć samodzielnie za pomocą fizycznego przycisku zasilania.

Ponadto zdalnie zalogowany użytkownik nie będzie mógł go ponownie włączyć.

Manishearth
źródło
Nie przyszło mi do głowy, kiedy zadałem to pytanie, ale przypuszczam, że są to opcje w Ubuntu do instalowania pakietów GUI na zdalnym serwerze i używania zdalnego serwera za pomocą GUI zamiast wiersza poleceń. (Podobne do działania pulpitu zdalnego systemu Windows lub narzędzia Teamviewer). Tak więc podważałoby to założenie, że ktoś korzystający z Ubuntu przez GUI może zamknąć system za pomocą fizycznego przycisku zasilania.
Aditya
@aditya, który wymaga skonfigurowania serwera w ten sposób, co administrator musi zdecydować
Manishearth
Tak. Wymagałoby to uprawnień administratora, aby móc zainstalować pakiety i skonfigurować je w razie potrzeby. Ale ten scenariusz przyszedł mi do głowy podczas czytania twojej odpowiedzi wczoraj i pomyślałem, że podzielę się nią z tobą :-)
Aditya
14

Po ponownym uruchomieniu za pomocą GUI mogę to zrobić bez mojego sudohasła.

Tylko jeśli jesteś jedynym zalogowanym. Jeśli są jeszcze inni użytkownicy (w tym użytkownicy konsoli), może być konieczne wprowadzenie hasła roota. To samo dotyczy OS X i nowszych wersji Windows.

Dlaczego? Co się tam dzieje w systemie Ubuntu?

Następujące polecenie:

/usr/bin/dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

D-Bus jest mechanizmem IPC - medium do lokalnej komunikacji między procesami działającymi na tym samym hoście.

D-Bus jest „inteligentniejszy” niż niskopoziomowe protokoły przekazywania wiadomości, takie jak UDP. Z drugiej strony przekazuje wiadomości jako odrębne elementy, a nie ciągłe strumienie danych.

D-Bus ma uporządkowany widok danych, które przenosi i zajmuje się danymi w formie binarnej; liczby całkowite o różnych szerokościach, ciągach i tak dalej. Ponieważ dane nie są tylko „surowymi bajtami” dla D-Bus, komunikaty mogą być sprawdzane.

- Darmowy pulpit

Dlaczego shutdownpolecenie nie sprawdza tylko, czy ktoś jest zalogowany? Szczerze mówiąc, wydaje się to bezcenną cechą. Mogę sobie wyobrazić, że czasami oszczędzałoby to czas, ale często preferowana jest spójna konsola. Nie chcę, aby polecenia czasami wymagały hasła po uruchomieniu, a czasem nie.

Moje zaimki to On / On

Tim
źródło
Istnieje również krótsza wersja za pośrednictwem aplikacji qdbus
Sergiy Kolodyazhnyy
Podczas zamykania / wylogowywania z DE (w tym przypadku GNOME) nie jestem proszony o sudohasło roota / użytkownika ani z innym użytkownikiem zalogowanym przez GDM, ani z innym użytkownikiem zalogowanym przez tty.
ko
@kos hu, to dziwne. Ten zrzut ekranu jest z Gnome 3 i jestem zalogowany na GUI i TTY
Tim
Mam na myśli tę samą wiadomość, ale kliknięcie „Wyłącz” po prostu idzie do przodu i wyłącza system. Poprosiłem też Fabby'ego, aby to przetestował i robi to samo dla niego, nie jestem pewien, o co chodzi.
kos
@kos ohh. Hu trzymaj się.
Tim
9

Powód, dla którego nie musisz być rootem, aby zainicjować zamknięcie z GUI, jest w dużej mierze wygodą dla typowego użytkownika pulpitu. System wie , że jesteś użytkownikiem zalogowanym na konsoli, więc jeśli przypadkowo zamkniesz komputer, prawdopodobnie możesz go ponownie włączyć.

Użytkownik w powłoce może być bardzo dobrze zalogowany zdalnie, więc system wymaga zalogowania jako użytkownik root w celu wydania polecenia zamknięcia. Zapobiega to wyłączeniu go przez zwykłego użytkownika zalogowanego na serwerze, podczas gdy inni ludzie go używają, i choć niekoniecznie jest tam ktoś fizycznie, aby uruchomić komputer ponownie.

Powodem, dla którego zamknięcie nie wyświetla monitu GUI dla hasła superużytkownika, jest prawdopodobnie po prostu fakt, że nie ma tam żadnego prawdziwego narzędzia - jeśli jesteś na konsoli, gdzie pojawi się monit, możesz po prostu użyć trybu zamiast tego menu Wheeel. Jeśli chcesz mieć wiersz polecenia dotyczący hasła superużytkownika do zamykania systemu, jest ono już dostępne w „sudo shutdown”.

Mark Bessey
źródło
5

W systemie z wieloma użytkownikami ostatnią rzeczą, jakiej chcesz, jest zalogowanie się i możliwość losowego ponownego uruchomienia serwera w dowolnym momencie, dlatego wersja Reboot w wierszu poleceń jest poleceniem tylko dla superużytkownika, dlatego musisz być rootem lub mają prawa sudo.

Podobnie jak polecenia Halt i PowerOff.

Jeff Sereno
źródło
2
Dzięki za odpowiedź, rozumiem, że ja, jako użytkownik maszyny używanej przez dziesiątki, nie powinienem być w stanie zrestartować maszyny, ale co robi Ubuntu (lub prawie wszystkie dystrybucje pulpitu), kiedy zdecyduję się na ponowne uruchomienie za pomocą myszy zamiast klawiatury? Pozwalają na to bez przywilejów.
asco
3
Komponenty takie jak systemctl, loginctl, systemd, zasady systemowe itp. Pozwalają obecnie zalogowanemu użytkownikowi uzyskać dostęp do niektórych funkcji roota bez wyraźnego wymagania dostępu roota, aby uczynić pulpit bardziej przyjaznym dla użytkownika, ale nie muszą one wywoływać wiersza poleceń polecenia do wykonania tych zadań.
Jeff Sereno,