Uživatelé, skupiny a oprávnění souborů
Modul 3: Uživatelé, oprávnění a sudo · Doba čtení: 12 min.
Cíl lekce: Po této lekci dokážete vytvářet a prohlížet uživatele a skupiny, číst oprávnění souboru nebo adresáře v ls -l a správně je nastavit pomocí chmod a chown, aniž byste vše otevřeli dokořán.
Klíčové pojmy: root (UID 0), běžný uživatel, systémový uživatel, /etc/passwd, /etc/shadow, skupina, adduser, id, rwx, vlastník, skupina, ostatní, osmičkový zápis (644, 755, 600), chmod, chown, umask, setuid, 777
Každý je číslo
Linux byl od začátku navržen pro více uživatelů na jednom počítači. Každý běžící proces běží jménem nějakého uživatele a každý soubor má vlastníka. Pro systém je uživatel především číslo, UID:
- root má UID 0. Root smí všechno: číst a měnit každý soubor, zastavit každou službu, vytvořit jakéhokoli uživatele. Žádné "opravdu chcete pokračovat?" neexistuje.
- Běžní uživatelé, například
anna, dostávají na Debianu a Ubuntu UID od 1000. Smějí zapisovat do svého domovského adresáře a jinak toho mnoho nesmějí. - Systémoví uživatelé mají nízké číslo a obvykle nemají heslo ani shell. Pod takovým uživatelem běží služby: nginx pod
www-data, PostgreSQL podpostgres. Pokud je taková služba napadena, má útočník jen oprávnění tohoto uživatele, nikoli oprávnění roota.
Kdo jste, zjistíte příkazem id:
anna@web1:~$ id
uid=1000(anna) gid=1000(anna) groups=1000(anna),27(sudo),100(users)Anna má UID 1000, vlastní skupinu anna a je také ve skupinách sudo a users.
Kde jsou uživatelé uloženi
Seznam uživatelů je v souboru /etc/passwd, jeden řádek na uživatele:
anna@web1:~$ grep -E '^(root|www-data|anna):' /etc/passwd
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
anna:x:1000:1000:Anna,,,:/home/anna:/bin/bashPole oddělená dvojtečkami: jméno, x (heslo je uloženo jinde), UID, primární skupina, popis, domovský adresář, shell. U www-data je jako shell uvedeno /usr/sbin/nologin: přihlásit se nelze.
Samotná hesla jsou uložena zašifrovaná (jako hash) v souboru /etc/shadow. Ten může číst jen root. Znak ! nebo * na začátku pole s heslem znamená: přihlášení heslem není možné. Takto je root na Ubuntu ve výchozím stavu zamčený, a na Debianu také, pokud jste při instalaci nezadali heslo pro roota.
Vytváření uživatelů a skupin
Na Debianu a Ubuntu použijete přívětivý příkaz adduser:
root@web1:~# adduser anna
info: Adding user `anna' ...
info: Adding new group `anna' (1000) ...
info: Adding new user `anna' (1000) with group `anna (1000)' ...
info: Creating home directory `/home/anna' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
...adduser vytvoří uživatele, vlastní skupinu se stejným jménem, domovský adresář a vyžádá si heslo. Existuje také nízkoúrovňový useradd (na AlmaLinuxu a Rocky Linuxu je to běžný příkaz), ten však bez voleb udělá méně: nenastaví heslo a na některých systémech nevytvoří domovský adresář.
Skupina slouží k tomu, abyste mohli udělit oprávnění více uživatelům najednou. Přidání uživatele do skupiny:
root@web1:~# adduser anna www-data
root@web1:~# usermod -aG www-data anna # totéž, funguje všudeVšimněte si -a u usermod: bez -a nahradíte všechny doplňkové skupiny uživatele jen touto jednou. Nová skupina začne platit až po novém přihlášení.
Zablokování účtu bez jeho smazání (například u bývalého kolegy):
root@web1:~# usermod -L -e 1 jan-L zamkne heslo, -e 1 nechá účet vypršet. Pozor: zamčené heslo nemusí vždy zastavit SSH klíč. Odstraňte proto také klíče v /home/jan/.ssh/authorized_keys (lekce 2.3); účet s vypršenou platností (-e 1) sshd odmítne.
Čtení oprávnění
anna@web1:~$ ls -l /var/www/example.com
total 12
-rw-r--r-- 1 anna www-data 1520 Nov 9 10:12 index.html
-rw-r----- 1 anna www-data 412 Nov 9 10:14 config.php
drwxr-xr-x 2 anna www-data 4096 Nov 9 10:15 images
drwxrwxr-x 2 www-data www-data 4096 Nov 9 10:20 uploadsPrvní blok deseti znaků je klíčem ke všemu:
- Znak 1: typ.
-je běžný soubor,dadresář (directory),lsymbolický odkaz (symlink). - Znaky 2 až 4: co smí vlastník.
- Znaky 5 až 7: co smí skupina.
- Znaky 8 až 10: co smějí ostatní (všichni ostatní).
Poté následuje počet odkazů, vlastník, skupina, velikost a datum.
Písmena znamenají u souboru:
| Písmeno | Význam u souboru |
|---|---|
r | čtení |
w | změna |
x | spuštění jako program nebo skript |
A u adresáře něco trochu jiného:
| Písmeno | Význam u adresáře |
|---|---|
r | zobrazení názvů souborů v adresáři |
w | vytváření, přejmenování a mazání souborů v adresáři |
x | vstup do adresáře a otevírání souborů v něm |
To poslední mnoho lidí překvapí. Bez x na adresáři se k souborům v něm nedostanete, i když jsou samy čitelné. A kdo má w na adresáři, může v něm soubory mazat, i když patří někomu jinému.
V příkladu: index.html smí číst každý; config.php (s heslem k databázi) smí Anna číst a měnit, skupina www-data (tedy webový server) jen číst a ostatní nic. Do uploads smí webový server zapisovat, protože tam ukládá soubory nahrané návštěvníky.
Oprávnění jako číslo
Oprávnění se často zapisují jako tři číslice, osmičkové číslo. Každé písmeno má hodnotu: r = 4, w = 2, x = 1. Sečtěte je pro každou skupinu:
| Oprávnění | Číslo | Použití |
|---|---|---|
rw-r--r-- | 644 | běžný soubor, který smí číst každý |
rw-r----- | 640 | soubor pro vlastníka a skupinu, například konfigurace s heslem |
rw------- | 600 | tajný soubor, například authorized_keys nebo soukromý klíč |
rwxr-xr-x | 755 | adresář nebo program, který smí používat každý |
rwx------ | 700 | soukromý adresář, například ~/.ssh |
Změna oprávnění: chmod a chown
anna@web1:~$ chmod 640 /var/www/example.com/config.php
anna@web1:~$ chmod g+w /var/www/example.com/uploads
root@web1:~# chown anna:www-data /var/www/example.com/config.phpchmod mění oprávnění, a to číslem nebo písmeny (u, g, o pro vlastníka, skupinu, ostatní; + nebo - a písmeno). chown eigenaar:groep mění vlastníka a skupinu; to smí jen root. S -R fungují oba příkazy na celý adresář, a právě tam se často chybuje: chmod -R 644 na adresáři učiní všechny podadresáře nepoužitelnými, protože adresáře potřebují x. Pro celý strom raději použijte find:
root@web1:~# find /var/www/example.com -type d -exec chmod 755 {} +
root@web1:~# find /var/www/example.com -type f -exec chmod 644 {} +Nikdy 777
"Nefungovalo to, tak jsem tam dal 777." 777 znamená: každý na serveru to smí číst, měnit a spouštět. Pokud se na Vašem serveru někdy pokazí jediná služba nebo jediný web, může útočník zapisovat všude, kde je 777, včetně Vašich PHP souborů. Skutečný problém je téměř vždy ve vlastníkovi nebo skupině: dejte webovému serveru prostřednictvím skupiny přesně to oprávnění, které potřebuje, a jen na adresáři, kde je potřeba.
Výchozí oprávnění a speciální bity
Nové soubory dostávají svá oprávnění podle umask. S obvyklou hodnotou umask 022 mají nové soubory 644 a nové adresáře 755. Svou umask zjistíte příkazem umask.
Někdy uvidíte s místo x, například u /usr/bin/passwd (-rwsr-xr-x). To je bit setuid: program běží s oprávněními vlastníka (roota), i když ho spustí běžný uživatel. U několika systémových programů je to nutné, ale nikdy ho sami nenastavujte na skript. Neočekávaný soubor se setuid je známou známkou vniknutí; příkazem find / -perm -4000 -type f 2>/dev/null zobrazíte všechny takové soubory.
Na AlmaLinuxu a Rocky Linuxu
adduser je tam jen jiný název pro useradd; použijte useradd -m anna a poté passwd anna. Skupiny přidáte příkazem usermod -aG. SELinux přidává vedle oprávnění z této lekce další vrstvu: soubor se správnými oprávněními může být přesto odmítnut, pokud má nesprávný štítek SELinux (zobrazí ho ls -Z).
Shrnutí
- Každý uživatel má UID; root (0) smí všechno, služby běží pod vlastními systémovými uživateli bez shellu.
- Uživatelé jsou v
/etc/passwd, hashe hesel v/etc/shadow. Uživatele vytvoříte příkazemaddusera skupiny přidáte příkazemusermod -aG. ls -lzobrazuje typ, oprávnění vlastníka, skupiny a ostatních, a poté vlastníka a skupinu. U adresáře znamenáxvstup awvytváření a mazání souborů.- Obvyklá čísla: 644 a 755 pro veřejné, 640 pro konfiguraci s tajnými údaji, 600 a 700 pro soukromé. Nikdy 777.
- Pro nastavení oprávnění na celém stromu použijte
find; dávejte pozor na soubory se setuid.
Kvíz
Úkol
Úkol Z3.1: Čtení oprávnění. Otevřete ukázkový soubor rechten-1.txt: výstup příkazu id pro tři uživatele a příkazu ls -l ve webovém adresáři. U každé otázky odpovězte, kdo smí co (například: "může webový server měnit config.php?", "který soubor má příliš široká oprávnění?", "jaké číslo odpovídá .env?"). Program porovná Vaše odpovědi s pevným klíčem a u každé otázky vysvětlí proč.
Doporučujeme k přečtení
Postupy v těchto článcích platí pro hostingové balíčky a VPS od WebOké; u jiných poskytovatelů to funguje podobně.
- Zakázáno (403): Nemáte oprávnění k přístupu k / na tomto serveru
- Přihlášení k VPS přes SSH (a vytvoření SSH klíče)
- V kurzu WordPress: lekce 7.4 "Zabezpečení webu: oprávnění, hlavičky a bezpečnostní pluginy"
- Manuálová stránka Debianu pro adduser: https://manpages.debian.org/trixie/adduser/adduser.8.en.html
- Manuálová stránka Debianu pro chmod: https://manpages.debian.org/trixie/coreutils/chmod.1.en.html
