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
dockerznamená „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ěží podwww-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 heslapasswd, na skupinyusermod -aG. Ruční překlep v/etc/passwdti 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 /*neborm -rf /nejaka-slozkasmaže bez milosti. (Holérm -rf /dnešnírmnaštěstí odmítne díky pojistce--preserve-root— alerm -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í
sudose zaloguje (kdo, kdy, co spustil). Usuvíš 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řesvisudo, 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 towheel, na Debianu/Ubuntusudo. 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éž:
| Znak | U souboru | U složky |
|---|---|---|
r (read) | přečíst obsah | vypsat, co je uvnitř (ls) |
w (write) | změnit obsah | vytvářet/mazat soubory uvnitř |
x (execute) | spustit jako program | vejít do složky (cd) a sáhnout na soubory v ní |
Takže -rwxr-xr-- čteš takhle:
-— je to obyčejný souborrwx— vlastník (matej) smí číst, měnit i spouštětr-x— skupina (vyvojari) smí číst a spouštět, ale ne měnitr--— ostatní smí jen číst
🚩 U složek plete
xkaždého začátečníka.rna složce ti dovolí vypsat jména souborů uvnitř, alexti dovolí vejít dovnitř a s těmi soubory pracovat. Bezxna 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á
💡
755vs644: rozdíl je jen v tomx. Skript, který chceš spouštět, potřebuje755(nebo aspoňu+x). Obyčejný textový souborxnepotřebuje a644mu ú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 vx, ve vlastníkovi, nebo ve skupině.
Failure modes — časté omyly začátečníků
chmod 777na všechno. „Nešlo to, tak jsem dal 777 a funguje." Jenže777znamená 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+xnebo správný vlastník).sudou všeho ze zvyku. Když každý příkaz cpeš přessudo, ztrácíš ochranu, kterou ti běžný účet dává — a jednoho dne omylem sudo-spustíš něco škodlivého.sudopoužívej jen tam, kde ho příkaz vyloženě potřebuje.chmod -Romylem 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 -Rnebochown -R.- Zapomenuté
+xu skriptu.Permission deniedu 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řessudo(asudoersvždy přesvisudo).
🛠️ Cvičení
- 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/passwdsvůj řádek a přečti z něj svůj domovský adresář a shell. - 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ě? - Udělej ze souboru skript. Vytvoř soubor
ahoj.shs jedním řádkemecho Ahoj, zkus ho spustit přes./ahoj.sha vysvětli, proč to nejde. Pak to naprav a spusť znovu. - Čí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á. - Systémový vs lidský uživatel. Najdi v
/etc/passwdjednoho 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
- Přečti si sám sebe —
idvypíše např.uid=1000(matej) gid=1000(matej) groups=1000(matej),10(wheel);whoamijen jméno. Řádek v/etc/passwd(grep "^$(whoami):" /etc/passwd) má na konci domovský adresář a shell (/home/matej:/bin/bash). Pozor:/etc/passwdnavzdory jménu neobsahuje hesla — ta jsou v/etc/shadow. - Rozlušti
ls -l— nový soubor bývá-rw-r--r--(kvůliumask 022): vlastník čte+píše, skupina i ostatní jen čtou. Číselně644(6=rw, 4=r, 4=r). Pozor:xtam není, takže spustit ho nejde — a je to tak správně, textový souborxnepotřebuje. - Udělej ze souboru skript —
./ahoj.shskončíPermission denied, protože souboru chybí právox(nově vzniklý souborxnemá). Napravchmod +x ahoj.sh, pak./ahoj.shvypíšeAhoj. Pozor:Permission deniedu vlastního skriptu je skoro vždy chybějící+x, ne rozbitý systém. - Číselně vs symbolicky —
chmod 640 soubordárw-r-----(vlastník rw, skupina r, ostatní nic).chmod u+x souborpřidá vlastníkovix→rwxr-----→ čí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. - Systémový vs lidský uživatel — uživatel pod UID 1000 (např.
www-data,sshd,postgres) je systémový: často má shell/usr/sbin/nologinnebo/bin/falsea 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?
su tě promě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á rwxrwxrwx — kdokoli 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.
