Modul 1 — Základy Linuxu a příkazové řádky
3. Práva a vlastnictví souborů (chmod, chown, uživatelé a skupiny)
Vysvětlení modelu přístupových práv v Linuxu a práce s příkazy chmod, chown a správou uživatelů a skupin.
Úvod a kontext
Linux je od základu navržen jako víceuživatelský systém — na jednom
serveru může pracovat mnoho uživatelů a služeb současně a systém musí
zajistit, že si vzájemně nemohou (neúmyslně ani úmyslně) číst, měnit nebo
mazat data. K tomu slouží model přístupových práv a vlastnictví souborů.
Pro DevOps inženýra je tohle téma naprosto zásadní — špatně nastavená
práva jsou jednou z nejčastějších příčin bezpečnostních incidentů (např.
veřejně čitelný soukromý SSH klíč) i provozních chyb (aplikace nemůže
zapisovat do adresáře s logy).
Teorie
Uživatelé a skupiny
Každý soubor v Linuxu patří přesně jednomu uživateli (vlastníkovi) a
přesně jedné skupině. Uživatelé jsou definováni v /etc/passwd,
skupiny v /etc/group. Speciální uživatel root (UID 0) má
neomezená práva a obchází běžné kontroly přístupu — proto se v praxi root
používá jen pro administrativní úkony, běžná práce (i běh aplikací) probíhá
pod účty s omezenými právy.
Užitečné příkazy pro práci s uživateli a skupinami:
whoami # jméno aktuálního uživatele
id # UID, GID a členství ve skupinách aktuálního uživatele
groups petr # skupiny, ve kterých je uživatel petr
sudo useradd -m jana # vytvoří nového uživatele jana i s domovským adresářem
sudo groupadd deploy # vytvoří novou skupinu deploy
sudo usermod -aG deploy jana # přidá uživatele jana do skupiny deploy
Trojice práv: vlastník, skupina, ostatní
Ke každému souboru se váží tři sady práv, pro tři kategorie subjektů:
- owner (u) — vlastník souboru,
- group (g) — skupina souboru,
- others (o) — všichni ostatní uživatelé v systému.
Pro každou kategorii existují tři typy práv:
- r (read) — právo číst obsah souboru / vypsat obsah adresáře,
- w (write) — právo zapisovat do souboru / vytvářet a mazat soubory v
adresáři, - x (execute) — právo spustit soubor jako program/skript / vstoupit
(cd) do adresáře.
Ve výpisu ls -l se práva zobrazují jako desetiznakový řetězec, například:
-rwxr-xr--
-
- znak: typ souboru (
-běžný soubor,dadresář,lsymlink),
- znak: typ souboru (
- znaky 2–4: práva vlastníka (
rwx= číst, zapisovat, spouštět), - znaky 5–7: práva skupiny (
r-x= číst a spouštět, ne zapisovat), - znaky 8–10: práva ostatních (
r--= pouze číst).
Číselný (oktalový) zápis práv
Práva lze zapisovat i číselně — každé právo má hodnotu: r=4, w=2,
x=1, sečtou se pro danou kategorii. Např. rwx = 4+2+1 = 7,
r-x = 4+1 = 5, r-- = 4 = 4. Trojice rwxr-xr-- z předchozího
příkladu odpovídá číslu 754. Nejčastější kombinace, se kterými se
setkáte:
| Oktal | Symbolicky | Typické použití |
|---|---|---|
| 755 | rwxr-xr-x | spustitelné skripty, adresáře |
| 644 | rw-r--r-- | běžné datové/konfigurační soubory |
| 700 | rwx------ | soukromé skripty/adresáře, jen pro vlastníka |
| 600 | rw------- | soukromé klíče, hesla — čte/zapisuje jen vlastník |
| 777 | rwxrwxrwx | "otevřeno pro všechny" — v produkci prakticky nikdy nepoužívat |
Změna práv: chmod
Příkaz chmod mění přístupová práva, buď číselně nebo symbolicky:
chmod 644 app.conf # číselně: vlastník rw, skupina r, ostatní r
chmod u+x deploy.sh # symbolicky: přidá vlastníkovi právo spouštět
chmod go-w tajny_soubor # symbolicky: odebere skupině a ostatním právo zápisu
chmod -R 755 /var/www/app # rekurzivně na celý adresářový strom
Změna vlastníka a skupiny: chown a chgrp
sudo chown petr soubor.txt # změní vlastníka na petr
sudo chown petr:deploy soubor.txt # změní vlastníka na petr i skupinu na deploy
sudo chown -R www-data:www-data /var/www/app # rekurzivně — typické pro webserver
sudo chgrp deploy soubor.txt # změní jen skupinu
Speciální bity (jen k přehledu)
Kromě rwx existují i speciální bity — SUID, SGID a sticky bit
— které mění chování spuštění programu nebo mazání v adresáři (např.
sticky bit na /tmp zajišťuje, že uživatel může smazat jen své vlastní
soubory). V běžné DevOps praxi na ně narazíte málo, ale je dobré vědět, že
existují a projeví se jako čtvrtá číslice v chmod (např. chmod 1777
/tmp).
Praktický příklad
Typický scénář: připravujeme deploy skript, který má spouštět jen
vlastník, a konfigurační soubor s citlivým heslem, ke kterému nesmí mít
přístup nikdo kromě vlastníka a skupiny deploy.
# Vytvoříme skript a nastavíme mu právo spouštění jen pro vlastníka
$ touch deploy.sh
$ ls -l deploy.sh
-rw-r--r-- 1 petr petr 0 16. zář 10:00 deploy.sh
$ chmod 700 deploy.sh
$ ls -l deploy.sh
-rwx------ 1 petr petr 0 16. zář 10:00 deploy.sh
# Vytvoříme konfigurační soubor s heslem
$ touch secrets.env
$ echo "DB_PASSWORD=tajneheslo" > secrets.env
# Nastavíme vlastníka petr, skupinu deploy
$ sudo chown petr:deploy secrets.env
# Práva: vlastník čte/zapisuje, skupina jen čte, ostatní nic
$ chmod 640 secrets.env
$ ls -l secrets.env
-rw-r----- 1 petr deploy 24 16. zář 10:02 secrets.env
# Ověříme, kdo je ve skupině deploy
$ groups jana
jana : jana deploy
# Uživatel jana (člen skupiny deploy) si soubor může přečíst, ale ne
# upravit — přesně jak jsme zamýšleli.
Tento vzor — vlastník s plným přístupem, skupina jen se čtením, ostatní
bez přístupu (640, resp. 600 u opravdu citlivých souborů jako SSH
klíče) — je v DevOps praxi naprosto běžný pro konfigurace a tajemství.
Shrnutí
Každý soubor v Linuxu má vlastníka, skupinu a tři sady práv (číst, zapisovat,
spouštět) pro vlastníka, skupinu a ostatní. Práva se čtou z výstupu ls -l
buď symbolicky (rwxr-xr--), nebo číselně (754). Ke změně práv slouží
chmod, ke změně vlastníka/skupiny chown/chgrp. Správné nastavení práv
je jedním z nejdůležitějších bezpečnostních opatření na serveru — citlivé
soubory (hesla, klíče) by nikdy neměly být čitelné pro "ostatní".
Kontrolní otázky
- Co znamená oktalový zápis práv
640v symbolické podobě a pro koho
platí která práva? - Jaký příkaz použijete pro rekurzivní nastavení vlastníka
www-dataa
skupinywww-datana celý adresář/var/www/app? - Proč je nebezpečné nastavit soukromému SSH klíči práva
644místo
600? - Jaký je rozdíl mezi právem
x(execute) u běžného souboru a u
adresáře?
Lekce na sebe nejsou zamčené — libovolnou lekci můžete otevřít i označit jako hotovou v jakémkoliv pořadí.