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

Speciální oprávnění SUID, SGID a Sticky Bit jsou mocné nástroje, které lze použít pro nastavení přístupových práv ke spustitelným souborům a adresářům v operačním systému Linux. Pojďme se podívat na výhody a potenciální rizika spojená s jejich používáním.

Běžné použití těchto oprávnění

Implementace zabezpečení v prostředí více uživatelů představuje několik specifických výzev. Vezměme si jako příklad (na první pohled) jednoduchou záležitost, jako jsou hesla. Všechna hesla musí být někde uložena, aby systém mohl porovnat heslo zadané při přihlašování s jeho uloženou verzí. Je jasné, že protože hesla jsou klíčem k přístupu k systému, musí být náležitě chráněna.

V Linuxu jsou hesla chráněna dvěma základními způsoby: jsou šifrovaná a přístup k souboru s hesly má pouze uživatel s oprávněním roota. To sice zní rozumně, ale ukrývá to jeden problém: Pokud mají přístup k uloženým heslům jen uživatelé s právy roota, jak si mohou měnit hesla ti, kteří tato práva nemají?

Získávání vyšších oprávnění

Linuxové příkazy a programy obvykle běží s oprávněními uživatele, který daný program spustil. Když root spustí příkaz passwd pro změnu hesla, běží tento příkaz s root oprávněními. To znamená, že příkaz passwd má neomezený přístup k uloženým heslům v souboru /etc/shadow.

Ideální řešení by bylo takové, aby každý uživatel v systému mohl spustit program passwd, ale aby program passwd běžel se zvýšenými oprávněními roota. To by umožnilo každému uživateli měnit si vlastní heslo.

A přesně to je funkce bitu Set User ID (SUID). Umožňuje spouštět programy a příkazy s oprávněními vlastníka souboru, nikoliv s oprávněními uživatele, který program spustil.

Zvyšování oprávnění aplikací

Je tu však ještě jeden aspekt, který je potřeba vyřešit. Je nutné zabránit uživatelům, aby mohli manipulovat s hesly ostatních uživatelů. Linux má sice mechanismus SUID, který dovoluje spouštět aplikace s dočasně propůjčenými oprávněními, ale to je jen část příběhu o zabezpečení.

Kontrolní mechanismus, který zabraňuje neoprávněné manipulaci s cizími hesly, je implementován přímo v programu passwd, nikoli v samotném operačním systému a jeho 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 prioritou „zabezpečení od počátku“. To znamená, že bezpečnost je první věcí, na kterou se programátor zaměří, a teprve poté staví na tomto základu. Není vhodné nejdříve program vytvořit a teprve pak se snažit přidat bezpečnostní prvky.

Největší výhodou open-source softwaru je, že si každý může prohlédnout zdrojový kód a posoudit jeho bezpečnost. Zdrojový kód programu passwd obsahuje kontroly, které ověřují, zda je uživatel spouštějící program skutečně root. Pokud je uživatel root (nebo používá sudo), jsou povoleny jiné možnosti.

Zde se nachází kód, který kontroluje, zda je uživatel root.

Zde je příklad, který ilustruje jak tyto kontroly fungují. Protože uživatel root může změnit jakékoliv heslo, program nemusí provádět kontroly, které jsou obvykle potřebné ke zjištění, která hesla má daný uživatel oprávnění změnit. Uživatel root tedy tyto kontroly přeskočí a kontrolní funkce se ukončí.

S důvěryhodnými příkazy a nástroji Linuxu si můžete být jistí, že mají v sobě zabudované bezpečnostní mechanismy a že jejich kód prošel důkladnou kontrolou. Samozřejmě vždy existuje riziko dosud neznámých zranitelností. Nicméně, aktualizace a záplaty jsou obvykle velmi rychle k dispozici, aby se vyrovnaly s nově objevenými chybami.

U softwaru od třetích stran – zejména u toho, který není open-source – je potřeba být při používání SUID velmi opatrný. Neříkáme, že byste ho neměli používat, ale pokud to uděláte, musíte se ujistit, že nevystavujete svůj systém nebezpečí. Nechcete přidělit vyšší oprávnění programu, který nedokáže správně spravovat sám sebe a uživatele, který ho spouští.

Linuxové příkazy využívající SUID

Následuje několik příkladů Linuxových příkazů, které využívají bit SUID k udělení vyšších oprávnění, 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ž signalizuje, že bit SUID je nastaven.

Oprávnění k souboru nebo adresáři se obvykle reprezentují třemi skupinami po třech znacích: rwx. Ty představují čtení, zápis a spuštění. Pokud je písmeno přítomno, příslušné oprávnění je uděleno. Pokud je místo písmene pomlčka (-), toto oprávnění uděleno není.

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í. Pokud je na souboru nastaven bit SUID, je oprávnění ke spuštění pro vlastníka reprezentováno znakem „s“.

Pokud je bit SUID nastaven na soubor, který nemá spustitelné funkce, je to označeno velkým písmenem „S“.

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

passwd

