Predstavte si problém, že potrebujete zistiť obsadené miesto na disku pre niektoré webstránky, ktoré máte v adresári /var/www/. A zároveň to chce spraviť bezpečne.
Takže začnete takýmto skriptom v domovskom adresári neprivilegovaného užívateľa filip:
$ cat /home/filip/zisti-velkost-stranky.sh #!/bin/sh for i in /var/www/*; do size=`du -hs $i | cut -f 1` echo "Stranka $i zabera $size miesta na disku" done
Ak však v adresári /var/www/ máte nejakú dynamickú webstránku (na 99% máte), zistíte, že skript zisti-velkost-stranky.sh vypisuje chyby o chýbajúcich prístupoch k súborom, ktoré boli nahraté z webu. Dôvod je ten, že z bezpečnostných dôvodov beží webserver apache pod samostatným užívateľom (napr. www-data), takže tieto súbory ostatní užívatelia nemôžu čítať ani modifikovať.
Pridať užívateľa filip do skupiny www-data nemusí byť dobrý nápad, lebo zase by mohol mať práva privysoké. Riešením by bolo spúšťať skript zisti-velkost-stranky.sh cez cron ako root (teda ako správca systému), ale to by zase nemohol Filip skript časom upravovať. Resp. takéto riešenie by bolo veľmi deravé a časom by Filip administroval systém sám bez našeho vedomia. 🙂
Takže ako opatrní administrátori pripravíme takýto wrapper:
cat /usr/local/bin/du-for-sudo #!/bin/sh # Author: Lubomir Host <lubomir.host@gmail.com> # dir=$1 dir="${dir%/}" # remove slash from the end real=`realpath "$dir"` if [ -z "$real" -o "x$real" != "x$dir" ]; then echo "Permission denied for du -hs '$dir'" else du -hs "$real" fi # vim: ft=sh
Takýto wrapper zabezpeči očistenie vstupu od užívateľa Filip, takže aj keď bude z Filipa časom menší hacker, bude si môcť skript upravovať a nebude môcť brázdiť adresáre, ktoré mu nepatria. Ešte teda nastavíme správne prístupové práva k wrapperu a môžeme ho povoliť:
chown root:root /usr/local/bin/du-for-sudo chmod a+rx /usr/local/bin/du-for-sudo chmod og-w /usr/local/bin/du-for-sudo
Ešte povolíme spustenie skriptu cez sudo, čiže cez príkaz visudo doplníme do /etc/sudoers nasledovný riadok:
filip ALL=(ALL) NOPASSWD: /usr/local/bin/du-for-sudo /var/www/*
Takže Filipovi ešte upravíme skript so sudo a môže si to nastaviť do cronu:
$ cat /home/filip/zisti-velkost-stranky.sh #!/bin/sh for i in /var/www/*; do size=`sudo /usr/local/bin/du-for-sudo $i | cut -f 1` echo "Stranka $i zabera $size miesta na disku" done
Takže toto už Filip nebude môcť robiť:
sudo du -hs /var/www/../../root/
super clanok. Vdaka