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