Právě jsem točil do krabice Ubuntu 11.10 a pak jsem běžel apt-get install Apache2 php5
nainstalovat Apache2 a PHP 5). Nyní to funguje jako "webový server" a načte stránku "Funguje to!". Nyní se snažím zpřísnit bezpečnost a mám následující otázky týkající se linuxových webových serverů:
www-data
? Je Apache/php spuštěn jako uživatel?Při zkoumání výchozího nastavení jsem provedl následující věci:
Když já cd /
a udělejte ls -al
výpis obsahu, vidím /var
:
drwxr-xr-x 13 root root 4096 2012-02-04 20:47 var/
Pokud jsem cd
do var
a udělal ls -al
Chápu:
drwxr-xr-x 2 root root 4096 2012-02-04 20:47 www/
Konečně, uvnitř /var/www
Chápu:
drwxr-xr-x 2 root root 4096 2012-02-04 20:47 ./
drwxr-xr-x 13 root root 4096 2012-02-04 20:47 ../
-rw-r--r-- 1 root root 177 2012-02-04 20:47 index.html
Můj klíč s sebou je, že zatím všechny tyto soubory patří uživateli root:root
, soubory mají oprávnění 644 a adresáře mají oprávnění 755.
Pokud vytvořím soubor jako root v /var/www/test.php
s obsahem:
<?php echo Shell_exec('whoami');
a načíst tento soubor do prohlížeče, řekne mi to www-data
, což je stejné jako v /etc/Apache2/envvars
file:
export Apache_RUN_USER=www-data
export Apache_RUN_GROUP=www-data
Pokud ano ps aux | grep -i Apache
Vidím následující:
root 1916 1.2 104664 7488 Ss 20:47 /usr/sbin/Apache2 -k start
www-data 1920 0.8 105144 5436 S 20:47 /usr/sbin/Apache2 -k start
www-data 1921 1.0 105144 6312 S 20:47 /usr/sbin/Apache2 -k start
www-data 1922 0.7 104688 4624 S 20:47 /usr/sbin/Apache2 -k start
www-data 1923 0.7 104688 4624 S 20:47 /usr/sbin/Apache2 -k start
www-data 1924 0.7 104688 4624 S 20:47 /usr/sbin/Apache2 -k start
www-data 1925 0.7 104688 4624 S 20:47 /usr/sbin/Apache2 -k start
Kdo tedy Apache běží? Vypadá to, že první proces je asi jako root
, možná z /etc/init.d/Apache
skript při spuštění systému a ostatní jako www-data
vynořil se od prvního. Je to správně?
Dále, pokud napíšu groups www-data
pak uvidím www-data : www-data
- tak to vypadá, že je pouze v www-data
skupina. Hádám, že je to také standardní praxe.
Takže pokud rozumím věcem správně, pokud Apache běží jako www-data
a já chci, aby Apache mohl číst adresář, bit x
musí být nastaven pro světovou (jinou) skupinu (o+x
), a to musí být také nastaveno na všech nadřazených adresářích až po řetězec (www
, var
). A pokud chci, aby Apache mohl číst ze souboru, pak o+r
bit musí být nastaven.
Bohužel se domnívám, že to představuje bezpečnostní otvor pro více aplikací a/nebo více uživatelů ve stejné linuxové krabici: Všechny webové soubory musí být čitelné na celém světě, a proto jsou přístupné i jiným aplikacím a jiným uživatelům v systému. Pokud by jedna aplikace nainstalovaná v systému měla bezpečnostní chybu, která by umožňovala surový, neplatný uživatelský vstup, který byl poté spuštěn pomocí PHP, mohl by vzdálený útočník procházet všechny ostatní soubory na webovém systému, které byly světově čitelné. Podobně, pokud by pole mělo více uživatelů a uživatel znal cestu webových souborů jiného uživatele, mohl by číst obsah souboru (a vidět citlivé věci, jako jsou řetězce připojení k databázi atd.).
Slyšel jsem o dvou balíčcích suphp
a phpsuexec
, které se zabývají povolením doručování souborů uživatelů „jako oni“ ve sdíleném systému. Jednou z výhod tohoto řešení je to, že umožňuje webovým aplikacím (jako je Wordpress) vytvářet a upravovat soubory - velmi užitečné pro přidávání témat, pluginů a upgradování softwaru. Samozřejmě je pravděpodobně bezpečnější dělat tyto věci ručně, ale je možné dosáhnout kompromisu s některým z výše uvedených balíčků? Nebo možná pomocí chown
, aby se adresářová skupina wordpress adresářová skupina patřila k www-data
a nastavte lepkavý bit ve skupině (g+s
)?
Použil jsem je pouze jako koncový uživatel webhostingové společnosti, a proto nevím, jaké jsou jejich vstupy a výstupy, a pokud je dokonce možné je nainstalovat na malý systém, nebo pokud existují i jiné bezpečnostní opatření, která bych měl místo toho použít, ale myslel jsem, že bych je zde zmínil, protože se jeví jako jeden z možných způsobů řešení některých mých obav.
www-data
? Je Apache/php spuštěn jako uživatel?Neměňte nic na www-data, pokud nechcete, aby php mohl editovat obsah tohoto souboru/složky
Bez ohledu na cokoli, co děláte: složky potřebují číst a vykonávat oprávnění pro uživatele k nalezení souborů; soubory potřebují ke čtení oprávnění uživatele. Pokud se při změně věci vyskytnou nějaké chyby oprávnění, podařilo se vám odstranit tato nezbytně požadovaná oprávnění.
Pokud nepíšete soubory pomocí aplikace php, můžete nechat soubory, které vlastníte: vy. Za těchto okolností platí světové povolení (xx4/5).
Pokud necháte soubory ve vašem vlastnictví: vy s oprávněními k souborům 644 (soubory), co by to znamenalo, je to, že můžete upravovat soubory webových stránek - www-data nejsou vy - takže nemůže upravovat soubory.
Pokud chcete omezit přístup k Apache + vy a zablokovat všechny ostatní přístupy chown -R you:www-data *
. S oprávněním k souboru 640 a oprávněním ke složce 750 můžete editovat, www-data mohou číst - protože pak Apache přečte skupinové oprávnění (x4/5x).
Omezte na minimum cest, na které chcete Apache/php zapisovat - pokud existuje tmp dir, do kterého aplikace potřebuje zapisovat - povolte jí zapisovat do do této složky - a pro všechna zapisovatelná umístění, pokud je to vůbec možné, se ujistěte, že je mimo kořen dokumentu nebo podnikněte kroky k zajištění, že tato zapisovatelná cesta není přístupná na webu.
Všimněte si, že „vy“ byste neměli být root. Povolení přímého ssh přístupu jako root je indikátorem dalších bezpečnostních chyb (například nikoli nepovolující přihlášení k heslu), ale to je samo o sobě celá řada otázek.
Takže pokud rozumím věcem správně, pokud Apache běží jako www-data a chci, aby Apache mohl číst adresář, musí být x bit nastaven pro světovou (jinou) skupinu (o + x), a to také musí být nastavena na všech nadřazených adresářích až po řetězec (www, var). A pokud chci, aby Apache mohl číst ze souboru, musí být nastaven bit o + r.
To není pravda, nemusíte nastavit rwx
pro 'other'. Měli byste změnit vlastníka nebo skupinu konkrétní složky/souboru, který se pokoušíte chránit. Např.:
chown -R cwd:www-data /var/www/cwd.com
chmod 750 /var/www/cwd.com
Nyní pouze členové skupiny www-data
umí číst /var/www/cwd.com
. A můžete to napsat jen vy (cwd). Pokud chcete povolit aplikacím (prostřednictvím Apache) také zapisovat/upravovat soubory v tomto adresáři, změňte jej na 770.
Myslím, že se to týká všech vašich problémů, nevidím žádný důvod ke změně uživatele, pod kterým Apache běží.