Speciální oprávnění v Linuxu: Porovnání verzí

Z Milan Kerslager
Přejít na: navigace, hledání
(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]

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 {} \;

Reference

  1. http://www.ms.mff.cuni.cz/~zembm2am/exploity/exploity.html