Uživatelé a práva

chmod, chown, sudo, kdo co smí.

V Linuxu nikdo nesmí sám od sebe všechno. Každý soubor má vlastníka a sadu pravidel, kdo si ho smí přečíst, změnit nebo spustit. Každý proces běží pod nějakým uživatelem a smí přesně to, co ten uživatel. Tenhle jednoduchý systém — uživatelé, skupiny, práva — je celý základ toho, proč se na Linuxu dá bezpečně provozovat server, na kterém pracuje deset lidí, a nikdo si navzájem nerozbije data. Až to pochopíš, přestane ti „Permission denied" nahánět hrůzu a začneš v něm vidět kamaráda.


Pár pojmů na úvod

  • Uživatel (user) = účet, pod kterým něco běží. Nemusí to být člověk — spousta uživatelů jsou „systémoví" a slouží jen k tomu, aby pod nimi jezdily služby (web server, databáze).
  • UID = číselné ID uživatele. Systém uvnitř pracuje s čísly, jméno (matej) je jen popiska. UID 0 = root, superuživatel, který smí všechno.
  • Skupina (group) = pojmenovaná parta uživatelů. Práva se dají dát celé skupině najednou — třeba skupina docker znamená „smí ovládat Docker". GID = číselné ID skupiny.
  • root = superuživatel (UID 0). Obchází všechna práva. Mocný a nebezpečný zároveň.
  • Práva (permissions) = tři sady po třech písmenech (rwx) na každém souboru: co smí vlastník, co smí skupina, co smí ostatní.
  • sudo = „spusť tenhle jeden příkaz jako root". Tvůj hlavní nástroj, jak dělat správcovské věci bezpečně, aniž bys pod rootem trvale seděl.

Uživatelé a skupiny — kdo je kdo

Každý účet v systému má jméno (pro lidi) a UID (pro systém). Když napíšeš whoami, uvidíš svoje jméno; id ti ukáže i čísla a skupiny, do kterých patříš:

whoami          # matej
id              # uid=1000(matej) gid=1000(matej) groups=1000(matej),10(wheel),984(docker)

Uživatelé se dělí na dva druhy:

  • Lidští uživatelé — účty pro skutečné lidi. Mají UID typicky od 1000 výš, domovský adresář (/home/matej) a přihlašovací shell.
  • Systémoví uživatelé — účty pro služby, ne pro lidi. Mají UID pod 1000 (např. www-data, postgres, sshd). Nemají heslo pro přihlášení a často ani shell — existují jen proto, aby pod nimi běžely programy s omezenými právy. Kdyby web server běžel pod tvým účtem a někdo ho hacknul, měl by útočník tvoje data. Když běží pod www-data, smí skoro nic.

💡 Proč vůbec skupiny? Představ si, že chceš deseti kolegům povolit přístup ke sdílené složce. Bez skupin bys musel práva nastavit desetkrát a při jedenáctém kolegovi znovu. Se skupinou přidáš člověka do skupiny a hotovo — práva už tam jsou.

Kde to všechno bydlí — tři soubory

Linux si účty a hesla drží v obyčejných textových souborech. Můžeš do nich nahlédnout (cat):

cat /etc/passwd     # seznam uživatelů (KDO existuje)
cat /etc/group      # seznam skupin
sudo cat /etc/shadow  # hesla (zahashovaná) — čitelné jen pro root

/etc/passwd — řádek na uživatele, pole oddělená dvojtečkou. Navzdory jménu tu hesla nejsou:

matej:x:1000:1000:Matej Pospisil:/home/matej:/bin/bash
│     │ │    │    │              │           └ shell (co se spustí po přihlášení)
│     │ │    │    │              └ domovský adresář
│     │ │    │    └ popis (jméno člověka)
│     │ │    └ GID (hlavní skupina)
│     │ └ UID
│     └ „x" = heslo je jinde (v /etc/shadow)
└ přihlašovací jméno

/etc/group — jméno skupiny, GID a seznam členů:

docker:x:984:matej,honza