Příkaz passwd vyzve uživatele dave k zadání nového hesla. Pomocí příkazu ps můžeme zobrazit podrobnosti o běžících procesech.

Použijeme ps s grep v jiném okně terminálu a vyhledáme proces passwd. S ps použijeme i volby -e (všechny procesy) a -f (plný formát).

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

ps -e -f | grep passwd

Zobrazí se dva řádky. Druhý řádek reprezentuje proces grep, který hledá příkazy s řetězcem „passwd“. První řádek je ten, který nás zajímá, protože se jedná o proces passwd spuštěný uživatelem dave.

Vidíme, že proces passwd běží, jako by ho spustil uživatel root.

Nastavení bitu SUID

Bit SUID lze snadno změnit pomocí příkazu chmod. Symbolický režim u+s nastaví bit SUID a režim u-s bit SUID vymaže.

Pro ilustraci některých konceptů SUID bitu jsme vytvořili malý program s názvem htg. Nachází se v domovském adresáři uživatele dave a nemá nastavený bit SUID. Po spuštění zobrazí skutečné a efektivní uživatelské ID (UID).

Skutečný UID patří uživateli, který program spustil. Efektivní ID je účet, pod kterým se program tváří, že běží.

Zadáme následující:

ls -lh htg
./htg

Při spuštění lokální kopie programu vidíme, že skutečné i efektivní ID jsou nastaveny na dave. Chová se tedy jako běžný program.

Zkopírujeme program do adresáře /usr/local/bin, aby ho mohli používat i ostatní uživatelé.

Zadáme následující příkazy, pomocí chmod nastavíme bit SUID a poté ověříme, zda byl nastaven:

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

Program je zkopírován a bit SUID je nastaven. Spustíme ho znovu, ale tentokrát spustíme kopii v adresáři /usr/local/bin:

htg

Přestože program spustil uživatel dave, efektivní ID je nastaveno na uživatele root. Pokud program spustí uživatelka „mary“, stane se to samé, jak je uvedeno níže:

htg

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) funguje velmi podobně jako bit SUID. Pokud je na spustitelném 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 uživatele, který ho spustil.

Vylepšili jsme náš program htg tak, aby zobrazoval i efektivní skupinu. Změníme skupinu programu htg na výchozí skupinu uživatelky mary, tedy mary. K odstranění bitu SUID a nastavení bitu SGID použijeme symbolické režimy u-s a g+s s příkazem chown.

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

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

Před spuštěním programu zjistíme, do jakých skupin patří uživatelé dave a mary. Použijeme příkaz id s volbou -G (skupiny), pro zobrazení všech skupinových ID. Poté spustíme program htg jako uživatel „dave“.

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

id -G dave
id -G mary
htg

ID výchozí skupiny pro „mary“ je 1001 a efektivní skupina programu htg je 1001. Přestože program spustil uživatel „dave“, běží s oprávněními členů skupiny „mary“. Je to, jako by se „dave“ stal členem skupiny „mary“.

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

Když pomocí příkazu ls kontrolujeme nastavení adresáře, použijeme také volbu -d (adresář), abychom viděli podrobnosti o adresáři, nikoli o jeho obsahu.

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

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

Bit SGID a skupina „geek“ jsou nastaveny. Toto nastavení ovlivní všechny položky, které budou vytvořeny v adresáři „work“.

Zadáme následující příkazy pro vstup do adresáře „work“, vytvoření adresáře „demo“ a kontrolu jeho vlastností:

cd work
mkdir demo
ls -lh -d demo

Bit SGID a skupina „geek“ se automaticky aplikují na adresář „demo“.

Pro vytvoření souboru s příponou zadejte následující příkaz touch a ověřte jeho vlastnosti:

touch useful.sh
ls -lh useful.sh

Skupina nového souboru se automaticky nastaví na „geek“.

Sticky Bit

Sticky bit (lepivý bit) získal svůj název díky svému historickému účelu. Když byl nastaven na spustitelném souboru, informoval operační systém, ž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á sticky bit význam pouze u adresářů – nastavení na souboru by nedávalo smysl.

Pokud nastavíte sticky bit na adresáři, uživatelé mohou mazat pouze soubory, které jim patří. Nemohou mazat soubory, které patří jinému uživateli, a to bez ohledu na to, jaká oprávnění k souborům jsou 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 nikdo nemůže mazat soubory jiného uživatele.

Vytvoříme adresář s názvem „shared“. K nastavení sticky bitu v tomto adresáři použijeme symbolický režim o+t s příkazem chmod. Poté se podíváme na oprávnění v tomto adresáři a také v adresářích /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

Pokud je sticky bit nastaven, spustitelný bit v sadě oprávnění pro „ostatní“ 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 ostatní (proto jsou zvýrazněny zeleně). Slouží jako sdílená umístění pro dočasné soubory.

Teoreticky by s těmito oprávněními měl být každý schopen provádět libovolné akce. Sticky bit to však přebije a nikdo nemůže smazat soubor, který mu nepatří.

Shrnutí

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

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