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:
# 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.