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.

Odhadovaná délka studia: 55 minut · Stav: nehotovo

Technologie: Linux

Ú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ů:

  1. owner (u) — vlastník souboru,
  2. group (g) — skupina souboru,
  3. 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--
    1. znak: typ souboru (- běžný soubor, d adresář, l symlink),
  • 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

  1. Co znamená oktalový zápis práv 640 v symbolické podobě a pro koho
    platí která práva?
  2. Jaký příkaz použijete pro rekurzivní nastavení vlastníka www-data a
    skupiny www-data na celý adresář /var/www/app?
  3. Proč je nebezpečné nastavit soukromému SSH klíči práva 644 místo
    600?
  4. 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í.