Jak ovládat sudo Access na Linuxu

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