Czy konto root ma zawsze UID / GID 0?

50

Na wszystkich systemach Linux, którymi zarządzałem, konto root ma identyfikator GID i UID równy 0. Czy to jest gwarantowane, czy też możliwe jest, że system nada rootowi inny identyfikator?

Tanaki
źródło
3
ID 0 ma wszystkie prawa. Rzeczywista nazwa (lub nazwy -multiple-) może się różnić. Np. Mój serwer ma dwóch użytkowników UID 0. Jeden o nazwie „root”, drugi o nazwie „toor”.
Hennes

Odpowiedzi:

80

Twoje pytanie składa się z dwóch części .

Czy konto superużytkownika zawsze ma uid / gid 0/0 w systemie Linux?

Tak. Jak zauważył Rich Homolka w komentarzu , w jądrze znajduje się kod, który jawnie sprawdza uid 0, gdy trzeba sprawdzić użytkownika root, co oznacza, że ​​root zawsze ma przynajmniej uid 0.

Czy nazwa konta użytkownika z identyfikatorem UID 0 jest zawsze root?

Nie. root To tylko nazwa wymieniona w / etc / passwd lub innym sklepie z uwierzytelnianiem. Równie dobrze możesz zadzwonić na konto admin, a sam system operacyjny nie będzie się tym przejmował, ale niektóre aplikacje mogą go nie lubić, ponieważ oczekują, że istnieje konto uprzywilejowane o nazwie root. Wywoływanie konta uid 0 na * nix rootjest bardzo silną konwencją, ale nie jest wymagane przez system (chociaż może być wymagane przez niektóre oprogramowanie użytkownika, w tym również narzędzia administracyjne systemu).

Warto również zauważyć, że, jak podkreślił Simon Richter , na BSD tam często istnieje drugi uid 0 konto, umownie nazwany toor(który jest „root” wspak, a także leksykalnie przychodzi po root w lista posortowana alfabetycznie). Na przykład FreeBSD używa go, aby zapewnić użytkownikowi rootowi niestandardowe ustawienie powłoki, pozostawiając użytkownikowi rootowi domyślną powłokę, która na pewno istnieje na głównej partycji systemu (przydatna do celów odzyskiwania).

CVn
źródło
15
W jądrze znajduje się kod do sprawdzenia root, uid == 0. Tak, jest na stałe zakodowany i trwały.
Rich Homolka
1
BSD zazwyczaj ma rooti toor, zarówno z UID 0.
Simon Richter
@ SimonRichter W takim przypadku istnieje konto administratora o nazwie root, więc nie ma problemu, dopóki biblioteki sklepu uwierzytelniania nie będą mylone z dwoma użytkownikami o tym samym UID (w takim przypadku BSD nie zrobiłyby tego, że sposób, inaczej biblioteki zostaną naprawione).
CVn
W jądrze znajduje się kod, który używa UID = 0 jako reprezentatywnego dla roota i przechowuje go w zmiennych o nazwie „root_uid”, ale nie znalazłem niczego (6 lat później), co faktycznie zależy od tego, czy użytkownik nazywa się „root”. Niezależnie od tego, czy identyfikator UID znajduje się w / etc / passwd, czy nie, ostatecznie zostaną uruchomione procesy z / UID = 0. :)
dannysauer
15

1) administrator jest zawsze uid == 0. Jest to zakodowane w jądrze. Aby to zmienić, potrzeba trochę kodowania w jądrze. Nie ma to wiele sensu, więc nie zostało to zrobione. Na przykład byłoby niespójne w przypadku innych unixów korzystających na przykład z tego samego NFS.

2) Uid 0 niekoniecznie odwzorowuje na root. Najlepszym przykładem jest FreeBSD. Ma dwa konta UID == 0, z tą różnicą, że jest powłoką. root ma powłokę / bin / sh, która jest prostą powłoką, przydatną, gdy dyski są uszkodzone i potrzebujesz fsck / usr. toor używa tcsh, który jest znacznie bardziej użyteczny w sytuacjach innych niż nagłe, ponieważ ma takie rzeczy jak historia itp.

Kolejny, bardziej osobisty przykład; jedno zadanie miałem, gdzie mieli konto root equiv (tj. uid = 0) przez NIS. Hasło puste! Ponieważ nowy sysadmin nie mógł zapamiętać hasła roota na komputerach. Krzyczałem na ten temat z oczywistych powodów (hasła NIS z definicji nie mogą ukryć ich pustki). Nie podobało mi się to konto.

I tak naprawdę to nie system, który daje UID 0 to root, to ty. Zmieniasz to za pomocą plików passwd lub innych katalogów nazw (NIS, ldap), ale nie jest to skompilowane. Chociaż powinieneś mieć co najmniej jedno konto uid 0 w / etc / passwd, ponieważ możesz nie mieć sieci, kiedy naprawdę tego potrzebujesz .

Zatem root to zawsze uid 0, ale uid 0 niekoniecznie zawsze jest root.

Rich Homolka
źródło
1
O, ból związany z wybraniem tylko jednej zaakceptowanej odpowiedzi ...
Tanaki,
5
@Tanaki Ogólnie „zaakceptuj” odpowiedź, która najbardziej pomogła Ci odpowiedzieć na pytanie, i głosuj za wszystkimi odpowiedziami, które uznałeś za przydatne. Nic nie mówi, że musisz zaakceptować najlepiej głosowaną lub pierwszą pisemną odpowiedź.
CVn
1

Cóż, dla systemów, które używają serwera nonStop, ROOT_UID to nie 0, ale 65535.

Użytkownicy i grupy OSS Środowisko OSS nie udostępnia wspólnych domyślnych nazw użytkowników i identyfikatorów użytkowników UNIX, chyba że są one jawnie utworzone przez administratora witryny. Istnieją jednak równoważne nazwy użytkowników i identyfikatory użytkowników OSS. Na przykład uprawnienia zwykle związane z katalogiem głównym użytkownika UNIX i identyfikatorem użytkownika 0 istnieją dla identyfikatora użytkownika OSS (UID) 65535 (super ID), którym jest użytkownik SUPER.SUPER i jego aliasy.

Zobacz https://h20195.www2.hpe.com/V2/GetPDF.aspx/4AA4-6316ENW.pdf

W coreutils możesz znaleźć ten plik nagłówkowy root-uid.h:

/* The user ID that always has appropriate privileges in the POSIX sense.

   Copyright 2012-2016 Free Software Foundation, Inc.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.

   Written by Paul Eggert.  */

#ifndef ROOT_UID_H_
#define ROOT_UID_H_

/* The user ID that always has appropriate privileges in the POSIX sense.  */
#ifdef __TANDEM
# define ROOT_UID 65535
#else
# define ROOT_UID 0
#endif

#endif
Nuxwin
źródło