Přístupová práva v Linuxu

Z Milan Kerslager
Přejít na: navigace, hledání

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 standardu POSIX (viz ACL v Linuxu), která poskytují flexibilnější možnosti nastavení.

Uživatelé

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 úč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říkazu chsh, 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:

id                            # zjištění UID a všech GID právě přihlášeného uživatele
id rene.huzva                 # zjištění UID a všech GID uživatele rene.huzva
groups                        # výpis skupin, jihž je uživatel členem
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ýznam oprávnění pro soubory a adresáře

Oprávnění mají mírně odlišný význam pro adresáře, jak je uvedeno v následující tabulce. Právo spuštění slouží u adresáře k povolení vstupu do adresáře (ale ne jeho výpis, takže v případě absence práva read musí uživatel znát jméno souboru, ke kterému chce přistupovat). Navíc je nutné, aby uživatel měl právo přístupu ke všem nadřízeným adresářům (včetně kořenového adresáře souborového systému).

Soubor Adresář
Read čtení obsahu souboru výpis obsahu adresáře
Write zápis do souboru zápis do adresáře (vytváření, mazání a přejmenování souborů i podadresářů)
eXecute spuštění (program, skript) vstup do adresáře

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 (může obsahovat ještě písmena d (adresář), l (linka), b (blokové zařízení), c (znakové zařízení), p (roura), s (soket)).

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). Přesnější informace lze vypsat příkazem stat (více viz Základní příkazy Unixu).

$ 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 7. dubna 2006 (tj. tohoto data byl v adresáři vytvořen nebo smazán soubor). Přesnější informace lze vypsat příkazem stat (stejně jako u souboru, více viz Základní příkazy Unixu).

$ ls -ld adresar
drwxr-x--- 2 rene.huzva rene.huzva 4096 dub  7  2006 adresar

Změna oprávnění

Oprávnění Zkratka Anglicky Oktalově
Čtení r Read 4
Zápis w Write 2
Spuštění x eXecute 1

Změnu oprávnění může udělat majitel souboru nebo správce počítače (uživatel root). Oprávnění se zadávají symbolicky (viz tabulka) nebo oktalově. V oktalovém zápisu je každá trojice reprezentována jedním číslem, přičemž její hodnota je dána bitovým vyjádřením práv rwx (tj. součet existujících oprávnění: r: 4, w: 2, x:1).

Kdo Operace Oprávnění
u + r
g - w
o = x

V symbolickém zápisu se nejprve zapisuje, komu jsou práva přidělována (u: majitel (user), g: skupina (group), o: ostatní (others)). Pak se zapisuje operace s oprávněními (+: přidej, -: odeber, =: nastav tato práva). Nakonec se určuje, jaká oprávnění se budou nastavovat (r: čtení (read), w: zápis (write), x: spuštění (execute)).

chmod 600 soubor.txt    # nastavení čtení a zápisu majiteli, ostatním nic
chmod u-w soubor.txt    # odebrání práva zápisu majiteli
chmod ug=rwx soubor.txt # nastavení rwx pro majitele a skupinu

Příklady oprávnění:

700 - soukromé spustitelné soubory nebo privátní adresář
600 - soukromé datové soubory
644 - privátní data s volným přístupem
660 - privátní data pro práci ve skupině
755 - privátní adresář s volným přístupem pro ostatní
770 - privátní projekt skupiny
777 - volně přístupný adresář (nepoužívá se bez sticky bitu)
666 - volně přístupný soubor
604 - privátní soubor s daty, ke kterému nemůže jedna skupina
705 - adresář, do kterého nemohou členové jedné skupiny