- Dave McKay
@TheGurkha
- 26. února 2020, 8:00am EDT
SUID, SGID a Sticky Bits jsou mocná 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í.
Již se používají
Zabudování zabezpečení do víceuživatelského operačního systému představuje několik otazníků. Vezměme si například (zdánlivě) základní koncept hesel. Všechna musí být uložena tak, aby při každém přihlášení mohl systém porovnat heslo, které zadá, s uloženou kopií. Je zřejmé, že vzhledem k tomu, že hesla jsou klíčem ke království, musí být chráněna.
V systému Linux jsou uložená hesla chráněna dvěma způsoby: jsou šifrována a k souboru, který hesla obsahuje, má přístup pouze osoba s právy root
. To může znít dobře, ale představuje to problém: Pokud mají k uloženým heslům přístup pouze osoby s právy root
, jak mohou svá hesla změnit ti, kteří tato práva nemají?
Zvýšení vašeho statusu
Obvykle se příkazy a programy v Linuxu spouštějí se stejnou sadou oprávnění jako osoba, která program spouští. Když root
spustí příkaz passwd
pro změnu hesla, spustí se s právy 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 program passwd
by si zachoval zvýšená oprávnění root
. To by komukoli umožnilo změnit vlastní heslo.
Výše uvedený scénář je přesně to, co dělá bit Set User ID (SUID
). Spouští programy a příkazy s právy vlastníka souboru, nikoliv s právy osoby, která program spouští.
Povýšíte status programu
Je tu však ještě jeden oříšek. Této osobě je třeba zabránit, aby zasahovala do cizích hesel. 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 bezpečnostního příběhu.
Kontrolní mechanismus, který někomu brání pracovat s cizím heslem, je obsažen v programu passwd
, nikoli v operačním systému a schématu SUID.
Programy, které se spouštějí se zvýšenými oprávněními, mohou představovat bezpečnostní riziko, pokud nejsou vytvořeny s ohledem na „bezpečnost od návrhu“. To znamená, že bezpečnost je první věc, kterou zvažujete, a pak na ní stavíte. Nepište program a nesnažte se mu dodatečně dát bezpečnostní nátěr.
Největší výhodou softwaru s otevřeným zdrojovým kódem je, že se můžete sami podívat na zdrojový kód nebo se odkázat na jeho důvěryhodné odborné recenze. Ve zdrojovém kódu programu passwd
jsou kontroly, takže můžete zjistit, zda osoba, která program spouští, je root
. Pokud je někdo root
(nebo někdo, kdo používá sudo
), jsou povoleny různé schopnosti.
Toto je kód, který zjišťuje, zda je někdo root
.
Následující příklad je příklad, ve kterém je toto zohledněno. Protože root
může změnit libovolné heslo, nemusí se program obtěžovat s kontrolami, které obvykle provádí, aby zjistil, která hesla má daná osoba právo změnit. Pro root
tedy tyto kontroly přeskočí a kontrolní funkci ukončí.
U základních linuxových příkazů a nástrojů si můžete být jisti, že mají v sobě zapečetěné zabezpečení a že kód byl mnohokrát zkontrolován. Samozřejmě vždy existuje hrozba dosud neznámých zneužití. Rychle se však objeví záplaty nebo aktualizace, které nově zjištěným zranitelnostem čelí.
Je to software třetích stran – zejména ten, který není open-source – s nímž musíte být velmi opatrní SUID
. Neříkáme, abyste to nedělali, ale pokud to děláte, chtějte se ujistit, že to nevystaví váš systém riziku. Nechcete zvyšovat oprávnění programu, který nebude správně spravovat sám sebe a osobu, která ho spouští.
Příkazy systému Linux, které používají SUID
Následujících několik příkazů systému Linux, které používají bit SUID, aby příkaz získal zvýšená oprávnění, když je spuštěn běžným uživatelem:
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 tří znaků: rwx. Ty znamenají čtení, zápis a spuštění. Pokud jsou tato písmena přítomna, znamená to, že dané oprávnění bylo uděleno. Pokud je však místo písmen přítomna pomlčka (-
), toto oprávnění nebylo uděleno.
Existují tři skupiny těchto oprávnění (zleva doprava): pro vlastníka souboru, pro členy skupiny souboru a pro ostatní. Je-li u souboru nastaven bit SUID
, písmeno „s“ představuje oprávnění vlastníka ke spuštění.
Je-li bit SUID
nastaven u souboru, který nemá možnost spuštění, označuje to velké písmeno „S“.
Podíváme se na příklad. Běžný uživatel dave
zadá příkaz passwd
:
passwd
Příkaz passwd
vyzve dave
k zadání jeho nového hesla. Pro zobrazení podrobností o běžících procesech můžeme použít příkaz ps
.
Použijeme ps
s grep
v jiném okně terminálu a vyhledáme 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
Zobrazí se dva řádky, z nichž druhý je proces grep
hledající příkazy s řetězcem „passwd“. Nás však zajímá první řádek, protože ten je určen pro proces passwd
, který dave
spustil.
Vidíme, že proces passwd
běží stejně, jako kdyby ho spustil root
.
Nastavení bitu SUID
Bit SUID
lze snadno změnit pomocí chmod
. Symbolický režim u+s
nastaví bit SUID
a symbolický režim u-s
bit SUID
vymaže.
Pro ilustraci některých pojmů týkajících se bitu SUID jsme vytvořili malý program htg
. Nachází se v kořenovém adresáři uživatele dave
a nemá nastavený bit SUID
. Po jeho spuštění se zobrazí skutečné a efektivní ID uživatele (UID).
Skutečné UID patří osobě, která program spustila. Efektivní ID je účet, ke kterému se program chová, jako by ho spustil.
Zadáme následující příkaz:
ls -lh htg
./htg
Při spuštění místní kopie programu vidíme, že skutečné i efektivní ID je nastaveno na dave
. Chová se tedy stejně, jako by se měl chovat normální program.
Zkopírujeme jej do adresáře /usr/local/bin
, aby jej mohli používat i ostatní.
Napíšeme následující příkaz, pomocí chmod
nastavíme bit SUID
a pak zkontrolujeme, zda byl nastaven:
sudo cp htg /usr/local/bin
sudo chmod u+s /usr/local/bin/htg
ls -hl /usr/local/bin/htg
Takže program je zkopírován a bit SUID je nastaven. Spustíme jej znovu, ale tentokrát spustíme kopii ve složce /usr/local/bin
:
htg
Přestože program spustil dave
, efektivní ID je nastaveno na uživatele root
. Pokud tedy program spustí mary
, stane se totéž, jak je uvedeno níže:
htg
Skutečné ID je mary
a efektivní ID je root
. Program se spouští s oprávněními uživatele root.
SOUHLASÍM: Jak používat příkaz chmod v systému Linux
Bit SGID
Bit Set Group ID (SGID
) je velmi podobný bitu SUID
. Když je bit SGID
nastaven na spustitelném souboru, je efektivní skupina nastavena na skupinu souboru. Proces se spouští s právy členů skupiny souboru, nikoli s právy osoby, která jej spustila.
Náš program htg
jsme upravili tak, aby zobrazoval i efektivní skupinu. Změníme skupinu programu htg
na výchozí skupinu uživatele mary
, tedy mary
. Použijeme také symbolické režimy u-s
a g+s
s chown
, abychom odstranili bit SUID
a nastavili SGID
.
Proto zadáme následující příkaz:
sudo chown root:mary /usr/local/bin/htg
sudo chmod u-s,g+s /usr/local/bin/htg
ls -lh /usr/local/bin/htg
V oprávnění skupiny vidíte bit SGID
označený písmenem „s“. Všimněte si také, ž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 kterých skupin patří dave
a mary
. Použijeme příkaz id
s volbou -G
(groups), abychom vypsali ID všech skupin. Poté spustíme program htg
jako dave
.
Zadáme následující příkazy:
id -G dave
id -G mary
htg
ID výchozí skupiny pro mary
je 1001 a účinná skupina programu htg
je 1001. Ačkoli byl tedy spuštěn programem dave
, je spuštěn s oprávněními členů skupiny mary
. Je to stejné, jako kdyby se dave
připojil ke skupině mary
.
Použijeme bit SGID
na adresář. Nejprve vytvoříme adresář s názvem „work“ a poté změníme jeho skupinu na „geek“. Poté na adresář nastavíme bit SGID
.
Když použijeme ls
pro kontrolu nastavení adresáře, 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
Bit SGID
a skupina „geek“ jsou nastaveny. Ty ovlivní všechny položky vytvořené v adresáři work
.
Napíšeme následující příkaz pro vstup do adresáře work
, vytvoříme adresář s názvem „demo“ a zkontrolujeme jeho vlastnosti:
cd work
mkdir demo
ls -lh -d demo
Bit SGID
a skupina „geek“ se automaticky použijí pro adresář „demo“.
Příkazem touch
vytvoříme soubor a zkontrolujeme jeho vlastnosti:
touch useful.sh
ls -lh useful.sh
Skupina nového souboru je automaticky nastavena na „geek“.
PŘÍKAZ: Jak používat příkaz chown v Linuxu
Lepivý bit
Lepivý bit získal své jméno podle svého historického účelu. Když byl nastaven na spustitelném souboru, označil operačnímu systému, že textové části spustitelného souboru mají být drženy ve swapu, což urychlilo jejich opětovné použití. V Linuxu má sticky bit vliv pouze na adresář – jeho nastavení na souboru by nedávalo smysl.
Při nastavení sticky bitu na adresáři mohou lidé mazat pouze soubory, které jim v rámci tohoto adresáře patří. Nemohou mazat soubory, které patří někomu jinému, bez ohledu na to, jaká kombinace oprávnění je u souborů nastavena.
To umožňuje vytvořit adresář, který mohou všichni – a procesy, které spouštějí – 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ář nazvaný „sdílený“. Použijeme o+t
symbolický režim s chmod
, abychom u tohoto adresáře nastavili lepicí bit. Poté se podíváme na oprávnění tohoto adresáře, stejně jako adresářů /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
Je-li nastaven sticky bit, spustitelný bit sady oprávnění „ostatní“ souborů 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í nastavena všechna práva k souborům pro vlastníka, skupinu a ostatní (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 mít kdokoli možnost dělat cokoli. Nicméně bit sticky je přebíjí a nikdo nemůže smazat soubor, který mu nepatří.
Připomínky
Následující je stručný seznam toho, co jsme probrali výše, pro budoucí použití:
-
SUID
Funguje pouze na soubory. - Na adresáře a soubory můžete použít
SGID
. - Bit sticky můžete použít pouze na adresáře.
- Pokud se indikátory „
s
„, „g
“ nebo „t
“ objeví velkými písmeny, nebyl nastaven spustitelný bit (x
).
Dave McKay poprvé použil počítač v době, kdy byla v módě děrná papírová páska, a od té doby programuje. Po více než 30 letech v oboru informačních technologií je nyní technologickým novinářem na plný úvazek. Během své kariéry pracoval jako programátor na volné noze, manažer mezinárodního týmu pro vývoj softwaru, projektový manažer IT služeb a v poslední době jako pověřenec pro ochranu osobních údajů. Dave je evangelistou Linuxu a zastáncem open source.Přečtěte si celý životopis “