Hlavní navigace

Doas: náhrada za děravé sudo z dílen projektu OpenBSD

28. 1. 2021
Doba čtení: 4 minuty

Sdílet

 Autor: Depositphotos
Utilita sudo je v linuxovém světě velmi rozšířená a umožňuje přidělit rootovská práva běžnému uživateli. Trpí ovšem mnoha bezpečnostními chybami, proto se v OpenBSD rozhodli naprogramovat Doas.

Díra jménem sudo

Utilita sudo  (superuser do) je tu s námi přes čtyřicet let a řeší klasický unixový problém: jak umožnit uživateli provést akci, ke které potřebuje práva superuživatele root. Na rozdíl od starší utility su nevyžaduje heslo roota, ale uživatel si vystačí se svou vlastní autorizací. Root mu v konfiguračním souboru /etc/sudoers přidělí práva spouštět konkrétní akce (či všechny) a je hotovo.

Bohužel sudo trpí mnoha bezpečnostními problémy, které obvykle umožní libovolnému uživateli v systému obejít bezpečnostní mechanismy sudo a spustit s absolutními právy úplně cokoliv. Není třeba příliš vysvětlovat, že je to bezpečnostní katastrofa, protože útočníkovi pak už nic nebrání v ovládnutí celého operačního systému.

Doas jako řešení pro OpenBSD

Projekt OpenBSD je znám tím, že si rád dělá věci po svém a staví se velmi odmítavě ke zbytečně složitému a nebezpečnému software. Takto vznikl vlastní hypervizor VMM, web server httpd nebo poštovní server OpenSMTPD.

Podobně se v OpenBSD nelíbila komplexnost a děravost utility sudo, takže se Ted Unangst rozhodl napsat vlastní náhradu v podobě programu doas  („do as“). Ten se stal součástí výchozí instalace v OpenBSD 5.6 vydaném v roce 2015. Není tedy žádným nováčkem a díky práci Jesseho Smithe ji můžeme mít také na ostatních kompatibilních operačních systémech. Co je dobré pro OpenBSD, bude dobré i pro Linux.

Princip zůstává stejný: umožňuje spustit program pod jiným uživatelem. Obvykle je oním uživatelem root, ale nemusí tomu tak nutně být. Proti sudo má ale doas dvě výhody: je menší a má jednodušší konfigurační soubor. Obojí dohromady znamená menší složitost a méně bezpečnostních problémů.

Instalace

V některých distribucích jsou k dispozici balíčky, které stačí jednoduše nainstalovat. To platí pro Alpine Linux, Arch Linux, Gentoo, Manjaro, NixOS a některé další. Jelikož se z principu jedná o velmi malý a nenáročný kousek software, není ani instalace do jiných distribucí nijak náročná.

Já jsem instaloval do Debianu a stačilo postupovat podle dokumentace z repozitáře projektu. Konkrétně to vypadalo takto:

# apt install build-essential make bison flex libpam0g-dev git
# git clone https://github.com/slicer69/doas
# cd doas
# make
# make install

Poslední příkaz zkopíruje do systému jednu binárku ( doas), jeden skript ( vidoas) a tři manuálové stránky ( doas.1, doas.conf.5 a vidoas.8). Kromě toho přidělí binárce doas také bit setUID (4755), aby se spouštěla automaticky pod vlastníkem, tedy rootem. Tím je instalace hotová a můžeme se vrhnout k použití.

Konfigurační soubor

Centrem dění je konfigurační soubor, který se obvykle nachází v /usr/local/etc/doas.conf. Například Alpine Linux ho však umisťuje do /etc/doas.conf. Je to ale celkem jedno, protože k jeho editaci bychom měli používat skript vidoas, který za nás otevření správné cesty zařídí a před uložením ještě zajistí kontrolu syntaxe, abychom si konfiguraci nerozbili a tím si neodřízli cestu k rootovským oprávněním.

Pro úpravu konfiguračního souboru tedy stačí spustit jednoduše:

# vidoas

Spustí se textový editor, který máme nastavený v proměnné prostředí EDITOR. Pokud takovou nemáme nastavenu nebo je prázdná, zavolá se jako záloha editor  vi.

Do konfiguračního souboru doas.conf píšeme pravidla povolující určitému uživateli provádět akce za jiného uživatele. Nejčastěji bude pravidlo vypadat takto:

permit petr as root

Můžeme takto zvolit i celou skupinu uživatelů pomocí dvojtečky před jejím názvem. Pak bude stačit příslušné uživatele přidat do správné skupiny a na konfiguraci doas nebudeme muset sahat. Můžeme také vynechat určení cíle, čímž povolíme provádění akcí za libovolného uživatele.

permit :spravci

Pomocí volby nopass můžeme také určit, že uživatel nebude u určité akce muset zadávat své heslo pro ověření. Stejně tak můžeme použít parametr cmd a za něj vložit příkaz, který může pomocí tohoto pravidla spustit. Doporučuje se uvádět absolutní cesty. Kombinace by mohla vypadat třeba takto:

permit nopass petr as www cmd vim

Vedle volby permit existuje také volba deny, která naopak dovoluje zablokovat akci, která danému pravidlu odpovídá. Pokud situaci odpovídá více pravidel, platí to poslední. Pokud naopak neodpovídá žádné, je akce zamítnuta, což je vlastně výchozí stav.

Používáme

Použití je naprosto přímočaré, pokud nám to místní pravidla dovolují, můžeme použít příkaz doas ke spuštění příkazů, jako bychom byli rootem. Můžeme se tak například zeptat na své uživatelské jméno:

# whoami
petr
# doas whoami
Password:
root

Výchozím uživatelem při použití doas je root, pokud chceme něco jiného (a máme to povolené), musíme použít parametr -u. Můžeme pak příkaz spustit pod jiným uživatelem:

ICTZ2021

# doas -u www vim index.html

Pokud potřebujete, aby byly při přepnutí uživatelů zachovány proměnné prostředí (třeba kvůli editoru), můžete v pravidle použít parametr keepenv. Stejně tak je možné pomocí setenv vybrat jen některé proměnné, naopak je odstranit nebo změnit jejich obsah.

V OpenBSD je možné použít také volbu persist, která dovoluje již jednou autentizovaného uživatele nějakou dobu neobtěžovat zadáváním hesla (jako to umí sudo). Bohužel tato volba v Linuxu či FreeBSD zatím nefunguje.

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.