Linux v příkazech - sudo

V dnešním dílu se podíváme na poměrně mocný program, který vám dovolí předávat všechna, nebo jenom některá superuživatelská práva normálním uživatelům.

1.11.2004 10:00 | Ondřej Čečák | přečteno 78289×

You had mail, but the super-user read it, and deleted it!

Název programu vznikl složením slov "superuser do", a to poměrně jasně vystihuje jeho funkci. S pomocí suda můžete dovolit normálnímu uživateli spouštět všechny, nebo jen některé příkazy s právy superuživatele. Takto lze např. pohodlně vyřešit situaci, kdy je vhodné (ba přímo nutné), aby někteří uživatelé používali programy určené ke správě, ovládání systému a podobně.

Instalace

Program si můžete stáhnout z domovské stránky http://www.sudo.ws/sudo/ (http://www.courtesan.com/sudo/sudo.html) a následně zkompilovat. S největší pravděpodobností bude ovšem zahrnut i ve vaší distribuci, takže vám doporučuji nejprve sáhnout po distribučním balíčku s binárkou či zdrojáky.

Sudo běží jako suid s právy roota, takže už jeho samotná instalace skrývá bezpečnostní riziko, na které byste měli brát ohled.

Konfigurace

Veškeré nastavení se provádí v konfiguračním souboru /usr/sudoers (nejčastěji). Ačkoli tento soubor můžete editovat ve svém oblíbeném editoru, měli byste použít program visudo. Tento má totiž dvě užitečné vlastnosti:

Nejzákladnější volby

A nyní se můžeme vrhnout na vlastní konfiguraci. Po spuštění programu visudo by se vám mohl objevit implicitní konfigurační soubor podobný tomuto:

# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL) ALL

Řekněme tedy, že chceme přidělit uživateli spravce a členům skupiny admini superuživatelská práva. Proto do odpovídající sekce připíšeme:

# User privilege specification
root    ALL=(ALL) ALL
spravce ALL=(ALL) ALL
%admini ALL=(ALL) NOPASSWD: ALL

Tak. Nyní můžeme jako uživatel spravce vyzkoušet, jak to funguje. Obecně uživatel spravce použije příkaz sudo následovaný cestou k programu. Tedy např.:

spravce@stroj:~$ sudo /usr/bin/whoami

Password:
root

Co se vlastně stalo? Uživatel spravce spustil whoami s právy roota (pozn.: jak je zřejmé, program whoami vypíše userid; výstupem je tedy název uživatele, který příkaz zadal). Všimněte si, že před spuštěním příkazu musel spravce zadat (své) heslo. To proto, aby jeho shell nešel zneužít, pokud by se např. zapomněl odhlásit. Implicitně si sudo pamatuje heslo 5 minut, takže ho není nutné zadávat opakovaně.

V předchozím příkladu zbývá nevysvětlený poslední řádek – ten pomocí % dovoluje spuštění libovolného příkazu se superuživatelskými právy členům skupiny admini, a to bez nutnosti zadávání hesla (díky volbě NOPASSWD:).

Tím jsme si předvedli úplně nejzákladnější funkci programu sudo. Důležité je ovšem zmínit, že vaším cílem by měl být spíše superuživatelský přístup minimalizovat. Sudo je ideální především na rozdělování různých práv a většinou se nehodí pouze k předávání všech práv superuživatele.

Omezování

Ačkoli nadpis této kapitolky zavání BOFH, představím vám zde velice užitečné možnosti, jak předat pouze určitá práva a některé další "omezující" volby.

Nejdříve se ještě můžeme vrátit k zadávání hesla. Vytvořme si v konfiguračním souboru "novou sekci" s následujícím obsahem:

# Defaults specification
Defaults:spravce      timestamp_timeout=0, passwd_tries=1

Tímto nastavíme, že uživatel spravce bude muset zadávat své heslo při spuštění suda neustále, protože timestamp_timeout je roven nule. Pokud zde napíšete libovolné přirozené číslo, sudo si bude pamatovat heslo zadaný počet minut. Jestliže této volbě nastavíte hodnotu -1, bude nutné zadat heslo jenom jednou za přihlášení.

Volba passwd_tries=1 znamená, že pokud se uživatel při zadávání hesla splete, bude muset příkaz spustit znovu (a jeho přihlášení bude logováno jako neúspěšné; implicitně je tato hodnota rovna 3).

Zajímavé je také to, jak sudo nakládá se systémovými proměnnými. Pokud si (nejlépe jako superuživatel) zadáte příkaz sudo -V, uvidíte mj. také seznamy proměnných, které sudo kontroluje, maže nebo nuluje. V případě, že byste chtěli uživateli spravce smazat například proměnnou PROMENNA, připište k poslednímu předcházejícímu příkladu , env_delete+="PROMENNA". Důležité je + před znakem =, v případě že by + chybělo, mazala by se pouze jedna zadaná proměnná.

Jak už jsem poznamenal v úvodu, předání všech superuživatelských práv není obvykle ta správná cesta. Pojďme tedy skupinu programů omezit:

# User privilege specification
root     ALL=(ALL) ALL
spravce  ALL=	   /sbin/shutdown
%admini  stroj=	   /usr/local/sbin/admini/

Tímto nastavením jsme docílili toho, že uživatel spravce může spustit se superuživatelským oprávněním pouze program shutdown. Druhý řádek dovoluje členům skupiny admini spouštět jako root na počítači stroj programy v adresáři /usr/local/sbin/admini/.

Ovšem sudo nemusí dávat uživateli "pouze" práva superuživatele, programy lze spouštět pod libovolným uživatelem, např.:

