GNU/Linux >> Znalost Linux >  >> Linux

Jak fungují vnitřnosti sudo?

Jak funguje sudo pracovat interně? Jak je možné, že se může stát rootem, aniž by měl heslo root, na rozdíl od su ? Jaká systémová volání atd. jsou zapojena do procesu? Není to zející bezpečnostní díra v Linuxu (např. proč jsem nemohl zkompilovat silně opravené sudo který prostě dělal cokoli běžného sudo ano, ale nepožádal o heslo neprivilegovaného uživatele)?

Přečetl jsem si login a su internals. Také jsem četl Jak je sudo určeno k použití? ale navzdory názvu se zabývají hlavně rozdíly mezi su a sudo .

Přijatá odpověď:

Pokud se podíváte na spustitelný soubor sudo :

$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun  3  2011 /usr/bin/sudo

Všimnete si, že nese bity oprávnění ---s--x--x . Lze je rozdělit následovně:

-|--s|--x|--x
-      - first dash denotes if a directory or a file ("d" = dir, "-" = file)  
--s    - only the setuid bit is enabled for user who owns file
--x    - only the group execute bit is enabled
--x    - only the other execute bit is enabled

Takže když má program povolený bit setuid (také označovaný jako SUID), znamená to, že když někdo spustí tento program, poběží s přihlašovacími údaji uživatele, který vlastní soubor, aka. root v tomto případě.

Příklad

Pokud spustím následující příkaz jako uživatel saml:

$ whoami
saml

$ sudo su -
[sudo] password for saml: 

Všimnete si, že provedení sudo ve skutečnosti běží jako root:

$ ps -eaf|grep sudo
root     20399  2353  0 05:07 pts/13   00:00:00 sudo su -

mechanismus nastavení

Pokud vás zajímá, jak SUID funguje, podívejte se na man setuid . Zde je výňatek z manuálové stránky, který to vysvětluje lépe, než bych mohl:

setuid() nastavuje efektivní ID uživatele volajícího procesu. Pokud je
efektivní UID volajícího root, nastaví se také skutečné UID a uložené
set-user-ID. V Linuxu je setuid() implementováno jako
verze POSIX s funkcí _POSIX_SAVED_IDS. To umožňuje programu
set-user-ID (jiného než root) zrušit všechna svá uživatelská
oprávnění, provádět nějakou neprivilegovanou práci a poté znovu zapojit původní
efektivní ID uživatele v bezpečným způsobem.

Pokud je uživatel root nebo je program set-user-ID-root, je třeba věnovat zvláštní pozornost
. Funkce setuid() kontroluje efektivní ID uživatele
volajícího, a pokud je to superuživatel, všechna uživatelská ID související s procesem
jsou nastavena na uid. Poté, co k tomu dojde, je nemožné, aby program
znovu získal oprávnění root.

Klíčovým konceptem je, že programy mají skutečné uživatelské ID (UID) a efektivní (EUID). Setuid nastavuje efektivní ID uživatele (EUID), když je tento bit povolen.

Související:Ssh – Jak funguje tcp-keepalive v ssh?

Takže z pohledu jádra je známo, že v našem příkladu saml je stále původním vlastníkem (UID), ale EUID bylo nastaveno u kohokoli, kdo je vlastníkem spustitelného souboru.

setgid

Měl bych také zmínit, že když rozdělujeme oprávnění pro příkaz sudo, druhá skupina bitů byla pro skupinová oprávnění. Bity skupiny mají také něco podobného jako setuid s názvem set group id (aka. setgid, SGID). Dělá to totéž jako SUID s tím rozdílem, že se proces spouští s přihlašovacími údaji skupiny namísto přihlašovacích údajů vlastníka.

Odkazy

  • stránka wikipedie setuid
  • manuálovou stránku setuid

Linux
  1. Jak přeinstalovat nejnovější verzi cmake?

  2. Jak fungují volby '-s', '-t' a '-c' příkazu tr v Unixu?

  3. Jak funguje rozhraní zpětné smyčky

  1. Jak spustit příkaz jako správce systému (root)?

  2. Jak zpětně zajistit, aby skript běžel jako root?

  3. Jak změnit heslo root mysql

  1. Jak přinutím sudo, aby požádal o heslo uživatele root?

  2. Jak bezpečný je NOPASSWD v režimu sudo bez hesla?

  3. Jak jádro připojí kořenový oddíl?