sudo a minimální oprávnění
Modul 3: Uživatelé, oprávnění a sudo · Doba čtení: 11 min.
Cíl lekce: Po této lekci budete umět pracovat jako běžný uživatel se sudo, bezpečně přidat správce, změnit nastavení sudo, aniž byste se sami zablokovali, a vysvětlit, proč minimální oprávnění chrání Váš server.
Klíčové pojmy: sudo, skupina sudo, skupina wheel, /etc/sudoers, /etc/sudoers.d, visudo, NOPASSWD, sudo -l, uzamčení účtu root, log sudo, minimální oprávnění (least privilege), služební uživatel
Proč prostě nepracovat jako root?
Po instalaci se často přihlašujete jako root. Je to pohodlné: smíte všechno. Ale právě v tom je problém:
- Stačí jeden překlep.
rm -rf / home/anna/oud(všimněte si mezery za prvním lomítkem) jako root smaže celý Váš server. Jako běžný uživatel dostanete chybové hlášení. - Všechno běží jako root. Skript, který vložíte z internetu, program, který testujete: všechno dostane plná oprávnění.
- Žádná stopa. Pokud jako root pracují tři lidé, nikdo později neví, kdo co udělal.
- Root je jméno, které zkouší každý útočník. Přihlášení jako root je lepší úplně vypnout (lekce 2.2), to ale jde teprve tehdy, když máte jinou cestu ke správcovským oprávněním.
Tou jinou cestou je sudo: přihlásíte se pod svým účtem a jen před příkaz, který potřebuje správcovská oprávnění, napíšete sudo.
anna@web1:~$ apt update
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
anna@web1:~$ sudo apt update
[sudo] password for anna:
Hit:1 http://deb.debian.org/debian trixie InRelease
...(Ubuntu od verze 25.10 standardně používá sudo-rs, novou implementaci sudo. Pro vše v této lekci funguje stejně.)
sudo se ptá na Vaše heslo, ne na heslo uživatele root. Poté si ho standardně pamatuje čtvrt hodiny, takže ho nemusíte zadávat u každého příkazu znovu. Každý příkaz, který spustíte přes sudo, se zapíše do logu.
Vytvoření správce
Na Debianu a Ubuntu smí přes sudo dělat všechno každý člen skupiny sudo. Je to uvedeno v /etc/sudoers:
%sudo ALL=(ALL:ALL) ALLČtěte to takto: členové skupiny sudo (%) smějí na všech strojích (ALL) jako kterýkoli uživatel a skupina ((ALL:ALL)) spustit jakýkoli příkaz (ALL).
Přidání správce tedy proběhne ve dvou krocích, jako root:
root@web1:~# adduser anna
root@web1:~# adduser anna sudoPoté uložte veřejný klíč uživatelky Anna do /home/anna/.ssh/authorized_keys se správným vlastníkem a oprávněními:
root@web1:~# mkdir -p /home/anna/.ssh
root@web1:~# cp /root/.ssh/authorized_keys /home/anna/.ssh/
root@web1:~# chown -R anna:anna /home/anna/.ssh
root@web1:~# chmod 700 /home/anna/.ssh
root@web1:~# chmod 600 /home/anna/.ssh/authorized_keysNezapomeňte na chown: soubor zkopírovaný uživatelem root patří uživateli root, a pak se Anna nemůže přihlásit svým klíčem.
Nyní, zatímco relace root zůstává otevřená, otestujte ve druhém okně:
anna@laptop:~$ ssh anna@192.0.2.10
anna@web1:~$ sudo -l
[sudo] password for anna:
User anna may run the following commands on web1:
(ALL : ALL) ALL
anna@web1:~$ sudo whoami
rootTeprve když to funguje, nastavte v konfiguraci SSH PermitRootLogin no (lekce 2.2). Od té doby se vždy přihlašujete jako Anna.
Jednu věc si zapamatujte: Anna nyní potřebuje pro sudo heslo. Uložte si ho do správce hesel. Přihlášení probíhá klíčem, sudo heslem: dvě různé věci, které musí mít útočník obě.
Změna nastavení sudo: vždy pomocí visudo
Chyba v /etc/sudoers může znamenat, že sudo přestane úplně fungovat. Pokud se navíc nemůže přihlásit ani root, uvíznete. Proto nastavení sudo nikdy neupravujte běžným editorem, ale pomocí visudo. Ten otevře dočasnou kopii a před uložením zkontroluje její obsah:
root@web1:~# visudo -f /etc/sudoers.d/backupStejně jako u SSH raději použijte vlastní soubor v /etc/sudoers.d/ než hlavní soubor. Dejte pozor na dvě pravidla této složky:
- Soubory, jejichž název obsahuje tečku nebo končí na
~, se přeskakují.backup.conftedy nefunguje,backupano. Účelem je ignorovat kopie vytvořené editory, ale mnoho lidí to překvapí. - Soubor musí patřit uživateli root a ostatní do něj nesmějí zapisovat (obvyklé je 440; visudo to zařídí).
Chcete-li zkontrolovat existující soubor bez úprav: visudo -c zkontroluje vše.
NOPASSWD: praktické, ale vězte, co děláte
S NOPASSWD se sudo už neptá na heslo:
anna ALL=(ALL:ALL) NOPASSWD: ALLNěkteré obrazy VPS to nastavují pro výchozího uživatele, takže jste po přihlášení klíčem rovnou správcem. Pomocí sudo -l zjistíte, co platí u Vás. Důsledek: kdo má klíč uživatelky Anna, je rovnou root. Druhý zámek už neexistuje. U osobního serveru se tak můžete rozhodnout, ale udělejte to vědomě.
Mnohem lepší je NOPASSWD jen pro jeden konkrétní příkaz, například pro zálohovací skript, který musí běžet automaticky:
backup ALL=(root) NOPASSWD: /usr/local/bin/maak-backupUživatel backup pak smí jako root spouštět přesně ten jeden skript, bez hesla, a nic dalšího. Dvě pasti:
- Vždy používejte úplnou cestu. Se samotným
maak-backupsi může někdo vložit vlastní program s tímto názvem na začátek své cesty (PATH). - Do samotného skriptu tento uživatel nesmí mít možnost zapisovat. Jinak ho upraví a pak jako root spouští libovolné příkazy. Totéž platí pro příkazy, které samy umějí otevřít shell, například editor (
vim,nano) neboless: kdo je smí spustit přes sudo, může z programu otevřít shell s právy root. Takové příkazy přes sudo nikdy samostatně nepovolujte.
Co se zaznamenává
Pokaždé, když někdo použije sudo, objeví se záznam v journalu (a na systémech s rsyslog také v /var/log/auth.log):
anna@web1:~$ sudo journalctl _COMM=sudo --since today
Nov 09 10:31:02 web1 sudo[2214]: anna : TTY=pts/0 ; PWD=/home/anna ; USER=root ; COMMAND=/usr/bin/apt updateVidíte kdo, kde, jako kdo a jaký příkaz. To je jeden z důvodů, proč nepracovat jako root ve více lidech. Neúspěšné pokusy o sudo („incorrect password attempts“, tedy pokusy se špatným heslem) z účtu, který nejste Vy, jsou varovným signálem.
Minimální oprávnění ve velkém
sudo je jedním z uplatnění obecného principu: minimálních oprávnění (least privilege). Každý uživatel a každá služba dostane přesně ta oprávnění, která potřebuje, a nic víc. Na serveru to mimo jiné znamená:
- pracujete jako běžný uživatel a sudo používáte jen tehdy, když je to nutné;
- každá služba běží pod vlastním uživatelem bez shellu (lekce 3.1), ne jako root;
- webová aplikace dostane databázového uživatele, který smí používat jen svou vlastní databázi, ne správce databázového serveru;
- zálohovací skript smí jen ten jeden příkaz, který potřebuje (NOPASSWD s úplnou cestou);
- kolega, který jen aktualizuje web, dostane právo zápisu do
/var/www/example.compřes skupinu, ne sudo.
Myšlenka: pokud se něco pokazí (zranitelnost v pluginu, ukradený klíč), škoda zůstane omezená na toho jednoho uživatele nebo službu. V principech CIS a v lekci o hardeningu (10.1) se to bude stále vracet.
Na AlmaLinux a Rocky Linux
Tam se skupina správců jmenuje wheel místo sudo: usermod -aG wheel anna. Řádek v /etc/sudoers je %wheel ALL=(ALL) ALL. visudo a /etc/sudoers.d fungují stejně. Hlášení sudo najdete tam také v /var/log/secure.
Shrnutí
- Pracujte jako běžný uživatel a pro správu používejte sudo; sudo se ptá na Vaše vlastní heslo a zaznamenává každý příkaz.
- Vytvoření správce:
adduser anna,adduser anna sudo(wheel na systémech odvozených od RHEL), klíč se správným vlastníkem a oprávněními, test ve druhém okně, teprve pak vypnout přihlášení root. - Pravidla sudo upravujte jen pomocí
visudo, nejlépe ve vlastním souboru v/etc/sudoers.d/bez tečky v názvu. - NOPASSWD pro všechno odstraňuje jeden zámek; raději ho používejte jen pro jeden příkaz s úplnou cestou, který uživatel nemůže změnit.
- Minimální oprávnění: každý uživatel a služba dostane přesně to, co potřebuje, takže chyba nebo zranitelnost zůstane malá.
Kvíz
Úkol
Úkol O3.2: Správce se sudo. Vytvořte na svém serveru běžného správce (například anna), správně nastavte svůj klíč, ve druhém okně otestujte přihlášení a sudo -l a poté vypněte přihlášení root přes SSH (PermitRootLogin no). Odškrtněte kroky, vložte výstup id (jen jméno a skupiny) a odpovězte na otázky: které pravidlo dává Vašemu správci oprávnění, je někde NOPASSWD a jak se dostanete dovnitř, když zapomenete heslo?
Úkol O3.2: Správce se sudo
Tento úkol provádíte sami; nikdo ho nekontroluje. Odškrtněte, co jste udělali, a označte úkol jako splněný.
%sudo ALL=(ALL:ALL) ALL v /etc/sudoers (RHEL: %wheel). NOPASSWD jen vědomě a nejlépe omezené na jeden příkaz. Při zapomenutém hesle: přes konzoli poskytovatele, nové heslo pro root přes panel nebo záchranné prostředí, poté passwd <gebruiker>.
Vaše zaškrtnutí a poznámky zůstávají pouze v tomto prohlížeči; nikam je neposíláme. Pokud jste přihlášeni, ukládáme v sekci Moje kurzy pouze to, že jste úkol splnili.
Doporučujeme k přečtení
Postupy v těchto článcích platí pro VPS od WebOké; u jiných poskytovatelů to funguje podobně.
- Zabezpečení VPS: prvních pět minut
- Žádný přístup k VPS: co teď?
- Příručka k DirectAdmin 12.2: Uživatelé databáze, oprávnění a hesla
- Ubuntu Server: User management: https://ubuntu.com/server/docs/how-to/security/user-management/
- Manuálová stránka Debianu sudoers: https://manpages.debian.org/trixie/sudo/sudoers.5.en.html