# User privilege specification
root     ALL=(ALL) 		  ALL
jirka	 ALL=(pepa,lenka,franta)  /bin/kill,/usr/bin/killall

Tímto příkazem může uživatel jirka ukončovat procesy uživatelům pepa, lenka a franta. A jak že to udělá? Jednoduše spustí sudo s parametrem -u:

jirka@stroj:~$ sudo -u pepa killall program

Protože v minulém příkazu v posledním řádku není uvedeno ALL, ale výčet uživatelů, je uživatel oprávněn spouštět zadané příkazy pouze s vyjmenovanými právy. V případě že tam ALL uvedeno je, znamená to, že je možné spouštět příkazy pod libovolným uživatelem.

Náš předchozí příklad můžeme ještě vylepšit o volbu, která zajistí, že sudo bez parametru -u spustí příkaz pod defaultním uživatelem:

Defaults:jirka runas_default=pepa

Aliasy

Protože se občas některé volby opakují a protože jsou delší konfiguráky trošku nepřehledné a náročnější na úpravy, nabízí sudo zadávání aliasů. Pokud už funkce není zřejmá z názvu, příklad jejich použití ujasní:

# Host alias specification
Host_Alias KANCELAR = 192.168.0.0/24

# User alias specification
User_Alias SPRAVCI = spravce,jarda
User_Alias UZIVATELE = pepa,jirka,lenka,franta

# Runas alias specification
Runas_Alias OP = operator

# Cmnd alias specification
Cmnd_Alias  WWW  = /bin/su www
Cmnd_Alias  KILL = /bin/kill,/usr/bin/killall
Cmnd_Alias  HALT = /sbin/halt
Cmnd_Alias  SHELLS = /bin/sh, /bin/bash, /bin/ksh, \
		     /bin/tcsh, /usr/local/bin/rsh

Tímto zápisem si definujeme aliasy, které můžeme dále použít. Např.:

# User privilege specification
root    ALL=(ALL) 	ALL
SPRAVCI	KANCELAR=(ALL)  ALL

pepa    KANCELAR=(OP) KILL

UZIVATELE ALL=(ALL) HALT

spravce ALL=(ALL) /bin/, WWW, !SHELLS

Všimněte si především posledního řádku. Znak ! obrací význam aliasu SHELLS, takže správce může spustit s privilegii roota cokoli v adresáři /bin/, kromě programů vyjmenovaných v aliasu SHELLS. Zajímavé je také použití aliasu WWW, který povoluje změnu uživatele, ale pouze se zadaným parametrem.

Podobně můžeme např. povolit uživateli vojta, aby mohl zasahovat do nastavení sítě, ovšem v příkazu se nesmí objevit eth0. Dále nastavíme ještě uživateli spravce libovolné použití programu tcpdump k odchytávání síťového provozu. Opět můžme použít alias:

# Cmnd alias specification

Cmnd_Alias SIT=/bin/ip *, !/bin/ip *eth0*
Cmnd_Alias SNIFFER=/usr/sbin/tcpdump *

# User privilege specification
root    ALL=(ALL) ALL
spravce ALL=(ALL) SNIFFER
vojta   ALL=(ALL) SIT

Kompletní ukázka

Kompletní a fungující ukázku konfiguračního souboru lze nalézt na oficiálních stránkách, konkrétně na adrese http://www.courtesan.com/sudo/sample.sudoers.

Bezpečnost

Kromě toho, že sudo by nemělo obsahovat známé chyby (protože to je root suid binárka) se u konfigurace vyplatí opravdu pořádně přemýšlet, a to obzvlášť, pokud udělujete uživatelům pouze částečná práva. Pozor si např. dejte na:

Z bezpečnostního hlediska je také velice zajímavé použít sudo tak, aby řídilo (a logovalo) přístup k ostatním seuid/segid programům (nebo alespoň k těm, které vlastní root). Takže následně sudo bude jedniný programu roota, který vyžaduje seuid/segid bit. Toto řešení má několik výhod; přímo použití suda může být vymezeno právy filesystému jenom na ty, kteří seuid/segid programy vyžadují (různí démoni apod.), lze kontrolovat a omezovat předávané parametry a případný útočník bude mít opět o něco komplikovanější postup.

Logování

Implicitní nastavení logování je u různých distribucí různé; soubor s logy si můžeme nastavit v úvodu konfiguračního souboru programu sudo:

Defaults logfile=/var/log/sudo.log

Příklad souboru s logy:

Oct 30 19:56:28 : spravce : TTY=pts/9 ; 
    PWD=/home/spravce ;  USER=root ;  COMMAND=/usr/bin/whoami
Oct 30 20:00:28 : spravce : TTY=pts/5 ;  
    PWD=/home/spravce ; USER=pepa ; COMMAND=/usr/bin/killall doom3
Oct 30 20:01:04 : petra : user NOT in sudoers ; TTY=tty/1 ;  
    PWD=/home/petra ; USER=root ;  COMMAND=/bin/bash      
Oct 30 20:11:39 : franta : 3 incorrect password attempts ; TTY=pts/10 ;
    PWD=/etc/ ; USER=root ; COMMAND=/bin/cat /etc/shadow

Vysvětlovat význam jednotlivých položek asi nemá cenu, protože jsou docela zřejmé. Pozor si ale dávejte především na hodnotu položky COMMAND, protože tam se nezobrazují přesměrování (např. /bin/cat /etc/shadow > /tmp/session_mm_apache0 bude zobrazeno pouze po >).

Pokud se sudo správně nakonfiguruje, může se stát důležitým a vítaným pomocníkem, a to nejenom správce systému. Doufám, že si ho také oblíbíte ...

Za konzultace bych chtěl poděkovat Honzovi Houšťkovi.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=493