Jak používat SUID, SGID a Sticky Bits v Linuxu

SUID, SGID a Sticky Bits jsou výkonná speciální oprávnění, která můžete nastavit pro spustitelné soubory a adresáře v Linuxu. Podělíme se o výhody – a možná úskalí – jejich používání.

Už se používají

Zabudování zabezpečení do víceuživatelského operačního systému představuje několik problémů. Vezměte si například (zdánlivě) základní koncept hesel. Všechny musí být uloženy, takže pokaždé, když se někdo přihlásí, systém může porovnat heslo, které zadá, s uloženou kopií. Je zřejmé, že protože hesla jsou klíčem ke království, musí být chráněna.

V Linuxu jsou uložená hesla chráněna dvěma způsoby: jsou zašifrována a k souboru obsahujícímu hesla má přístup pouze někdo s oprávněními root. To může znít dobře, ale představuje to úskalí: Pokud mají k uloženým heslům přístup pouze lidé s právy root, jak si změní hesla ti, kteří tento přístup nemají?

Zvyšování vašeho stavu

Příkazy a programy Linuxu se obvykle spouštějí se stejnou sadou oprávnění jako osoba, která program spouští. Když root spustí příkaz passwd změnit heslo, běží s oprávněními root. To znamená, že příkaz passwd může volně přistupovat k uloženým heslům v souboru /etc/shadow.

Ideální by bylo schéma, ve kterém by kdokoli v systému mohl spustit program passwd, ale aby si program passwd ponechal zvýšená oprávnění roota. To by umožnilo komukoli změnit své vlastní heslo.

Výše uvedený scénář je přesně to, co dělá bit Set User ID (SUID). To spouští programy a příkazy s oprávněními vlastníka souboru, nikoli s oprávněními osoby, která program spouští.

Zvyšujete stav programu

Je tu však ještě jeden problém. Osobě musí být zabráněno vměšovat se do hesla někoho jiného. Linux obsahuje schéma SUID, které mu umožňuje spouštět aplikace se sadou dočasně vypůjčených oprávnění – ale to je jen polovina příběhu o zabezpečení.

Kontrolní mechanismus, který někomu brání v práci s heslem jiné osoby, je obsažen v programu passwd, nikoli v operačním systému a schématu SUID.

Programy, které běží se zvýšenými oprávněními, mohou představovat bezpečnostní rizika, pokud nejsou vytvořeny s ohledem na „bezpečnost již od návrhu“. To znamená, že bezpečnost je první věcí, kterou zvažujete, a pak na tom stavíte. Nepište svůj program a pak se mu nesnažte dodat bezpečnostní vrstvu.

Největší výhodou open source softwaru je můžete se sami podívat na zdrojový kód nebo se podívejte na jeho důvěryhodné recenze. Ve zdrojovém kódu programu passwd jsou kontroly, takže můžete vidět, zda osoba spouštějící program je root. Pokud je někdo root (nebo někdo používá sudo), jsou povoleny různé možnosti.

Tento je kód, který zjišťuje, zda je někdo root.

Následuje příklad, ve kterém je to vzato v úvahu. Protože root může změnit jakékoli heslo, program se nemusí obtěžovat kontrolami, které obvykle provádí, aby zjistil, která hesla má daná osoba ke změně. Takže pro roota přeskočí tyto kontroly a ukončí kontrolní funkci.

Úryvek zdrojového kódu z

Díky základním příkazům a pomůckám Linuxu si můžete být jisti, že mají v sobě zapečeno zabezpečení a že kód byl mnohokrát zkontrolován. Samozřejmě vždy existuje hrozba dosud neznámých exploitů. Záplaty nebo aktualizace se však rychle objevují, aby čelily jakýmkoli nově zjištěným zranitelnostem.

Je to software třetích stran – zvláště jakýkoli, který není open-source – s používáním SUID musíte být extrémně opatrní. Neříkáme, že to nedělejte, ale pokud to uděláte, chcete se ujistit, že to nevystaví váš systém riziku. Nechcete povýšit oprávnění programu, který nebude správně řídit sám sebe a osobu, která jej provozuje.

Linuxové příkazy, které používají SUID

