UNIX 3. Uživatelé a oprávnění © Milan Keršlágerhttp:// Obsah: ● uživatelé, /etc/passwd, /etc/shadow ● skupiny, /etc/group, /etc/gshadow ● správa uživatelů a skupin, příkaz sudo ● adresářová služba (LDAP, NIS) ● tradiční unixová oprávnění, ACL ● speciální oprávnění (SUID, SGID, sticky bit) ● atributy, rozšířené atributy ● SELinux, AppArmor, chroot, sandbox
Unixový systém ● víceúlohový ● nutné vzájemné oddělení úloh (procesů) ● proces nemůže zasahovat do paměti jiného ● nutná podpora procesoru – ochrana paměti – IBM PC: i386 (32bitový, Windows NT) – privilegovaný režim – dtto (nelze nebezpečné instrukce) – existovaly i systémy bez podpory CPU → problém ● víceuživatelský ● nutné vzájemné oddělení uživatelů ● pomocí oprávnění (soubory, adresáře, procesy) – nutná podpora v jádře operačního systému (+privileg. r.)
Uživatelé ● správce (administrátor) → root (UID=0) ● není jádrem OS omezován ● může se změnit na libovolného uživatele – využíváno při přihlašování (uvítací program jako root ) ● běžný uživatel → UID!=0 ● může zasahovat jen do vlastních souborů, procesů – využívá se systém oprávnění ● NEmůže se změnit na jiného uživatele ● jádro OS pracuje s UID (běžně 0 až 32767) ● ve výpisu se překládá na jméno (srozumitelnost)
Definice uživatelů ● uloženo v souboru /etc/passwd ● jednoduchá databáze ( chyba → zbytek se nepoužívá ) ● 1 řádek = 1 uživatel, položky odděleny znakem „ : “ ● login:passwd:UID:GID:FullName:HomeDir:shell ● využívá se při překladu UID → jméno uživatele ( ls -l ) ● založení uživatele ● prosté přidání dalšího řádku – lze i editorem ● nástroje (GUI, useradd, userdel) – používáme kvůli zamykání (editační konflikt)
Data o uživatelích ● jsou uložena v textových souborech ● /etc/passwd – definice uživatelů ● /etc/shadow – hesla v chráněném souboru (uživatel nemůže ani číst) ● /etc/group – seznam skupin + členství uživatelů ve skupinách ● /etc/gshadow – hesla skupin v chráněném souboru (jako /etc/shadow )
/etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin... huzva:x:500:500:René Hužva:/home/huzva:/bin/bash ● na prvním řádku je typicky root ● dále jsou tzv. systémové účty se speciálním využitím ● některé mají GUID=0, takže je to „malý root “ ● tři tečky naznačují řádky, které byly v ukázce smazány
Skrytá hesla (shadow passwords) ● heslo zakódováno jednosměrnou funkcí ● původně crypt(), později md5, sha1, sha2 – přidávána sůl (1 heslo = více zakódovaných tvarů) ● i tak lze použít útok hrubou silou – bereme všechny kombinace hesel (využití slovníku) – zakódujeme a porovnáme s uloženým tvarem – dnes tzv. „rainbow table“ → otázka vteřin (md5, sha1) ● ukrytí hesel do souboru /etc/shadow ● může číst jen root, běžný uživatel ne ● nevadí, protože před přihlášením oprávnění root
/etc/shadow ● opět jednoduchá databáze ● login:passwd:další:údaje:... ● další údaje upřesňují vlastnosti hesla – poslední změna hesla, platnost hesla, účtu, povinná změna, zákaz změny hesla uživatelem,... ● soubor může číst jen uživatel root – zašifrovaná hesla chráněna před zcizením – nelze použít útok hrubou silou – změna hesla uživatelem → SUID (speciální oprávnění) root:6$630fCdtG$:14632:0:99999:7::: huzva:465sWTI1pX/:14251:0:99999:7:::
Skupiny ● každý uživatel je členem alespoň 1 skupiny ● další skupiny v /etc/group ● primární skupina ● explicitně definována v /etc/passwd ● změna primární skupiny příkazem newgrp (nový shell) ● BSD systémy posuzují pouze primární skupinu ● SYSV systémy posuzují všechny skupiny najednou – dnes typické chování (v Linuxu volitelná vlastnost jádra)
/etc/group ● seznam skupin ● opět jednoduchá databáze ● názevsk:passwd:GID:login1,login2 ● BSD systémy ● všichni uživatelé ve skupině users ● SYSV systémy ● každý uživatel má vlastní stejnojmennou skupinu ● větší důraz na implicitní soukromí ● dá se nastavit (při vytváření uživatele) – /etc/default/useradd
/etc/gshadow ● stejná ochrana hesel, jako /etc/shadow ● názevsk:heslo:administrators:members ● typicky se hesla nepoužívají ● členství ve skupinách pevně dáno – nastaví se při přihlášení uživatele ● je-li však heslo nastaveno, může uživatel do skupiny vstoupit až po přihlášení – příkaz newgrp
Správa uživatelů a skupin ● různé nástroje pro GUI a příkazový řádek ● GUI se liší dle distribuce, řádkové stejné (standard) ● useradd, userdel, usermod ● groupadd, groupdel, groupmon ● passwd ● pro změnu hesla (uživatel vlastní, root všechny) ● id ● výpis aktuálních informací (UID, GID, skupiny) uid=500(huzva) gid=500(huzva) groups=500(huzva),501(www)
Nástroj sudo ● kontrolovaná elevace (zvýšení) oprávnění ● lze spustit příkaz jako jiný uživatel (i jako root ) ● /etc/sudoers → konfigurace ● použití: sudo příkaz – využívá distribuce Ubuntu (vkládá se heslo uživatele) ● příkaz su ● změna na jiného uživatele ● nutno znát jeho heslo ( root nemusí)
Adresářová služba ● externí databáze uživatelů ● nahrazuje nebo doplňuje lokální databázi (viz dříve) ● specializovaná databáze, replikace, distribuovanost ● uživatelé, skupiny, hesla, členství ve skupinách, jména tiskáren, počítačů,... ● optimalizace pro čtení a prohledávání ● aktualizace (změny) jen občasné ● LDAP ( Lightweight Directory Access Protocol ) ● NIS ( Network Information Service ) ● MS Active Directory, X.500, ale též DNS
LDAP ● původně protokol k X.500 ● model klient – server, používá TCP/IP ● jednotný globální prostor ● autentizace uživatelů, ACL ● podpora decentralizace ● podpora různých atributů ● na TUL jméno + heslo, ale též heslo pro WiFi apod. ● OpenLDAP, Fedora Directory Server ● open source implementace LDAP ● MS Active directory privátní implementací LDAP
Atributy LDAP ● dle X.520 ● C – country (CZ) ● SP – state or province (Liberecký kraj) ● L – locality (Liberec) ● O – organization (Technická univerzita) ● OU – organization unit (Fakulta mechatroniky) ● CN – common name (René Hužva) – CN=René Hužva, OU=Fakulta mechatroniky, O=Technická univerzita, L=Liberec, SP=Liberecký kraj, C=CZ
NIS ● původně Yellow Pages (YP) ● kolidovalo s ochrannou značkou v UK ● firma Sun Microsystem ● licencováno pro unixové systémy ● dnes spíše LDAP ( blíže k tomu, co má MS Windows ) ● uživatelé, hesla, názvy počítačů, ové aliasy, skupiny a členství ve skupinách,... ● novější verze: NIS+
Tradiční unixová oprávnění ● velmi jednoduchá ● v době vzniku Unixu málo výkonné počítače (1969) ● jde o rychlost souborového systému (FS – filesystem) ● žádná dědičnost, vše na konkrétní adresář, soubor – ke čtení ze souboru jsou nutná metadata – metadata jsou v i-node, který obsahuje i oprávnění – využijeme data, která stejně musíme načíst → efektivní ● „svatá trojice“ – jednotně pro soubory i adresáře ● 3 druhy: čtení, zápis, spuštění (Read, Write, eXecute) ● 3 cíle: vlastník, skupina, ostatní
Význam oprávnění čtení (zobrazení) obsahu souboru výpis obsahu adresáře (příkaz ls ) zápis do souboru (změna obsahu) změna obsahu adresáře (vytvoření, smazání a přejmenování položek) spuštění (provedení) binárka, skript vstup do adresáře (musí být i ve všech nadřízených)
Uplatňování oprávnění ● řízení přístupu podle modelu DAC ● uživatel má definováno UID a GID (těch i více) ● objekty oprávnění pro vlastníka, skupinu a ostatní ● uplatňují se jen nejkonkrétnější oprávnění ● jsem-li majitel → práva pro vlastníka ● patřím do skupiny, ale nejsem majitel → pro skupinu ● nejsem ani vlastník, ani skupina → práva pro ostatní ● POZOR: ● (!!!) žádný (!!!) průnik ani sjednocení atp.
Zobrazování oprávnění ● pro objekty (soubor, adresář) zobrazuji: ● tři trojice oprávnění (Read, Write, eXecute) ● vlastník, skupina, ostatní – rwx rwx rwx ● ve výpisu musí být k objektu vypsán: ● vlastník ● skupina
ls -l -rw-rw-r-- 1 huzva www led seznam.txt typ objektu tři trojice oprávnění vlastník skupina délka čas poslední změny obsahu název Typ vypsaného objektu: - → obyčejný soubor d → adresář (directory) b→ blokové zařízení (block) c→ znakové zařízení (char) p→ roura (pipe) s→ soket počet odkazů Počet odkazů je počet jmen (v adresářích), které odkazují na daný objekt. Souvisí s pevnými odkazy („hardlink“). U adresářů se započítává odkaz z vnitřku samotného adresáře (tj. dvě tečky „..“) a další případně obsažené podadresáře.
Příklad výstupu $ ls -ld /dev/ttyS0 /dev/sda web.tgz vyuka brw-r root disk 8, 0 bře 19 06:28 /dev/sda crw-rw root uucp 4, 64 bře 19 06:28 /dev/ttyS0 drwxrwxr-x 4 rene www 4096 pro 18 07:18 vyuka -rw-r--r-- 1 rene rene lis web.tgz $ stat ucitele.txt File: `ucitele.txt' Size: 2280 Blocks: 16 IO Block: 4096 regular file Device: fd00h/64768d Inode: Links: 1 Access: (0644/-rw-r--r--) Uid: (500/huzva) Gid: (500/huzva) Access: :17: Modify: :31: Change: :31:
Oktalový zápis oprávnění ● každá trojice oprávnění se dá zapsat oktalově ● velmi často využíváno ● součet vah: ● rwx → 7 → všeobecně přístupný (skript, adresář) ● rw- → 6 → čtení a zápis (textový soubor) ● r-x → 5 → binárka, adresář s programy ● r-- → 4 → jen čtení (textový soubor) ● --x → 1 → binárka, nelze použít debugger
Nastavení oprávnění ● příkazem chmod ● využití oktalového zápisu oprávnění ● chmod 775 /bin/bashrwxrwxr-x ● chmod 664 index.htmlrw-rw-r-- ● symbolický zápis oprávnění místo oktalového ● příklad: u+r, u+rw, g-x, o=r, o=
umask ● slouží k implicitnímu nastavení oprávnění ● pro nové soubory a adresáře ● určuje, která oprávnění se mají ODEBRAT – výsledek je tedy rozdíl umask ● u adresáře je oprávnění x všude nastaveno ● příklad: umask→ výpis aktuálního umask umask 022→ soubor bude mít 644, adresář 755 umask 006→ soubor bude mít 661, adresář 771
Další oprávnění ● speciální oprávnění ● výjimky ze standardního chování systému ● řeší situace, které tradiční oprávnění řešit neumí ● standardní součást unixových systémů ● ACL (dle POSIXu) ● rozšíření standardních oprávnění ● trojice ( rwx ) pro další uživatele i skupiny – MS Windows vlastní ACL (jemnější) – Linux ACL vážně až dnes (v RHEL 4 od roku 2005) – Samba oprávnění mapuje (redukuje), připravuje vlastní
ACL – Access List ● rozšíření tradičních unixových oprávnění ● ale i na složitější požadavky stačí tradiční + speciální ● využívá tradiční trojici oprávnění ( rwx ) ● pomocí ACL může mít objekt další klasická oprávnění pro další jednotlivé uživatele i skupiny ● definováno normou POSIX ● implementace v Linuxu ● existuje dlouho, ale problémy – vyřešeno 2005 ● současné distribuce mají ACL implicitně zapnuto – ACL se dá selektivně aktivovat pro jednotlivé FS
getfacl $ ls -ld /home/huzva drwx--x huzva huzva 4096 bře 26 07:37 /home/huzva $ getfacl /home/huzva getfacl: Removing leading '/' from absolute path names # file: home/huzva # owner: huzva # group: huzva user::rwx user:apache:--x group::--x mask::--x other::--- ● slouží pro zjištění ACL (standardní výpis jen „+“) tradiční oprávnění (vlastník) uživatel zapsaný v ACL tradiční oprávnění (skupina) maska práv ACL tradiční oprávnění (ostatní)
setfacl ● slouží k nastavení ACL ● setfacl -m u:apache:rw názevsouboru – m → změna nastavení ACL – u – pro uživatelem – maska – g – pro skupinuo – ostatní – x → odebrat konkrétní ACL – b → odebrání všech ACL (zůstanou jen tradiční) ● maska je sjednocením všech oprávnění – tj. uživatelé i skupiny – pokud nějaké chybí, ve výsledku se neuplatní
Speciální oprávnění ● tradiční součást unixových systémů ● mění standardní chování systému (s oprávněním) ● SUID bit ● ve výpisu je místo x u práv vlastníka písmeno s ● SGID bit ● ve výpisu je místo x u práv skupiny písmeno s ● sticky bit ● ve výpisu je místo x u práv ostatních písmeno t ● Pozn.: Je-li písmeno velké, překryté oprávnění není přítomno.
SUID bit ● standardní chování: ● nový proces přebírá oprávnění od svého rodiče ● na binárce programu je nastaven SUID bit: ● spuštěný proces běží s právy vlastníka binárky ● může to být jakýkoliv uživatel, často ale root – při chybě v SUID programu bezpečnostní problém!!! ● příklad: změna hesla ● soubor /etc/shadow běžný uživatel nepřečte ● program na změnu hesla je SUID root $ ls -l /etc/shadow /usr/bin/passwd -r root root bře /etc/shadow -rwsr-xr-x. 1 root root led /usr/bin/passwd
SGID bit ● podobné jako SUID, ale pro skupinu ● nový proces běží s právy skupiny vlastnící binárku ● příklad: skóre ve hře ● skóre hry je pro všechny uživatele v souboru – hra i uživatelé mohou měnit → dá se fixlovat ● soubor se skóre dáme skupině games – zápis bude možný pouze pro skupinu games (664) ● program se hrou bude SGID games – spuštěná hra skóre zapíše, ale uživatel sám ne $ ls -l /usr/bin/gnomine /var/lib/games/gnomine.Small.scores -r-xr-s--x 1 root games bře /usr/bin/gnomine -rw-rw-r-- 1 games games 95 bře 17 11:10 /var/lib/games/gnomine.Small.scores
Procesy se SUID a SGID bitem ● při spuštění dojde ke specifickému nastavení ● RUID, RGID: na UID uživatele, který proces spustil ● EUID, EGID: nastaveno podle binárky – tj. podle vlastníka (je-li nastaven SUID) a skupiny (SGID) – za normálních okolností EUID=RUID, EGID=RGID ● za běhu lze volat setuid() a setgid() – slouží k dočasné změně EUID – původní hodnoty uloženy do SavedUID, SavedGID – využívají démoni ke zvýšení bezpečnosti privil. procesů ● různé unixové systémy mají drobné odlišnosti – Linux má navíc FSUID, FSGID pro přístup k FS
SGID bit pro adresáře ● SGID má speciální význam pro adresář ● založíme-li v adresáři nový objekt, nebude patřit primární skupině uživatele, který ho založil, ale bude patřit skupině, která je SGID v tomto adresáři ● používá se na společné projekty více uživatelů (uživatelé jsou ve stejné skupině) ● kombinujeme s umask ● nastaví-li si uživatel vhodný umask, nebude bránit uživatelům ve stejné skupině v modifikaci souborů, které on sám vytvoří (nebude smazáno právo w)
Sticky bit ● problém adresáře /tmp ● všichni do něj mají právo zápisu ● procesy do něj odkládají dočasné soubory ● právo zápisu však je i právem mazat, přejmenovat ● různí uživatelé si tak navzájem mohou škodit ● na adresáři je nastaven sticky bit ● vytváření není nijak omezeno ● mazání a přejmenování může provést jen majitel daného objektu (souboru, adresáře) $ ls -ld /tmp drwxrwxrwt. 88 root root bře /tmp
Atributy ● nastavení specifických vlastností objektů FS ● interpretuje OS (pro jednotlivé soubory, adresáře) ● v různých systémech různě (Linux, OS/X, BSD, Win) ● společné atributy souborů unixových systémů ● i – immutable → nelze smazat ani změnit obsah ● a – append only → lze jen přidávat (logy) ● další atributy (Linux) – synchronní operace, potlačení atime, nezálohovat, komprimováno, žurnálování dat, bezpečné mazání,... ● příkazy: lsattr, chattr
Rozšířené atributy ● „poznámky“ k objektům FS (systému souborů) ● nejsou pevně dány OS nebo FS, typicky: ● název=hodnota → celé zapsáno jako řetězec ● systémové rozšířené atributy – např. definice nastavení pro pro SELinux ● uživatelské rozšířené atributy – využívají aplikace (kontrolní součet souboru, asociovaná aplikace, použité kódování,...) ● typicky omezená velikost, sdruženo s metadaty – v extrémním případě až do max. velikosti souboru (fork)
SELinux ● doplňující zabezpečení pro Linux ● implementuje MAC (Mandatory Access Control) – přesněji RBAC → Role-based Access Control – na souborech jsou rozšířené atributy – definované role pro různé skupiny programů – → i proces běžící jako root může být omezen ● vytvořila NSA v USA (Národní úřad pro bezpečnost) – používá Fedora a klony RHEL (CentOS apod.) ● 3 režimy: – disabled, permissive (jen hlášení, bez omezení), enabled
AppArmor ● doplňující zabezpečení pro Linux ● implementuje MAC (jako SELinux) – nevyužívá rozšířené atributy → cesta k binárce ● vytvořila firma Novell – používáno v SLES, openSUSE, Ubuntu ● jednodušší správa – není tak komplexní, jako SELinux
chroot ● systémové volání jádra OS ● běžícímu procesu je změněn kořen FS – kořen je „posunut“ do zvoleného adresáře – vzniká problém s přístupem k dynamickým knihovnám ● dyn. knihovny musí být nakopírovány do chroot prostředí ● proces se „nedostane“ mimo chroot – neplatí pro uživatele root – chroot není zabezpečením, spíše ochranou proti chybě ● například nemožnost smazat soubory mimo chroot ● v unixových systémech velmi oblíbené
Sandbox ● bezpečnostní technika ● implementováno v jádře OS ● proces se může „odstřihnout“ od funkcí OS – typicky si proces vybere, které funkce znepřístupnit ● vybraná systémová volání přestanou fungovat ● v případě funkčního exploitu nejsou další akce povoleny – velmi dobře implementováno ve Windows ● bohužel to zcela využívá jen prohlížeč Google Chrome – v unixových OS neexistuje ucelená implementace ● sandbox lze vytvořit např. pomocí SELinuxu