/etc/shadow — sem se přesunula hesla, a to zahashovaná (ne v čitelné podobě) a soubor smí číst jen root. Hash znamená, že se z uloženého řetězce nedá heslo spočítat zpátky — při přihlášení se jen zahashuje to, co jsi zadal, a porovná se. Proto ani root „nevidí" tvoje heslo, jen jeho otisk.

🚩 Nikdy tyhle soubory needituj ručně v editoru „jen tak". Na přidání uživatele slouží useradd / adduser, na změnu hesla passwd, na skupiny usermod -aG. Ruční překlep v /etc/passwd ti může zavřít přihlášení.


root — superuživatel, a proč pod ním nejezdit

root (UID 0) je účet, který obchází všechna práva. Smaže cokoli, přečte cokoli, změní cokoli. Je potřeba na správu systému: instalace balíčků, úpravy v /etc, ovládání služeb. Ale:

  • Nic tě nezastaví. Pod rootem projde i katastrofa: rm -rf /* nebo rm -rf /nejaka-slozka smaže bez milosti. (Holé rm -rf / dnešní rm naštěstí odmítne díky pojistce --preserve-root — ale rm -rf /* už glob rozbalí na /bin /etc /home … a pojistku obejde.) Pod běžným účtem ti to práva nedovolí, a to je záchrana.
  • Chyba = katastrofa. Překlep v příkazu, zlomyslný skript, špatně zkopírovaný řádek z internetu — pod rootem má plný dopad.
  • Malware taky. Když si omylem spustíš něco škodlivého jako root, dostane klíče od celého stroje.

Proto zlaté pravidlo: běžně pracuj jako obyčejný uživatel a root si „půjč" jen na tu jednu operaci, která ho fakt potřebuje — přes sudo. Je to jako klíče od trezoru: nenosíš je pořád v ruce, vezmeš si je jen na tu chvíli, kdy trezor otevíráš.


sudo vs su — dvě cesty k rootovi

Existují dva způsoby, jak udělat něco s právy roota:

su (switch user) — staneš se rootem a zůstaneš jím, dokud nenapíšeš exit. Celý shell pak běží pod rootem:

su -            # zeptá se na heslo ROOTA, pak jsi root pořád
# ... tady jsi root, každý příkaz je nebezpečný ...
exit            # zpátky na sebe

sudo (superuser do) — spustí jen ten jeden příkaz jako root, pak jsi zase sebou. Ptá se na tvoje heslo (ne rootovo):

sudo dnf install htop     # jen tenhle příkaz jede jako root
htop                      # tohle už zase jako ty

Proč je sudo skoro vždy lepší:

  • Granularita — root máš jen na ten jeden příkaz, ne na celou session. Menší okno na chybu.
  • Audit — každé použití sudo se zaloguje (kdo, kdy, co spustil). U su víš jen, že se někdo stal rootem; co pak dělal, se ztrácí.
  • Žádné sdílené heslo roota — lidé používají svá vlastní hesla. Účet roota může být klidně zamčený (nemá použitelné heslo vůbec), a přesto správci fungují přes sudo.
  • Nastavitelnost — v /etc/sudoers (edituj vždy přes visudo, ne ručně!) se dá povolit konkrétnímu uživateli jen konkrétní příkazy. Třeba „smí restartovat web server, ale nic víc".

💡 Kdo smí sudo, řídí členství ve skupině — na Fedoře/RHEL je to wheel, na Debianu/Ubuntu sudo. Přidání: sudo usermod -aG wheel matej (a znovu se přihlásit, aby se skupina projevila).


Práva souborů — jak číst ls -l

Napiš ls -l a u každého souboru uvidíš vlevo shluk písmen a pomlček. To je mapa práv:

ls -l
-rwxr-xr--  1 matej  vyvojari  8461 Jul 12 10:30 skript.sh

Prvních deset znaků rozlož takhle:

Tři písmena v každé skupině vždy znamenají totéž:

ZnakU souboruU složky
r (read)přečíst obsahvypsat, co je uvnitř (ls)
w (write)změnit obsahvytvářet/mazat soubory uvnitř
x (execute)spustit jako programvejít do složky (cd) a sáhnout na soubory v ní

Takže -rwxr-xr-- čteš takhle:

  • - — je to obyčejný soubor
  • rwxvlastník (matej) smí číst, měnit i spouštět
  • r-xskupina (vyvojari) smí číst a spouštět, ale ne měnit
  • r--ostatní smí jen číst

🚩 U složek plete x každého začátečníka. r na složce ti dovolí vypsat jména souborů uvnitř, ale x ti dovolí vejít dovnitř a s těmi soubory pracovat. Bez x na složce se do ní nedostaneš, i kdybys měl práva na soubory uvnitř. Nejčastější „proč mě to nepustí do složky" je právě chybějící x.


chmod — měníme práva

chmod (change mode) nastavuje práva. Jdou zadat dvěma způsoby a je dobré umět oba.

Symbolicky — když měníš jednu věc

Řekneš komu (u vlastník, g skupina, o ostatní, a všichni), co (+ přidej, - odeber, = nastav přesně) a které právo (r/w/x):

chmod u+x skript.sh      # vlastníkovi přidej právo spouštět
chmod g-w soubor.txt     # skupině odeber právo zapisovat
chmod o-r tajne.txt      # ostatním zakaž čtení
chmod a+r verejne.txt    # všem povol čtení
chmod u+x,g+x deploy.sh  # víc změn najednou (čárkou)

Číselně — když nastavuješ celá práva naráz

Každé z rwx má svou hodnotu, a ty je sečteš:

r = 4     w = 2     x = 1

Součet dá jednu číslici (0–7) pro každou skupinu. Tři číslice = vlastník, skupina, ostatní:

rwx = 4+2+1 = 7      (čti, zapiš, spusť)
r-x = 4+0+1 = 5      (čti, spusť)
r-- = 4+0+0 = 4      (jen čti)
rw- = 4+2+0 = 6      (čti, zapiš)

Nejčastější kombinace, které si zapamatuj:

chmod 755 skript.sh      # rwxr-xr-x — vlastník vše, ostatní čtou+spouští (skripty, programy)
chmod 644 dokument.txt   # rw-r--r-- — vlastník čte+píše, ostatní jen čtou (běžné soubory)
chmod 600 klic.pem       # rw------- — jen vlastník, nikdo jiný (privátní klíče, hesla)
chmod 700 slozka         # rwx------ — do složky smím jen já

💡 755 vs 644: rozdíl je jen v tom x. Skript, který chceš spouštět, potřebuje 755 (nebo aspoň u+x). Obyčejný textový soubor x nepotřebuje a 644 mu úplně stačí.

chown a chgrp — kdo soubor vlastní

Práva říkají „co smí vlastník/skupina/ostatní". Ale kdo je ten vlastník a která skupina? To měníš zvlášť:

sudo chown honza soubor.txt          # vlastníkem bude honza
sudo chgrp vyvojari soubor.txt       # skupina bude vyvojari
sudo chown honza:vyvojari soubor.txt # obojí naráz (vlastník:skupina)
sudo chown -R matej:matej ~/projekt  # -R = rekurzivně, celý strom složek

Změna vlastníka většinou potřebuje sudo — nemůžeš „darovat" soubor někomu jinému a tím obejít účtování.


umask — jaká práva dostanou nové soubory

Když vytvoříš nový soubor, odkud se vezmou jeho práva? Ze základu, ze kterého umask vypne některé bity. umask je „maska", která z výchozích práv odmaskuje (technicky bitově, ne odčítáním — pro běžné masky ze sudých číslic to ale vyjde stejně). Výchozí základ je 666 pro soubory a 777 pro složky; typický umask je 022:

umask            # 0022 — vypne zápis skupině a ostatním
# nový soubor:  666 bez bitů z 022 = 644  (rw-r--r--)
# nová složka:  777 - 022 = 755  (rwxr-xr-x)

Nemusíš to počítat denně — stačí vědět, proč nové soubory nevznikají rovnou zapisovatelné pro všechny: postará se o to umask. Kdyby byl 000, každý nový soubor by mohl přepsat kdokoli, a to je díra. Proto ho neměň, pokud přesně nevíš proč.


Typické situace, na které narazíš

„Skript nejde spustit." Napíšeš ./deploy.sh a dostaneš Permission denied. Skoro vždy chybí x:

ls -l deploy.sh     # -rw-r--r-- ← žádné x
chmod +x deploy.sh  # přidej právo spouštět
./deploy.sh         # teď to jede

„Permission denied" při zápisu. Chceš editovat systémový soubor (třeba v /etc) a editor řekne, že nemáš práva. Ten soubor vlastní root — potřebuješ sudo:

nano /etc/hosts          # E212: Can't open file for writing
sudo nano /etc/hosts     # takhle ano

💡 Když si nejsi jistý, proč něco nejde, první sáhni po ls -l. Ukáže ti vlastníka, skupinu a práva — a z toho hned vidíš, jestli je problém v x, ve vlastníkovi, nebo ve skupině.


Failure modes — časté omyly začátečníků

  • chmod 777 na všechno. „Nešlo to, tak jsem dal 777 a funguje." Jenže 777 znamená kdokoli smí číst, přepsat i spustit — otevřená díra. Skoro nikdy není správná odpověď; správně je najít, které konkrétní právo chybí (obvykle +x nebo správný vlastník).
  • sudo u všeho ze zvyku. Když každý příkaz cpeš přes sudo, ztrácíš ochranu, kterou ti běžný účet dává — a jednoho dne omylem sudo-spustíš něco škodlivého. sudo používej jen tam, kde ho příkaz vyloženě potřebuje.
  • chmod -R omylem na / nebo na /etc. Rekurzivní změna práv na půlku systému rozbije, co potká (ssh přestane přijímat klíče, služby nenaběhnou). Vždy si dvakrát zkontroluj cestu, než pustíš chmod -R nebo chown -R.
  • Zapomenuté +x u skriptu. Permission denied u vlastního skriptu není chyba systému — jen mu chybí právo spouštět. chmod +x.
  • Editace systémového souboru bez práv. Otevřeš /etc/… v editoru, hodinu píšeš a při uložení zjistíš, že nemáš práva a změny propadly. Systémové soubory otevírej rovnou přes sudo (a sudoers vždy přes visudo).

🛠️ Cvičení

  1. Přečti si sám sebe. Zjisti svoje UID, GID a do jakých skupin patříš. (Nápověda: id, whoami.) Pak najdi v /etc/passwd svůj řádek a přečti z něj svůj domovský adresář a shell.
  2. Rozlušti ls -l. Vytvoř soubor (touch pokus.txt), podívej se na jeho práva (ls -l pokus.txt) a napiš slovy, co smí vlastník, skupina a ostatní. Kolik je to číselně?
  3. Udělej ze souboru skript. Vytvoř soubor ahoj.sh s jedním řádkem echo Ahoj, zkus ho spustit přes ./ahoj.sh a vysvětli, proč to nejde. Pak to naprav a spusť znovu.
  4. Číselně vs symbolicky. Nastav souboru práva 640 číselně. Pak tomu samému souboru přidej právo spouštět pro vlastníka symbolicky a řekni, jaké číslo teď má.
  5. Systémový vs lidský uživatel. Najdi v /etc/passwd jednoho uživatele s UID pod 1000 a jednoho nad 1000. Podle čeho poznáš, který je „služba" a který „člověk"?
Náčrt řešení — rozbal, až si cvičení zkusíš sám
  1. Přečti si sám sebeid vypíše např. uid=1000(matej) gid=1000(matej) groups=1000(matej),10(wheel); whoami jen jméno. Řádek v /etc/passwd (grep "^$(whoami):" /etc/passwd) má na konci domovský adresář a shell (/home/matej:/bin/bash). Pozor: /etc/passwd navzdory jménu neobsahuje hesla — ta jsou v /etc/shadow.
  2. Rozlušti ls -l — nový soubor bývá -rw-r--r-- (kvůli umask 022): vlastník čte+píše, skupina i ostatní jen čtou. Číselně 644 (6=rw, 4=r, 4=r). Pozor: x tam není, takže spustit ho nejde — a je to tak správně, textový soubor x nepotřebuje.
  3. Udělej ze souboru skript./ahoj.sh skončí Permission denied, protože souboru chybí právo x (nově vzniklý soubor x nemá). Naprav chmod +x ahoj.sh, pak ./ahoj.sh vypíše Ahoj. Pozor: Permission denied u vlastního skriptu je skoro vždy chybějící +x, ne rozbitý systém.
  4. Číselně vs symbolickychmod 640 souborrw-r----- (vlastník rw, skupina r, ostatní nic). chmod u+x soubor přidá vlastníkovi xrwxr----- → číselně 740. Pozor: symbolická změna mění jen to, co řekneš, zbytek nechá být — na rozdíl od číselného zápisu, který nastaví všechna práva naráz.
  5. Systémový vs lidský uživatel — uživatel pod UID 1000 (např. www-data, sshd, postgres) je systémový: často má shell /usr/sbin/nologin nebo /bin/false a domov mimo /home. Uživatel nad 1000 (např. matej) má domov v /home/… a přihlašovací shell (/bin/bash). Pozor: hranice 1000 je konvence distribuce, ne zákon jádra — ale platí skoro všude.

🧠 Otázky & odpovědi

Proč se nemám běžně přihlašovat jako root?

Protože root obchází všechna práva — nic ho nezastaví. Překlep, zlomyslný skript nebo špatně zkopírovaný řádek z internetu má pod rootem plný dopad (např. rm -rf /* opravdu smaže systém). Pod běžným účtem tě práva ochrání: co nesmíš, prostě neuděláš. Root si proto „půjč" jen na tu jednu operaci, která ho fakt potřebuje, přes sudo, a jinak jezdi jako obyčejný uživatel.

Jaký je rozdíl mezi sudo a su?

supromění v roota a zůstaneš jím, dokud nenapíšeš exit — celý shell pak běží s plnou mocí. sudo spustí jen jeden příkaz jako root a hned tě vrátí zpátky. sudo je bezpečnější: menší okno na chybu, každé použití se loguje (kdo, kdy, co), ptá se na tvoje heslo (ne sdílené heslo roota) a dá se omezit na konkrétní příkazy. Účet roota tak může být klidně úplně zamčený.

Co znamená rwx u souboru a co u složky?

r čti, w zapiš, x spusť — ale u složky mají mírně jiný smysl. U souboru: r přečíst obsah, w změnit obsah, x spustit jako program. U složky: r vypsat jména souborů uvnitř (ls), w vytvářet a mazat soubory uvnitř, x vejít do složky (cd) a sáhnout na to, co je v ní. Nejčastější záhada „proč mě to nepustí do složky" je právě chybějící x na té složce.

Jak se počítá chmod 755?

Každé právo má hodnotu: r=4, w=2, x=1. Sečteš je pro každou ze tří skupin (vlastník, skupina, ostatní). 7 = 4+2+1 = rwx, 5 = 4+0+1 = r-x. Takže 755 = rwxr-xr-x: vlastník smí vše, skupina a ostatní čtou a spouští, ale nezapisují. Typicky se dává skriptům a programům. Pro obyčejné soubory stačí 644 (rw-r--r--) — rozdíl je jen v tom x, které textový soubor nepotřebuje.

Proč je chmod 777 na všechno špatný nápad?

777 znamená rwxrwxrwxkdokoli smí soubor číst, přepsat i spustit. Když to dáš na data nebo skripty, otevřeš díru: kdokoli s přístupem k systému (nebo hacknutá služba) je může přepsat nebo do nich podstrčit škodlivý kód. Lidi na 777 sahají z frustrace, když něco nejde — ale správná odpověď je najít, které konkrétní právo chybí (obvykle +x u skriptu nebo správný vlastník přes chown), ne otevřít všechno všem.