Následuje několik příkazů Linuxu, které používají bit SUID k udělení zvýšených oprávnění příkazu, když je spouští běžný uživatel:

ls -l /bin/su
ls -l /bin/ping
ls -l /bin/mount
ls -l /bin/umount
ls -l /usr/bin/passwd

Všimněte si, že názvy souborů jsou zvýrazněny červeně, což znamená, že je nastaven bit SUID.

Oprávnění k souboru nebo adresáři jsou obvykle reprezentována třemi skupinami po třech znacích: rwx. Ty znamenají čtení, zápis a spouštění. Pokud jsou dopisy přítomny, bylo toto povolení uděleno. Pokud je však místo písmene přítomen pomlčka (-), toto oprávnění nebylo uděleno.

Existují tři skupiny těchto oprávnění (zleva doprava): oprávnění pro vlastníka souboru, pro členy skupiny souboru a pro ostatní. Když je na souboru nastaven bit SUID, „s“ představuje oprávnění vlastníka ke spuštění.

Pokud je bit SUID nastaven na soubor, který nemá spustitelné funkce, velké „S“ to označuje.

Podívejme se na příklad. Běžný uživatel dave zadá příkaz passwd:

passwd

The

Příkaz passwd vyzve dave k zadání nového hesla. Můžeme použít příkaz ps zobrazit podrobnosti o běžících procesech.

Použijeme ps s grep v jiném okně terminálu a vyhledejte proces passwd. Použijeme také volby -e (každý proces) a -f (plný formát) s ps.

Zadáme následující příkaz:

ps -e -f | grep passwd

The

Jsou hlášeny dva řádky, z nichž druhý je proces grep, který hledá příkazy s řetězcem „passwd“. Je to první řádek, který nás zajímá, protože to je ten pro proces passwd, který spustil dave.

Vidíme, že proces passwd běží stejně, jako kdyby jej spustil root.

Nastavení bitu SUID

Je snadné změnit bit SUID pomocí chmod. Symbolický režim u+s nastavuje bit SUID a symbolický režim us vymaže bit SUID.

Pro ilustraci některých konceptů bitu SUID jsme vytvořili malý program nazvaný htg. Je v kořenovém adresáři uživatele dave a nemá nastaven bit SUID. Když je spuštěn, zobrazí skutečné a efektivní uživatelské ID (UID).

Skutečný UID patří osobě, která program spustila. Efektivní ID je účet, u kterého se program chová, jako by byl spuštěn.

Zadáme následující:

ls -lh htg
./htg

The

Když spustíme místní kopii programu, vidíme, že skutečné a efektivní ID jsou obě nastaveny na dave. Takže se to chová stejně jako normální program.

Zkopírujeme jej do adresáře /usr/local/bin, aby jej mohli používat ostatní.

Zadáme následující, pomocí chmod nastavíme bit SUID a poté zkontrolujeme, zda byl nastaven:

sudo cp htg /usr/local/bin
sudo chmod u+s /usr/local/bin/htg
ls -hl /usr/local/bin/htg

The

Program se tedy zkopíruje a nastaví se bit SUID. Spustíme to znovu, ale tentokrát spustíme kopii ve složce /usr/local/bin:

htg

The

I když dave spustil program, efektivní ID je nastaveno na uživatele root. Pokud tedy Marie spustí program, stane se totéž, jak je uvedeno níže:

htg

The

Skutečné ID je Mary a efektivní ID je root. Program běží s oprávněními uživatele root.

Bit SGID

Bit Set Group ID (SGID) je velmi podobný bitu SUID. Když je u spustitelného souboru nastaven bit SGID, efektivní skupina je nastavena na skupinu souboru. Proces běží s oprávněními členů skupiny souboru, nikoli s oprávněními osoby, která jej spustila.

Vylepšili jsme náš htg program tak, aby také ukazoval efektivní skupinu. Změníme skupinu programu htg na výchozí skupinu uživatele mary, mary. K odstranění bitu SUID a nastavení SGID také použijeme symbolické režimy us a g+s s chown.

Za tímto účelem zadáme následující:

sudo chown root:mary /usr/local/bin/htg
sudo chmod u-s,g+s /usr/local/bin/htg
ls -lh /usr/local/bin/htg

