Speciální oprávnění v Linuxu: Porovnání verzí
(Založení článku) |
(Založení článku) |
||
Řádka 1: | Řádka 1: | ||
− | '''Speciální oprávnění v Linuxu''' | + | '''Speciální oprávnění v Linuxu''' je v unixových systémech metoda, jak propůjčit uživateli (resp. procesu) na přesně stanovený úkol vyšší oprávnění, než má standardně (resp. je omezit). Mechanismus využívá speciálního označení programů SUID, SGID a sticky bitem (tj. označení binárky s programem uloženém na pevném disku). Speciální oprávnění neposkytují zabezpečení proti neoprávněnému použití, které tak musí být implementováno přímo do programů, kterých se týká. Nejsou-li takové programy naprogramovány velmi obezřetně, můžou být zdrojem bezpečnostního problému.<ref>http://www.ms.mff.cuni.cz/~zembm2am/exploity/exploity.html</ref> |
+ | |||
+ | == Standardní chování unixového systému == | ||
+ | V unixovém systému se rozlišují dvě úrovně oprávnění: správce systému (s názvem účtu root) a běžný uživatel. Oprávnění jsou implementována jak na uložená data (soubory a adresáře), tak pro běžící procesy. Pro správce systému se přístupová práva v jádře operačního systému nekontrolují (typicky), takže má ke všemu neomezený přístup. Naopak běžní uživatelé podléhají vzájemnému oddělení. | ||
+ | |||
+ | === Oprávnění pro soubory a adresáře === | ||
+ | Na soubory a adresáře se vztahují standardní unixová oprávnění (tzv. ''svatá trojice''). | ||
+ | |||
+ | : ''Podrobnosti v článku'': [[Přístupová práva v Linuxu]] | ||
+ | |||
+ | === Oddělení procesů === | ||
+ | Spuštěné programy se nazývají procesy. Procesy jsou navzájem odděleny jak z hlediska adresního prostoru (procesy standardně nemohou zasahovat do paměťového prostoru jiného procesu), tak z hlediska příjmu signálů (mohou přijímat jen signály stejného uživatele nebo správce systému). Procesy i uživatelé jsou z hlediska oprávnění odděleny podle UID, takže každý uživatel může spravovat svoje procesy (a správce systému může spravovat všechny). | ||
+ | |||
+ | === Dědění oprávnění === | ||
+ | Unixový systém standardně dědí oprávnění po rodičovském procesu. Hierarchie procesů je ryze stromová, přičemž první proces, který je jádrem operačního systému při jeho startu vytvořen a spuštěn, je <code>init</code> (typicky). Jádro operačního systému samo o sobě již dále nevytvoří žádný další proces, dovoluje pouze vznik potomků z již existujících procesů pomocí systémových volání <code>fork()</code> a <code>exec()</code>. Proto je <code>init</code> faktickým rodičem nebo prarodičem (resp. prarodičem v několikátém stupni) všech procesů, které v systému existují. | ||
+ | |||
+ | Pokud má běžící proces oprávnění správce systému, může své oprávnění změnit na libovolného běžného uživatele. Proces s oprávněním běžného uživatele nemůže své oprávnění nijak měnit (tj. změnit své UID na UID jiného uživatele). | ||
+ | |||
+ | === Přihlášení uživatele === | ||
+ | Při přihlašování uživatele je obsluha (a kontrola uživatelského jména a hesla) realizována procesem, který je spuštěn s oprávněním správce systému. Při pokusu o přihlášení uživatele je nejprve z takového procesu odštěpen potomek (voláním <code>fork()</code>), který má též práva administrátora, a dále proces autentizace obsluhuje. Pokud je uživatel autentizován, změní obslužný proces své UID na UID autentizovaného uživatele a následně sám sebe změní na shell (pomocí systémového volání <code>exec()</code>). | ||
+ | |||
+ | Uživatel je tak do systému přihlášen a zároveň obsluhován vlastním procesem (shellem). Ze shellu jsou dále spouštěny další programy, které pomocí principu dědění oprávnění běží také pod právy tohoto uživatele (se stejným UID). | ||
+ | |||
+ | == Chování se speciálním oprávněním == | ||
+ | |||
+ | === SUID === | ||
+ | |||
+ | === SGID === | ||
+ | |||
+ | === Sticky bit === | ||
+ | |||
+ | == Využití v běžném systému == | ||
+ | |||
+ | === Změna hesla === | ||
+ | |||
+ | === Skóre ve hře === | ||
+ | |||
+ | === Přímý přístup k hardware === | ||
+ | |||
+ | == Zneužití SUID == | ||
+ | |||
+ | == Ochrana proti zneužití == | ||
+ | |||
+ | === Nalezení SUID programů === | ||
+ | |||
+ | find / -type f -a \( -perm /u+s -o -perm /g+s \) -exec ls -l {} \; | ||
+ | |||
+ | == Reference == | ||
+ | <references /> |
Verze z 24. 11. 2009, 10:36
Speciální oprávnění v Linuxu je v unixových systémech metoda, jak propůjčit uživateli (resp. procesu) na přesně stanovený úkol vyšší oprávnění, než má standardně (resp. je omezit). Mechanismus využívá speciálního označení programů SUID, SGID a sticky bitem (tj. označení binárky s programem uloženém na pevném disku). Speciální oprávnění neposkytují zabezpečení proti neoprávněnému použití, které tak musí být implementováno přímo do programů, kterých se týká. Nejsou-li takové programy naprogramovány velmi obezřetně, můžou být zdrojem bezpečnostního problému.[1]
Obsah
Standardní chování unixového systému
V unixovém systému se rozlišují dvě úrovně oprávnění: správce systému (s názvem účtu root) a běžný uživatel. Oprávnění jsou implementována jak na uložená data (soubory a adresáře), tak pro běžící procesy. Pro správce systému se přístupová práva v jádře operačního systému nekontrolují (typicky), takže má ke všemu neomezený přístup. Naopak běžní uživatelé podléhají vzájemnému oddělení.
Oprávnění pro soubory a adresáře
Na soubory a adresáře se vztahují standardní unixová oprávnění (tzv. svatá trojice).
- Podrobnosti v článku: Přístupová práva v Linuxu
Oddělení procesů
Spuštěné programy se nazývají procesy. Procesy jsou navzájem odděleny jak z hlediska adresního prostoru (procesy standardně nemohou zasahovat do paměťového prostoru jiného procesu), tak z hlediska příjmu signálů (mohou přijímat jen signály stejného uživatele nebo správce systému). Procesy i uživatelé jsou z hlediska oprávnění odděleny podle UID, takže každý uživatel může spravovat svoje procesy (a správce systému může spravovat všechny).
Dědění oprávnění
Unixový systém standardně dědí oprávnění po rodičovském procesu. Hierarchie procesů je ryze stromová, přičemž první proces, který je jádrem operačního systému při jeho startu vytvořen a spuštěn, je init
(typicky). Jádro operačního systému samo o sobě již dále nevytvoří žádný další proces, dovoluje pouze vznik potomků z již existujících procesů pomocí systémových volání fork()
a exec()
. Proto je init
faktickým rodičem nebo prarodičem (resp. prarodičem v několikátém stupni) všech procesů, které v systému existují.
Pokud má běžící proces oprávnění správce systému, může své oprávnění změnit na libovolného běžného uživatele. Proces s oprávněním běžného uživatele nemůže své oprávnění nijak měnit (tj. změnit své UID na UID jiného uživatele).
Přihlášení uživatele
Při přihlašování uživatele je obsluha (a kontrola uživatelského jména a hesla) realizována procesem, který je spuštěn s oprávněním správce systému. Při pokusu o přihlášení uživatele je nejprve z takového procesu odštěpen potomek (voláním fork()
), který má též práva administrátora, a dále proces autentizace obsluhuje. Pokud je uživatel autentizován, změní obslužný proces své UID na UID autentizovaného uživatele a následně sám sebe změní na shell (pomocí systémového volání exec()
).
Uživatel je tak do systému přihlášen a zároveň obsluhován vlastním procesem (shellem). Ze shellu jsou dále spouštěny další programy, které pomocí principu dědění oprávnění běží také pod právy tohoto uživatele (se stejným UID).
Chování se speciálním oprávněním
SUID
SGID
Sticky bit
Využití v běžném systému
Změna hesla
Skóre ve hře
Přímý přístup k hardware
Zneužití SUID
Ochrana proti zneužití
Nalezení SUID programů
find / -type f -a \( -perm /u+s -o -perm /g+s \) -exec ls -l {} \;