Servery a DevOps

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.

12. 10. 2026 · 4 min čtení

„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