Dlaczego nie mogę wykonać zamykania, gdy uprawnienie to rwxr-xr-x?

34

Jestem /sbini widzę, że shutdownma uprawnienia rwxr-xr-x. Czy to nie oznacza, że ​​każdy może to wykonać?

Korgan Rivera
źródło
1
jakie polecenie wykonałeś i jaki masz błąd?
slayedbylucifer
Myślę, że mówi o shutdownpoleceniu.
Vinz
Uruchomiłem ./shutdown +30. Pojawia się komunikat „zamknięcie: trzeba być rootem”. Jeśli jednak uprawnienia mówią, że każdy może wykonać, dlaczego muszę być rootem?
Korgan Rivera,
Zgaduję, że każdy może wyłączyć maszynę. Podobnie jak w interfejsie GUI, każdy może go również wyłączyć. Ale jeśli mówisz, że musisz być rootem, to nie wiem. Dobre pytanie.
Kevdog777,
4
@ Kevdog777: Zarządza tym w GUI PolicyKit. Jest to demon z uprawnieniami administratora, który sprawdzi, czy możesz go używać shutdown.
Vinz

Odpowiedzi:

76

Każdy może wykonać shutdown, ale uruchomienie zamknięcia systemu wymaga uprawnień roota. Ale shutdownnie jest setuid, więc tylko root może go z powodzeniem wykonać. shutdownProgram jest na tyle miły, by sprawdzić swoje przywileje i poinformować, jeśli nie jest to problem, ale nawet jeśli to naiwnie próbuje zamknąć systemu, nic się nie stanie.

GLENDOWER: Mogę przywoływać duchy z paskudnej głębi.
HOTSPUR: Cóż, ja też mogę, podobnie jak każdy mężczyzna; Ale czy przyjdą, kiedy ich wezwiesz?
(od Henryka IV)

shutdownnie różni się od /bin/rm. Każdy może to wykonać, ale zwykły użytkownik nie może usunąć /etckatalogu domowego innego użytkownika.

W szczególności: Tylko proces działający z uprawnieniami administratora (efektywny UID 0) może skierować system init do zatrzymania usług systemowych, zakończenia wszystkich procesów użytkownika i wykonania wywołania systemowego, które faktycznie zatrzymuje maszynę. (Gdyby shutdownbył setuid, działałby jako root bez względu na to, kto go wywołuje; ale tak nie jest.)

Co shutdownz dzwonieniem z GUI, np. Z control-alt-del? Ważne jest, aby zdawać sobie sprawę, że w takim przypadku shutdownjest uruchamiany bezpośrednio przez initi działa z uprawnieniami administratora. Aby każdy, kto podejdzie do konsoli, mógł ją potencjalnie wyłączyć. Jeśli nie jest to pożądane, polecenie control-alt-delete faktycznie zostanie uruchomione shutdown -a. (Zobacz dokumentację, którą @ some1 zacytował w swojej odpowiedzi). Mówi shutdownto o sprawdzeniu, czy aktualnie zalogowany użytkownik jest uprawniony do jego uruchomienia. Jest to istotne tylko dlatego, shutdownże w tym scenariuszu działa jako root.

Alexis
źródło
2
Wyjaśnienie: Każdy może uruchomić program shutdown, ale ten program nie może faktycznie uruchomić systemu, chyba że bieżący użytkownik ma uprawnienia roota. Dobrze?
LarsH,
1
To właściwie tyle. Programy działają z uprawnieniami wywołującego użytkownika, chyba że są setuid. Zamykanie systemu wymaga uprawnień roota, więc nie możesz też napisać własnego programu (z wyjątkiem wykorzystania luk bezpieczeństwa itp.).
Alexis,
Co oznacza „zamknięcie nie jest setuid”?
Iain Samuel McLean Starszy
1
@Iain, programy są zwykle uruchamiane z uprawnieniami użytkownika, który je wywołuje. Tak jest również w przypadku shutdown. Program setuid jest uruchamiany z uprawnieniami użytkownika, który jest właścicielem pliku wykonywalnego. Na przykład /etc/passwddziała z uprawnieniami administratora, aby umożliwić modyfikację pliku hasła. Zobacz stronę dla chmod.
Alexis
To powinno być „ /usr/bin/passwddziała z uprawnieniami roota”! /etc/passwdnie jest wykonywalny (modyfikowany jest „plik haseł”).
Alexis
15

Sam plik binarny shutdownsprawdza, czy Twój UID ma wartość 0.

Zobacz dane wyjściowe strace:

strace /sbin/shutdown -r -h now
...
...
geteuid()                               = 10001
setuid(10001)                           = 0
getuid()                                = 10001
write(2, "shutdown: Need to be root\n", 26shutdown: Need to be root
) = 26
exit_group(1)                           = ?
chaos
źródło
4
+1 za pokazanie użycia strace ... jest to przydatne. Jednak nie widzę, jak ten ślad pokazuje, że shutdownsprawdza, czy Twój identyfikator UID wynosi 0.
LarsH
1
Nie zobaczysz tego w wyjściu strace, ponieważ raportuje tylko wywołania systemowe. Możesz wywnioskować, że gdy ściśle przestrzegane jest getuid, zapisuje komunikat o błędzie podobny do kodu if(getuid() != 0) printf("Need to be root");. Który w rzeczywistości pokazuje kod źródłowy.
msw
5

Tak ! Każdy może uruchomić to polecenie. Jak powiedziałeś, możesz go uruchomić, ale pojawia się komunikat „Musisz być rootem”, a nie permission denied. Do shutdownkontroli Dowodzenie UIDzobaczyć jeśli jesteś korzeń, czy nie.

Vinz
źródło
-1

Wygląda na to, że zamknięcie sprawdzi listę dostępu, jeśli oflagujesz ją za pomocą opcji -a:

ACCESS CONTROL
       shutdown can be called from init(8) when the magic keys CTRL-ALT-DEL are pressed, by creating an appropriate entry in /etc/inittab. This means that every‐
       one who has physical access to the console keyboard can shut the system down. To prevent this, shutdown can check to see if an authorized user  is  logged
       in  on  one of the virtual consoles. If shutdown is called with the -a argument (add this to the invocation of shutdown in /etc/inittab), it checks to see
       if the file /etc/shutdown.allow is present.  It then compares the login names in that file with the list of people that are logged in on a virtual console
       (from /var/run/utmp). Only if one of those authorized users or root is logged in, it will proceed. Otherwise it will write the message

       shutdown: no authorized users logged in

       to  the  (physical)  system  console.  The  format  of  /etc/shutdown.allow is one user name per line. Empty lines and comment lines (prefixed by a #) are
       allowed. Currently there is a limit of 32 users in this file.

Ponieważ obecnie wywołujesz go bez flagi -a, domyślnie zezwala tylko na zamykanie systemu root.

Jeśli chcesz, aby dodatkowi użytkownicy mogli uruchomić polecenie, skonfiguruj ten plik i użyj flagi.

Why can't I execute shutdown when the permission is rwxr-xr-x?

Bity uprawnień niekoniecznie wykluczają kontrolę dostępu w oparciu o użytkownika lub grupę.

some1
źródło
Wywołanie go za -apomocą wiersza polecenia nie robi różnicy: shutdown -anadal musi być wykonywane z uprawnieniami roota (które initdostarcza na control-alt-del).
Alexis