Portál AbcLinuxu, 1. května 2025 09:22
Před půl rokem jsem měl nápad vytvořit jednu aplikaci, ve které by šli naklikat weby. No naklikat zatím nejdou, ale vznikla solidní knihovna, ve které se dá web velmi rychle napsat. To přineslo i požadavek rozjet server, a aby se server zaplatil, tak to chce ho i s někym sdílnout. Celé jsem to postavil na lighttpd, protože mi je tento server velmi sympatický. Problém je, že lighty a mass hosting nejdou moc dohromady a tak si člověk musí trochu pomoct.
Lighttpd je lehký, rychlý, prý i bezpečný a flexibilní webový server. Používá ho například youtube nebo mininova. Svoje kvality na poli "jednoslužbových" strojů dokázal, stejně tak je možné ho používat pro účely uzavřené skupinky lidí, kteří si věří (rodina, malá komunitní síť) nebo se hodí taky na projekty, kde neznámí lidé nemají přístup ke scriptům, protože lighty může běžet pouze pod jedním userem a tak nejdou nastavit práva.
Ale k těm méně šťastným věcem. Konfigurace lighty je velmi flexibilní. Konfigurák nebo jeho část může být výsledem skriptu, je možno nastavit jednoduše rewrite proavidla, mod_redirect funguje též bezvadně a jednoduše a všechno lze hezky zpodmínkovat (nemluvě o hromádce dalších modulů). Také tu je proměnná server.chroot, která spustí server v chrootu. Na první pohled oko webhostera zaplesá, na druhý zjistí, že tato proměnná je "globální", a tak když ji hodíme do podmínky kde je nějaký host, tak se prostě použije nezávisle na té podmínce. To byla před týdnem rána, protože jsem měl napsanou kupku scriptů pro lighty, který by mě teď byly k ničemu. V zoufalství jsem zkoušel i apache, ale jeho konfigurace mi přišla hrozně těžkopádná a nepřímočará, narozdíl od lighty. Apache jsem používal dřív na desktopu a notebooku pro pracovní účely, ale nastavovat něco pro mě je rozdíl od nastavování něčeho pro hromadu lidí pokud chce člověk aspoň trochu klidně spát.
Tento bug či featura je zapsán v bugtrackeru již 2 roky a ani lighty 1.5 nic takového neřeší. Nastavení uživatele, pod kterým je server spušten je též globální a tak ani toto řešení neprojde. Poslední možností je použít mod_proxy. Debian má jednu moc šikovnou utilitku jailer. Ten vytvoří miniroot z debianích balíčků i s jejich závlostmi, a tak máme jen to co potřebujeme. Zminimalizoval jsem si root a jal se testování. Všechno proběhlo ok. Vytvořil jsem miniroot s pythonem, phpkem a pár pythoníma modulama (85MB) a nad tim spustil lighty v chrootu na portu 28001. V lightym na 80tym portu jsem nastavil mod_proxy. Všechno funguje ok a script se ze vnitř nemůže dostat. Všechno jsem ještě pojistil pomocí striktních práv a teď můžu říct, že mám funkční bezpečné řešení na základě lighttpd s vynikající možností škálování služeb. Resp pokud bude někdo potřebovat někde něco speciálního, mám možnost mu to nabídnout aniž bych se musel obávat bezpečnostího rizika, které je u řešení se suphp, právy a podobnými věcmi mnohem větší. PHP nemusí běhat v safemodu a můžu v pohodě pustit pythona, perl, ruby nebo i bash pod CGI.
Tohle řešení vyžadovalo napsat scripty pro startování dalších lightyů, sledování stavu lightyů a generování minirootů z databáze. V databázi je tak uloženo co má user za balíčky a miniroot se z toho může vygenerovat klidně znova a bude stačit zálohovat jen data.
A teď to horší. Každý si asi uvědomil, že to je trochu víc žravější na prostředky než jiná řešení. Určitě se to co tu navrhuju nehodí na hosting, kde bude 10000 domén na jeden stroj, ale pokud má člověk nějakých 50 userů, tak každý z nich má k dispozici luxusní možnosti, za které určitě zaplatí tolik, aby se zaplatil stroj i nějakými bonusy na stroj další. Lighty sám pamět moc nebere a když nastartuje zabírá asi 1.5MB ramky. Miniroot má jak jsem psal 85MB, když se okleští. Pokud lighty běží déle, tak se trochu rozroste, ale není to o moc. Když dnešní servery mají několik GB RAM a stovky GB disky tak nějakejch pár MB je nerozhodí a myslím si, že to za to stojí.
Tiskni
Sdílej:
Podle mě ano. Mám v /etc/ soubory kde jsou hesla, pak tam mám soubory k databázi, a v nespolední řadě tam mám data uživatelů, kteří nebudou nadšeni z myšlenky sdílet svá data s ostatními. Když bych použil Apache a nastavil práva a na něco zapoměl, tak si to každej jednoduše přečte. Když použiju lighty, tak na práva můžu zapomenout a jediná možnost je chroot nebo si pohrát s fastcgi. Fastcgi mě zas omezí v jiných věcech, takže zůstanu u chrootu :) Nejsem tak zkušený, abych zkoušel něco jiného :)
Co se týče průstřelnosti, tak máš pravdu. Dum8d0g někdě vykopal, že za použití shellu a Cčkovýho kompilátoru je možné se přes něj dostat. Je tu ještě podmínka, že chroot musí být vytvořen rootem a musí být k dispozici /proc. Jenže chroot se nějakým způsobem od roota odpoutá po spuštění, takže tohle taky padá. Sečteno a podtržno, jsem ochoten to risknout :)
/Server /Sites /admin.janevimco.cz /blog.janevimco.czA opravdu, když v blog.janevimco.cz dám do php include "../admin.janevimco.cz/tajnahesla.php", tak se to tam opravdu dostane ...
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.