Přístupová práva v Linuxu
Přístupová práva v Linuxu jsou klasická jednoduchá unixová oprávnění, která se aplikují na soubory a adresáře v tradičním souborovém systému UFS. Oprávnění jsou nastavována přímo a při jejich vyhodnocování se nepracuje s mechanismy dědění oprávnění z nadřízených adresářů (se specifickou výjimkou práva vstupu do adresáře). I přes jejich jednoduchost lze obvykle pomocí jednoduchých doplňujících možností dosáhnout požadovaného stavu. Přesto se v současné době často používají rozšířená oprávnění podle normy POSIX (viz ACL v Linuxu), která poskytují flexibilnější možnosti nastavení.
Obsah
Uživatelé a skupiny
Ve víceuživatelských unixových systémech je nutné od sebe jednotlivé uživatele oddělit a chránit jejich data a běžící procesy. Proto jsou v systému definováni uživatelé a skupiny. Při vyhodnocování oprávnění se používají číselné identifikátory UID (číslo uživatele) a GID (číslo skupiny), která se při výpisu převádějí na přihlašovací jména a názvy skupin.
Uživatelé
Každý uživatel unixového systému má svůj učet, který zahrnuje přihlašovací jméno, heslo a domácí adresář. Z historických důvodů jsou často uživatelská jména omezena na délku osmi znaků, avšak současné systémy (např. Linux) obvykle umožňují používat i delší přihlašovací jména, což může způsobovat drobné obtíže (například zkrácení na osm znaků ve výpisu příkazu last
nebo nemožnost přihlášení pomocí řádkového programu FTP obsaženého přímo v MS Windows).
Uživatelské účty jsou definovány v jednoduché databázi v podobě textového souboru /etc/passwd
, kde je na každém řádku uveden jeden účet. Jednotlivé položky každého účtu jsou odděleny dvojtečkou. Struktura záznamu je pevně dána takto:
prihlasovaci.jmeno:heslo (je-li uvedeno):UID:GID:Plné Jméno:/domaci/adresar:/implicitni/shell
- Přihlašovací jméno
- Přihlašovací jméno může obsahovat malá písmena ASCII tabulky a některé speciální znaky (obvykle je povolena pomlčka a tečka). Velká písmena by se neměla používat, protože způsobují potíže při doručování elektronické pošty, kde v adrese nezáleží na velikosti písmen. Délka je v konzervativním případě omezena na osm znaků, avšak v moderních systémech může být delší (typicky ve tvaru jmeno.prijmeni).
- Heslo
- Heslo bývalo v souboru uloženo dříve, dnes je na této pozici obvykle písmeno x, protože heslo je uschováno v souboru
/etc/shadow
(kvůli ochraně proti útoku hrubou silou na použitou jednosměrnou šifru).
- UID
- UID je číslo uživatele, které používá pro rozlišení uživatelů operační systém. Číslo 0 (nula) je vyhrazeno pro správce systému (root), pro kterého se oprávnění nekontrolují. Ostatní čísla jsou běžní uživatelé, kteří jsou si z pohledu systému rovni, přičemž čísla do 100 (resp. 500) jsou vyhrazena pro systémové účty (typicky různí démoni) a čísla nad 500 jsou určena pro běžné uživatele.
- GID
- GID je číslo primární skupiny uživatele. Uživatel musí být vždy členem alespoň jedné skupiny. Systémy, které vycházejí z řady System V zakládají pro každého uživatele stejnojmennou skupinu, jíž jsou jediným členem. Tento způsob nutí správce, aby založil vlastní skupinu, která by sdružovala (vybrané) uživatele (např. v linuxových systémech Fedora, Red Hat Enterprise Linux, CentOS). V systémech vycházejících z větve BSD jsou všichni nově založení uživatelé implicitně členy skupiny users (např. v linuxových distribucích Debian, Ubuntu). Jedno z uvedených chování lze obvykle v systému nastavit.
- Plné jméno
- Plné jméno je obvykle jméno a příjmení uživatele. Někdy se za čárky uvádí ještě kancelář, telefon do kanceláře a telefon domů. Plné jméno využívají některé programy (např. klient elektronické pošty, který ho implicitně používá pro jméno odesílatele). V souboru není uvedeno kódování, takže je nutné, aby případná písmena s diakritikou byla uvedena v kódování, které implicitně používá celý systém (dnes typicky UTF-8), případně se smířit s tím, že bude někdy špatně interpretováno (nutno vyzkoušet). Uživatel si může své plné uživatelské jméno měnit příkazem
chfn
.
- Domácí adresář
- Domácí adresář slouží pro uložení konfiguračních souborů (typicky začínají tečkou a jsou proto skryté a pro uložení uživatelských dat. Typicky jsou domácí adresáře umístěny v
/home/prihlasovaci.jmeno
, ale není to nezbytně nutné. Definici domácího adresáře používá například shell, který je schopen cestu doplnit při expanzi znaku tilda (~
). Běžné programy využívají spíše proměnnou prostředíHOME
, která je podle této položky nastavena při přihlášení uživatele (a použije ji např. při ukládání uživatelských souborů). Do domácího adresáře je obvykle při založení uživatele nakopírován obsah adresáře/etc/skel
, který obsahuje několik implicitních uživatelských konfiguračních souborů (jako ukázky nebo pro zajištění prvotního zamýšleného nastavení, např.~/.bashrc
pro inicializaci shellu BASH při přihlášení).
- Implicitní shell
- Implicitní shell je interpret příkazů, který je spuštěn při přihlášení uživatele (nebo při spuštění emulace terminálu v grafickém prostředí), což je typicky
/bin/bash
. Uživatel si může změnit implicitní shell pomocí příkazuchsh
, avšak může vybírat pouze z těch, které jsou uvedeny v souboru/etc/shells
. Stejně tak systém při přihlášení nespustí shell, který v tomto souboru není uveden, což je bezpečnostní opatření. Shell může být též nějaký jiný program, který zajistí komunikaci s uživatelem (např. menu). Systémovým účtům se obvykle dávají jako shell programy, které nedělají nic, aby se na ně nemohl někdo přihlásit (např./sbin/nologin
, méně vhodně/bin/false
apod.).
Příklad části souboru /etc/passwd
(tři tečky naznačují vynechané řádky):
root:x:0:0:Admin - Opteron:/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 ... rene.huzva:x:10727:10727:René Hužva:/home/rene.huzva:/bin/bash
Správa uživatelů
Uživatelé se obvykle zakládají speciálním programem, který zajistí konzistenci (tj. zamykání) ve víceuživatelském prostředí (tj. při současném použití dvěma uživateli nedojde k poškození nebo přemazání uložených dat). V grafických prostředích jsou k dispozici klikací nástroje.
id # zjištění UID a GID právě přihlášeného uživatele id rene.huzva # zjištění UID a GID uživatele rene.huzva useradd rene.huzva # založení uživatele userdel -r rene.huzva # smazání uživatele včetně jeho domácího adresáře a spolu pro e-maily chfn rene.huzva # změna plného jména uživatele rene.huzva usermod -d /adr huzva # změna domácího adresáře uživatele huzva usermod -L rene.huzva # zamčení účtu (resp. hesla) uživatele usermod -U rene.huzva # odemčení hesla uživatele
Po smazání uživatele jsou ve výpisu soubory a adresáře zobrazovány s numerickým UID. Po smazání uživatele by měl správce systému z bezpečnostních důvodů zajistit, aby byly takové soubory předány jinému uživateli, protože by se mohlo stát, že po založení nového uživatele nebo změnách UID dojde k tomu, že soubory budou patřit jinému uživateli, který s nimi bude moci volně nakládat.
Skupiny
Skupiny jsou vedeny v souboru /etc/groups
, hesla jsou podobně jako v předchozím případě obvykle umístěna v souboru /etc/gshadow
. V systémech vycházejících ze systému BSD je uživatel vždy členem právě jedné skupiny. V systémech vycházejících ze System V může být uživatel členem více skupin najednou (při přístupu k souborům se posuzují jeho oprávnění na základě členství ve všech skupinách).
Primární a doplňující skupiny
Skupina, která je uvedena v definici uživatele v souboru /etc/passwd
(resp. její GID) je po přihlášení uživatele primární. Při vytváření nových souborů a adresářů patří je použita právě tato primární skupina.
Primární skupinu si uživatel může změnit pomocí příkazu newgrp
, který spustí nový shell a do jeho ukončení (příkazem exit
) je primární skupina změněna. Pokud uživatel není členem požadované skupiny, může ji aktivovat při znalosti přihlašovacího hesla skupiny. Příkaz newgrp
lze použít pouze při práci v příkazovém řádku.
Správa skupin
Správa skupin:
groupadd studenti # vytvoření skupiny "studenti" groupmod -n "Studenti školy" # nastavení plného názvu skupiny usermod -g studenti huzva # změna primární skupiny uživatele huzva na skupinu studenti usermod -a -G studenti huzva # přidání uživatele huzva do skupiny studenti se zachováním aktuálního stavu groupdel skupina
Po smazání skupiny budou adresáře a soubory vypisovány s numerickým GID. Z bezpečnostních důvodů by měl správce systému zajistit předání takových adresářů a souborů jiné skupině.
Změna vlastníka a skupiny
Změnu vlastníka a skupiny může provádět pouze administrátor systému (uživatel root). Některé systémy dovolují za specifických podmínek provádět změnu vlastníka nebo skupiny i obyčejným uživatelům, avšak z bezpečnostních důvodů se tato možnost obvykle uživatelům neposkytuje.
Změna vlastníka (a skupiny) pomocí řádkového příkazu chown
:
chown huzva soubor.txt # změna vlastníka chown :skupina soubor.txt # zmena skupiny chown huzva:skupina soubor.txt # změna vlastníka i skupiny chown -R huzva adresar # rekurzivní změna na celý podadresář chown -R huzva:skupina adresar
Tři trojice
Tradiční unixová oprávnění jsou rozdělena do tří trojic (někdy se označují jako svatá trojice), i když ve skutečnosti jsou vlastně tyto trojice čtyři, protože se před ně předsazuje ještě trojice speciálních oprávnění (tzv. sticky, SUID a SGID bit), ale ty jsou předmětem jiného článku.
Každý soubor a adresář má oprávnění pro:
- vlastníka (tj. je to vlastník souboru nebo adresáře)
- skupinu (tj. není to vlastník, ale je členem uvedené skupiny)
- ostatní uživatele (tj. není to vlastní ani nepatří do výše uvedené skupiny)
přičemž každé oprávnění se skládá ze tří práv:
-
r
– čtení -
w
– zápis -
x
– spuštění souboru nebo vstup do adresáře
Z výše uvedených poznámek vyplývá, že přístupová práva se určují pouze podle nejkonkrétnější trojice, tj. pokud přistupuje k souboru jeho vlastník, pak jsou na něj aplikovaná práva pouze z první trojice. Pokud k souboru přistupuje někdo, kdo není jeho vlastník, ale patří do stejné skupiny jako soubor, pak je na něj uplatňována trojice oprávnění pro skupinu. Teprve tehdy, pokud k souboru nebo adresáři přistupuje uživatel, který není ani vlastník a ni nepatří do skupiny jako soubor, je na něj uplatněna poslední trojice oprávnění pro ostatní uživatele.
Výpis oprávnění
Výpis souboru pomocí programu ls
s přepínačem -l
zobrazuje i přístupová práva. V následujícím příkladu patří soubor uživateli rene.huzva a též stejnojmenné skupině. Na levém okraji je symbolický výpis oprávnění. První pomlčka říká, že jde o obyčejný soubor. Dále následují tři trojice oprávnění: pro vlastníka rw-
(může číst soubor a zapisovat do něj), pro skupinu r--
(členové skupiny mohou soubor pouze číst) a pro ostatní ---
(žádná oprávnění). Velikost souboru je 836 bajtů a naposledy bylo do něj zapisováno 10. listopadu v 11 hodin a 50 minut (aktuálního roku – jinak se rok zobrazí místo času).
$ ls -l soubor.txt -rw-r----- 1 rene.huzva rene.huzva 836 lis 10 11:50 soubor.txt
Ve následujícím výpisu je pomocí přepínače -d
zajištěno, že se nevypíše obsah adresáře, ale adresář sám (resp. jeho oprávnění). Na levé straně výpisu je tentokrát u kraje písmeno d, které oznamuje, že se jedná o adresář. Následují tří trojice oprávnění: pro vlastníka rwx
(může adresář vypsat, může v něm vytvářet a mazat soubory a může do něj vstoupit), pro skupinu r-x
(členové skupiny mohou adresář vypsat a mohou do něj vstoupit) a pro ostatní ---
(žádná oprávnění). Velikost adresáře je 836 bajtů (záleží na maximálním použitém počtu obsažených položek, uživatel nemůže tento údaj nijak ovlivnit) a naposledy byl adresář upravován 10. listopadu v 11 hodin a 51 minut (aktuálního roku – jinak se rok zobrazí místo času), tj. tohoto data v něm byl vytvořen nebo smazán soubor.
$ ls -ld adresar drwxr-x--- 2 rene.huzva rene.huzva 4096 lis 10 11:51 adresar
Změna oprávnění
chown 600 soubor.txt # nastavení čtení a zápisu majiteli, ostatním nic chown u-w soubor.txt # odebrání práva zápisu majiteli