The

Můžete vidět bit SGID označený „s“ ve skupinových oprávněních. Všimněte si také, že skupina je nastavena na mary a název souboru je nyní zvýrazněn žlutě.

Než spustíme program, pojďme zjistit, do kterých skupin dave a mary patří. Použijeme příkaz id s volbou -G (skupiny), vytisknout všechna ID skupin. Potom spustíme htg program jako dave.

Zadáme následující příkazy:

id -G dave
id -G mary
htg

The

ID výchozí skupiny pro mary je 1001 a efektivní skupina programu htg je 1001. Takže ačkoliv byl spuštěn davem, běží s oprávněními členů ve skupině mary. Je to stejné, jako kdyby se dave přidal ke skupině Mary.

Aplikujme bit SGID na adresář. Nejprve vytvoříme adresář s názvem „work“ a poté změníme jeho skupinu na „geek“. Poté nastavíme bit SGID v adresáři.

Když ke kontrole nastavení adresáře použijeme ls, použijeme také volbu -d (adresář), abychom viděli podrobnosti o adresáři, nikoli jeho obsah.

Zadáme následující příkazy:

sudo mkdir work
sudo chown dave:geek work
sudo chmod g+s work
ls -lh -d work

The

Jsou nastaveny bit SGID a skupina „geek“. Ty ovlivní všechny položky vytvořené v pracovním adresáři.

Zadáme následující, abychom vstoupili do pracovního adresáře, vytvořili adresář s názvem „demo“ a zkontrolovali jeho vlastnosti:

cd work
mkdir demo
ls -lh -d demo

The

Bit SGID a skupina „geek“ se automaticky použijí v adresáři „demo“.

Chcete-li vytvořit soubor s příponou, zadejte následující dotek příkaz a zkontrolujte jeho vlastnosti:

touch useful.sh
ls -lh useful.sh

The

Skupina nového souboru je automaticky nastavena na „geek“.

Sticky Bit

Lepkavý bit dostal své jméno podle svého historického účelu. Když je nastaven na spustitelný soubor, oznámil operačnímu systému, že textové části spustitelného souboru by měly být uloženy ve swapu, což urychlilo jejich opětovné použití. V Linuxu má lepivý bit vliv pouze na adresář – jeho nastavení na soubor by nedávalo smysl.

Když nastavíte lepivý bit na adresář, lidé mohou mazat pouze soubory, které jim patří v tomto adresáři. Nemohou smazat soubory, které patří někomu jinému, bez ohledu na to, jaká kombinace oprávnění k souborům je u souborů nastavena.

To vám umožní vytvořit adresář, který může každý – a procesy, které spouští – používat jako sdílené úložiště souborů. Soubory jsou chráněny, protože opět nikdo nemůže smazat soubory někoho jiného.

Vytvořme adresář s názvem „shared“. Použijeme symbolický režim o+t s chmod k nastavení lepivého bitu v tomto adresáři. Poté se podíváme na oprávnění v tomto adresáři a také na adresáře /tmp a /var/tmp.

Zadáme následující příkazy:

mkdir shared
sudo chmod o+t shared
ls -lh -d shared
ls -lh -d /tmp
ls -lh -d /var/tmp

The

Pokud je nastaven lepivý bit, spustitelný bit „jiné“ sady oprávnění k souboru je nastaven na „t“. Název souboru je také zvýrazněn modře.

Složky /tmp a /var/tmp jsou dva příklady adresářů, které mají všechna oprávnění k souborům nastavena pro vlastníka, skupinu a další (proto jsou zvýrazněny zeleně). Používají se jako sdílená umístění pro dočasné soubory.

S těmito oprávněními by teoreticky měl být kdokoli schopen dělat cokoli. Lepivý kousek je však přepíše a nikdo nemůže smazat soubor, který mu nepatří.

Připomenutí

Následuje rychlý kontrolní seznam toho, co jsme probrali výše pro budoucí použití:

SUID funguje pouze na soubory.
SGID můžete použít na adresáře a soubory.
Lepivý bit můžete použít pouze na adresáře.
Pokud se indikátory „s“, „g“ nebo „t“ zobrazují velkými písmeny, nebyl nastaven spustitelný bit (x).