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 78839×
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ě.
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.
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:
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.
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
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í 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.
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:
/etc/shadow
nemluvě)chmod
, chown
(defacto přístup ke všem souborům)tar
, gzip
(opět
pozor na získání souboru s hesly)passwd
(minimálně root
by měl být zakázan)
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.
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.