Příkaz `sudo` v prostředí Linux umožňuje spouštět příkazy s privilegii jiného uživatele, typicky s právy roota. Dále, `sudo` poskytuje možnost precizně kontrolovat, kdo a jaká má práva roota, umožňující udělit uživatelům buď kompletní přístup, anebo jen omezenou sadu příkazů. V tomto článku si ukážeme, jak na to.
`sudo` a oprávnění roota
Často slýcháme, ač to je poněkud zjednodušené tvrzení, že v Linuxu je všechno soubor. Ve skutečnosti, prakticky vše v operačním systému, jako procesy, soubory, složky, sokety, a kanály, komunikuje s jádrem skrze popisovač souboru. Ačkoliv tedy ne všechno je doslova soubor, s většinou prvků operačního systému se zachází, jako by jimi byly. Tento princip je základní myšlenkou návrhu Linuxu a operačních systémů podobných Unixu.
Koncept „vše je soubor“ je v Linuxu klíčový. Oprávnění k souborům jsou tedy jedním ze základních kamenů správy uživatelských práv a oprávnění. Pokud vlastníte soubor nebo složku, což je speciální druh souboru, máte právo s ním dělat cokoliv, včetně jeho editace, přejmenování, přesouvání, i mazání. Můžete také nastavit přístupová práva pro ostatní uživatele a skupiny, aby mohli soubor číst, upravovat či spouštět. Tyto pravomoci musí dodržovat všichni uživatelé, vyjma jednoho – roota.
Root je superuživatel, účet s výjimečnými privilegii. Není nijak omezen oprávněními k žádnému z objektů v operačním systému. Uživatel root může prakticky cokoliv, kdykoliv.
Ovšem, stejné možnosti má i kdokoliv, kdo získá heslo roota, což může vést k neúmyslnému nebo dokonce úmyslnému poškození systému. I samotný uživatel root může způsobit problémy jen z chyby, jelikož nikdo není neomylný. To z něj činí potenciálně nebezpečný účet.
Z toho důvodu se dnes doporučuje se jako root vůbec nepřihlašovat. Místo toho je lepší přihlásit se pod běžným uživatelským účtem a použít příkaz `sudo` pro dočasné navýšení práv, když je to nezbytné. Často to bývá jen pro provedení jednoho konkrétního příkazu.
Seznam `sudoers`
Příkaz `sudo` bývá předinstalován na většině moderních distribucí, jako je Ubuntu 18.04.3, Manjaro 18.1.0 nebo Fedora 31, které byly použity pro účely tohoto článku. Není to nic neobvyklého, protože `sudo` existuje již od 80. let a stal se standardním nástrojem pro manipulaci s práv roota v téměř všech distribucích Linuxu.
Při instalaci moderní distribuce, je uživatel vytvořený během instalace přidán do seznamu uživatelů s názvem `sudoers`. To jsou ti, kteří mají právo používat příkaz `sudo`. Díky těmto právům mohou do seznamu `sudoers` přidávat další uživatele.
Samozřejmě, není rozumné dávat úplná práva superuživatele libovolně, či komukoliv, kdo je nepotřebuje v plném rozsahu. Seznam `sudoers` umožňuje specifikovat, které příkazy mohou jednotliví uživatelé s `sudo` používat, čímž jim nedáváme „klíče od království“, ale přesto jim umožníme plnit jejich potřeby.
Spouštění příkazů jako jiný uživatel
Původně se příkaz `sudo` nazýval „superuser do“, protože s ním bylo možné provádět akce jako superuživatel. Nyní je jeho funkčnost rozšířena, a můžete pomocí něj spouštět příkazy jako kterýkoliv uživatel. Proto byl přejmenován na „substitute user do“.
K provedení příkazu jako jiný uživatel se používá volba `-u`. Například, pro spuštění příkazu `whoami` jako uživatel `mary`, použijeme následující zápis. Pokud `sudo` použijete bez `-u`, příkaz se spustí jako root.
sudo -u mary whoami
Systém samozřejmě bude vyžadovat zadání hesla uživatele, který příkaz spouští.
Odpověď z `whoami` nám potvrdí, že příkaz běží pod uživatelským účtem `mary`.
Pomocí `sudo` se lze přihlásit jako jiný uživatel bez znalosti jeho hesla, a to po zadání hesla vlastního. K tomu slouží volba `-i` (login):
sudo -i -u mary
pwd
whoami
ls -hl
exit
Nyní jste přihlášeni jako `mary`. Konfigurační soubory uživatele `mary`, jako `.bashrc`, `.bash_aliases` a `.profile`, jsou zpracovány, jakoby se přihlásil přímo uživatel `mary`.
Změní se i příkazový řádek, aby ukazoval na relaci uživatele `mary`.
`pwd` potvrdí, že jste v domovské složce uživatele `mary`.
`whoami` vám potvrdí, že používáte účet `mary`.
Zobrazené soubory patří uživateli `mary`.
Příkaz `exit` vás vrátí zpět do relace vašeho uživatelského účtu.
Úprava souboru `sudoers`
Pro přidání uživatele do seznamu těch, kteří mají oprávnění používat `sudo`, musíte upravit soubor `sudoers`. Důrazně se doporučuje vždy provádět tyto změny pomocí příkazu `visudo`. Tento příkaz zabraňuje souběžným úpravám souboru `sudoers` více uživateli. Navíc, provádí kontrolu syntaxe a analýzu souboru při jeho ukládání.
Pokud vaše úpravy neprojdou kontrolou, soubor nebude bezmyšlenkovitě uložen. Zobrazí se možnosti. Můžete zrušit změny, vrátit se k úpravám, nebo vynutit uložení i s chybami. Poslední možnost je však špatný nápad, protože může způsobit, že `sudo` přestane fungovat pro všechny.
Ačkoliv se úpravy spouští příkazem `visudo`, `visudo` samotný není textový editor. Spouští některý z vašich dostupných editorů. Na systémech Manjaro a Ubuntu, `visudo` použije jednoduchý editor `nano`. Na Fedoře spouští `visudo` komplexnější, ale méně intuitivní editor `vim`.
Pokud preferujete používání `nano` na Fedoře, můžete ho nainstalovat a následně nastavit:
sudo dnf nainstalovat nano
Následně můžete spustit `visudo` s nastaveným editorem pomocí:
sudo EDITOR=nano visudo
To je kandidát na alias. Spustí editor nano s načteným souborem `sudoers`.
Přidávání uživatelů do skupiny `sudo`
Pro otevření souboru `sudoers` použijte `visudo`. Použijte jeden z výše uvedených příkazů pro výběr editoru:
sudo visudo
Procházejte soubor `sudoers`, dokud nenajdete definici `%sudo`.
Znak procenta označuje, že se jedná o definici skupiny, nikoliv uživatele. V některých distribucích je řádek `%sudo` zakomentovaný pomocí znaku `#` na začátku řádku. V takovém případě znak `#` odstraňte a soubor uložte.
Řádek `%sudo` má následující strukturu:
%sudo: Název skupiny.
ALL=: Toto pravidlo platí pro všechny hostitele v síti.
(ALL:ALL): Členové této skupiny mohou spouštět příkazy jako všichni uživatelé a všechny skupiny.
Vše: Členové této skupiny mohou spouštět všechny příkazy.
Jinými slovy, členové této skupiny mohou na tomto počítači, nebo na jakémkoliv jiném hostiteli v síti spouštět libovolný příkaz, jako libovolný uživatel nebo skupina. Takže nejjednodušší způsob, jak dát někomu práva roota a možnost používat `sudo`, je přidat ho do skupiny `sudo`.
Mějme dva uživatele, Toma a Mary, s uživatelskými účty `tom` a `mary`. Účet `tom` přidáme do skupiny `sudo` pomocí příkazu `usermod`. Volba `-G` (groups) specifikuje skupinu, do které účet přidáváme. Volba `-a` (append) přidá skupinu do existujícího seznamu skupin, ve kterých už uživatel `tom` je. Bez této volby by uživatel `tom` byl přidán do nové skupiny, ale odstraněn ze všech ostatních.
sudo usermod -a -G sudo tom
Podívejme se, ve kterých skupinách je Mary:
groups
Uživatelský účet `mary` je pouze ve skupině `mary`.
Podívejme se na Toma:
groups
Uživatelský účet `tom`, a tedy i Tom, je ve skupinách `tom` a `sudo`.
Zkusme donutit Mary, aby udělala něco, co vyžaduje `sudo`:
sudo less /etc/shadow
Mary nemůže nahlédnout do chráněného souboru `/etc/shadow`. Za pokus o použití `sudo` bez svolení se ji dostane mírné upozornění. Podívejme se, jak se daří Tomovi:
sudo less /etc/shadow
Po zadání hesla se Tomovi soubor `/etc/shadow` zobrazí.
Pouhým přidáním do skupiny `sudo` byl povýšen do elitní kategorie uživatelů s právem používat `sudo`, a to bez jakýchkoliv omezení.
Udělování omezených práv `sudo` uživatelům
Tomovi byla udělena plná práva `sudo`, což znamená, že může dělat vše, co může dělat root, nebo kdokoli jiný ve skupině `sudo`. Toto může být více práv, než jste mu ochotni dát. Často je potřeba, aby uživatel provedl operaci vyžadující práva roota, ale není žádný důvod dávat mu plný přístup k `sudo`. Omezená práva mu lze nastavit přidáním do souboru `sudoers` a určením příkazů, které smí používat.
Seznamme se s Harrym, vlastníkem uživatelského účtu `harry`. Není ve skupině `sudo` a nemá žádná práva `sudo`.
groups
Pro Harryho by bylo užitečné, kdyby mohl instalovat software, ale nechceme mu dát plná práva `sudo`. To není problém. Pusťme se do toho:
sudo visudo
Procházejte souborem, dokud se nedostanete za definice skupin. Přidáme řádek pro Harryho. Protože se jedná o definici uživatele, nikoliv skupiny, nemusíme řádek začínat znakem procenta.
Záznam pro uživatelský účet `harry` je:
harry ALL=/usr/bin/apt-get
Všimněte si, že mezi `harry` a `ALL=` je tabulátor.
To říká, že uživatelský účet `harry` může používat uvedené příkazy na všech hostitelích, připojených k síti. Je zde uveden jeden příkaz `/usr/bin/apt-get`. Harrymu můžeme dát přístup k více příkazům, a to tak, že je přidáme do seznamu odděleného čárkami.
Přidejte řádek do souboru `sudoers` a soubor uložte. Pro kontrolu, zda je řádek syntakticky v pořádku, můžeme použít `visudo` s volbou `-c` (pouze zkontrolovat):
sudo visudo -c
Proběhla kontrola a `visudo` hlásí, že je vše v pořádku. Harry by nyní měl být schopen používat `apt-get` pro instalaci softwaru, ale neměl by mít přístup k žádnému jinému příkazu vyžadujícímu `sudo`.
sudo apt-get install finger
Harry získal potřebná práva `sudo` a může instalovat software.
Co se stane, když se Harry pokusí použít jiný příkaz, který vyžaduje `sudo`?
sudo shutdown now
Harrymu je zabráněno příkaz spustit. Úspěšně jsme mu nastavili omezený přístup. Může používat jen ten určený příkaz a nic víc.
Používání uživatelských aliasů v `sudoers`
Pokud chceme dát stejná práva i Mary, mohli bychom do souboru `sudoers` přidat řádek pro její účet, stejně jako jsme to udělali pro Harryho. Nicméně, efektivnější je využít `User_Alias`.
`User_Alias` v souboru `sudoers` obsahuje seznam názvů uživatelských účtů. Tento alias pak může být použit v definici pro reprezentaci všech těchto uživatelských účtů. Pokud budete chtít změnit oprávnění těchto uživatelů, stačí upravit jen jeden řádek.
Vytvořme `User_Alias` a použijme ho v souboru `sudoers`:
sudo visudo
Procházejte soubor, dokud nenajdete specifikaci `User_Alias`.
Přidejte `User_Alias` zapsáním:
User_Alias INSTALLERS = harry, mary
Každý prvek je oddělen mezerou, nikoliv tabulátorem. Struktura je následující:
User_Alias: Říká `visudo`, že se bude jednat o `User_Alias`.
INSTALLERS: Libovolný název pro tento alias.
= harry, mary: Seznam uživatelů, kteří budou součástí aliasu.
Nyní upravíme řádek, který jsme dříve přidali pro účet `harry`:
harry ALL=/usr/bin/apt-get
Změníme ho na:
INSTALLERS ALL=/usr/bin/apt-get
Tím říkáme, že všechny uživatelské účty v definici `INSTALLERS` mohou spouštět příkaz `apt-get`. Vyzkoušejme to s Mary, která by nyní měla být schopna instalovat software.
sudo apt-get install colordiff
Mary může instalovat software, protože je součástí `User_Alias` „INSTALACI“ a tomuto aliasu byla tato práva udělena.
Tři rychlé triky s `sudo`
Pokud zapomenete přidat `sudo` k příkazu, napište:
sudo !!
Poslední příkaz se zopakuje s `sudo` na začátku řádku.
Jakmile jednou použijete `sudo` a ověříte se heslem, nebudete muset heslo znovu používat pro další příkazy `sudo` po dobu 15 minut. Pokud chcete ověření zapomenout okamžitě, použijte:
sudo -k
Zajímá vás, kde vidět neúspěšné pokusy o použití `sudo`? Najdete je v souboru `/var/log/auth.log` pomocí:
less /var/log/auth.log
Zde vidíme záznam o pokusu uživatele `mary`, přihlášeného z TTY pts/1, který se pokusil spustit příkaz `shutdown` jako uživatel `root`.
S velkou mocí…
… přichází schopnost delegovat její části na ostatní. Nyní víte, jak selektivně přidělovat pravomoci dalším uživatel