Ako bezpečne zistiť obsadené miesto na disku neprivilegovaným užívateľom

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/

0 názorov na “Ako bezpečne zistiť obsadené miesto na disku neprivilegovaným užívateľom