Uživatelé, skupiny a oprávnění v Linuxu: chmod, chown a sudo
Srozumitelně o rwx, číselném zápisu 755/644, vlastnících, skupinách pro sdílené adresáře, setgid, ACL a sudo. Jak správně nastavit práva pro web.
„Permission denied“ patří k nejčastějším chybám na serveru. Nejrychlejší „oprava“ chmod 777 přitom otevírá bezpečnostní díru. Pojďme si oprávnění vysvětlit tak, abyste je nastavovali správně a s jistotou.
Jak číst oprávnění
ls -l /var/www/mujweb
-rw-r--r-- 1 www-data www-data 1532 Oct 10 09:12 index.php
drwxr-x--- 2 jan webdev 4096 Oct 10 09:10 config
První znak je typ (- soubor, d adresář, l odkaz). Pak tři trojice:
| Trojice | Komu platí |
|---|---|
rw- |
vlastník (user) |
r-- |
skupina (group) |
r-- |
ostatní (others) |
Význam písmen se liší pro soubory a adresáře:
| Soubor | Adresář | |
|---|---|---|
r |
číst obsah | vypsat seznam souborů |
w |
měnit obsah | vytvářet, mazat, přejmenovávat soubory v něm |
x |
spustit | vstoupit (cd) a přistupovat k souborům uvnitř |
Bez x na adresáři se ke souborům uvnitř nedostanete, ani když na ně máte r. To platí pro celou cestu – každý nadřazený adresář musí mít pro daného uživatele x.
Číselný zápis
r = 4, w = 2, x = 1. Sečtete je pro každou trojici:
| Číslo | Práva | Typické použití |
|---|---|---|
644 |
rw-r--r-- |
běžné soubory webu |
755 |
rwxr-xr-x |
adresáře, spustitelné skripty |
600 |
rw------- |
privátní klíče, .env |
700 |
rwx------ |
~/.ssh, soukromé adresáře |
640 |
rw-r----- |
konfigurace čitelná pro skupinu |
2775 |
rwxrwsr-x |
sdílený adresář se setgid |
chmod 640 config.php
chmod u+x deploy.sh # symbolický zápis: přidat x vlastníkovi
chmod -R g+w /srv/projekt # rekurzivně přidat zápis skupině
Vlastník a skupina
sudo chown jan:webdev soubor.txt
sudo chown -R www-data:www-data /var/www/mujweb/uploads
Informace o uživateli:
id jan
groups jan
Uživatelé a skupiny
sudo adduser petr # interaktivně, vytvoří home
sudo groupadd webdev
sudo usermod -aG webdev petr # -a = přidat, bez něj by se ostatní skupiny odebraly!
sudo deluser petr # odstranit uživatele
Zapomenuté -a u usermod -G je klasická chyba: uživatel přijde o všechny ostatní doplňkové skupiny včetně sudo.
Členství ve skupině se projeví až po novém přihlášení (nebo newgrp webdev).
Sdílený adresář pro tým
Chcete, aby jan i petr mohli upravovat soubory v /srv/projekt:
sudo mkdir -p /srv/projekt
sudo chown root:webdev /srv/projekt
sudo chmod 2775 /srv/projekt
Číslice 2 na začátku je setgid: nové soubory uvnitř zdědí skupinu webdev místo primární skupiny autora. Aby skupina mohla soubory i upravovat, potřebují uživatelé umask 002 (nastavitelné třeba v ~/.profile), případně použijte ACL.
ACL: když nestačí jedna skupina
sudo apt install acl
sudo setfacl -R -m u:www-data:rwX /srv/projekt/storage
sudo setfacl -R -d -m u:www-data:rwX /srv/projekt/storage # výchozí pro nové soubory
getfacl /srv/projekt/storage
Velké X přidá x jen adresářům (a souborům, které už x mají). Soubory s ACL poznáte podle + na konci práv v ls -l.
Správná práva pro web s PHP
Obvyklé a bezpečné nastavení:
sudo chown -R jan:www-data /var/www/mujweb
sudo find /var/www/mujweb -type d -exec chmod 750 {} \;
sudo find /var/www/mujweb -type f -exec chmod 640 {} \;
# zapisovat smí web jen tam, kde musí:
sudo chmod -R g+w /var/www/mujweb/uploads /var/www/mujweb/cache
Vy jako vlastník soubory upravujete, webový server je jen čte a zapisuje pouze do uploads a cache. Kdyby útočník našel díru v aplikaci, nemůže přepsat PHP kód.
sudo bezpečně
Úpravy oprávnění sudo dělejte vždy přes visudo, který kontroluje syntaxi:
sudo visudo -f /etc/sudoers.d/deploy
Příklad: uživatel deploy smí bez hesla jen restartovat jednu službu:
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart mojeapp
Chyba v souboru sudoers může zablokovat sudo úplně – proto visudo. Soubory v /etc/sudoers.d/ by měly mít práva 440.
Proč ne chmod 777
777 dává zápis komukoli na serveru – každému procesu a každé kompromitované službě. Útočník pak může do vašeho webu podstrčit vlastní kód. Pokud něco funguje jen se 777, skutečná příčina je špatný vlastník nebo skupina. Zjistěte, pod jakým uživatelem proces běží:
ps -eo user,comm | grep -E 'nginx|php-fpm'
A práva nastavte pro tohoto uživatele.
Ladění „Permission denied“
Nástroj namei ukáže práva každé části cesty:
namei -l /var/www/mujweb/uploads/foto.jpg
Hned uvidíte, který adresář po cestě chybí x. A otestovat přístup jako jiný uživatel:
sudo -u www-data cat /var/www/mujweb/config.php