::::::::::. :::::::..   :::.,::::::   :::         ...     .        :   
    `;;;```.;;;;;;;``;;;;  ;;;;;;;''''   ;;;      .;;;;;;;.  ;;,.    ;;;  
     `]]nnn]]'  [[[,/[[['  [[[ [[cccc    [[[     ,[[     \[[,[[[[, ,[[[[, 
      $$$""     $$$$$$c    $$$ $$""""    $$'     $$$,     $$$$$$$$$$$"$$$ 
      888o      888b "88bo,888 888oo,__ o88oo,.__"888,_ _,88P888 Y88" 888o
      YMMMb     MMMM   "W" MMM """"YUMMM""""YUMMM  "YMMMMMP" MMM  M'  "MMM



Tento clanok povodne vysiel v roku 2004 v e-zine Prielom #22.
Projekt popisovany nizsie stale funguje.

webhosting s chroot apachom

Roky som na Internete prezival bez toho aby som mal k nemu pripojeny vlastny
server pod vlastnou spravou. Presuval som svoje WWW stranky a e-mailove
schranky z pocitaca na pocitac. Intenzita presunov zavisela od vole majitelov
systemov.

Pri poslednom cirkuse okolo migracie domen v TLD .sk ma to prestalo bavit.
Zakupil som si potrebny HW, nainstaloval SW a zaniesol to k poskytovatelovi
server housingu.

Aby bola cela sranda financne unosna, zacal som za mierny poplatok poskytovat
sluzby kamaratom. Take tie zakladne, ved to poznate, e-mailove schranky pre
rozne adresy, priestor pre WWW stranky, shell ucet. A situacia sa zacala
postupne zhorsovat. Jeden chcel mat HTTP server s podporou servletov, dalsi si
pridal PHP, perl, vyuzivanie MySQL atd.

Zanedlho som sa dostal do stavu, ked som musel pridavat virtualne servre, menit
konfiguraciu Apache HTTP servra, vytvarat nove ucty, nastavovat privilegia k
databazam a tabulkam v MySQL, a to aj viackrat za den/denne.

Zabezpecenie servra rapidne klesalo. Apache aj MySQL bezali pod uctami s
obmedzenymi pravami, ale to uz snad maju vsetky OS ako default. Mylit sa je
ludske A programatori su toho dokazom. Na to, aby som riskoval, ze niekto
vyhackuje data cez zle naprogramovany PHP skript, alebo pozmeni stranky
vsetkych virtualnych servrov, som jednak paranoidny a jednak stary.

Preto som zacal hladat sposob ako od seba oddelit jednotlive virtualne WWW
servre tak, aby si navzajom nemohli siahat na data, pamat, databazy a podobne.
Bohuzial mnou pouzivany HTTP server Apache
od The Apache Software Foundation to neumoznuje (dokaze nejaky HTTP server
podobne veci? Ozvite sa, ak ste na nieco podobne narazili.)

Jeden zo sposobov je zacat na nizsej aplikacnej urovni a kazdemu uzivatelovi
vyhradit jeden OS. To mi vsak pripada ako nahanat komara s puckou (to je take
velke kladivo, ak by ste nevedeli).

V kazdom pripade, ak by ste chceli nechat bezat na jednom pocitaci simultanne
viacere instancie operacneho systemu, mozte to skusit pod Linuxom:
User-mode Linux, vmware. Pre Windows: Virtual PC a vmware.

Na virtualne infrastruktury v Solarise si este pockame.

Cely system som potreboval sprevadzkovat pod Linuxom, no aj napriek tomu som sa
snazil aby bolo riesenie prenositelne aj na ine OS (konkretne je v tomto texte
spomenute riesenie pre Solaris 9).

Na riesenie som mal nasledujuce poziadavky:

  1. minimalna interakcia spravcu systemu pri nastavovani parametrov HTTP
    servra,
  2. ochrana dat pouzivatelov (napr. chybne naprogramovany PHP skript nesmie
    umoznit pristup k datam ostatnych pouzivatelov virtualnych servrov),
  3. ochrana systemu (hacknutie HTTP servra nesmie umoznit pristup k OS),
  4. pouzivatel musi mat moznost spravovat si svoj virtualny server sam.

Obmedzenia:

  1. len jedna IP adresa pridelena servru pre pristup k Internetu,
  2. neexistencia HTTP servra, ktory by poskytoval vlastnosti uvedene
    vyssie.
  3. standartny HTTP server bezi na well-known porte 80, su potrebne
    privilegia na vytvorenie raw socketu.

Poziadavky 2 a 3 boli splnene tym, ze som premiestnil Apache server do chroot-u
(na RedHat Linuxe je chroot sucastou balika sh-utils, v Solarise 9 ho najdete v
baliku SUNWcsu) v pouzivatelovom adresari a nechal na pouzivatelovi, nech si ho
spusta sam.

Vacsia cast prace administratora OS odpada, pretoze kazdy uzivatel je
zodpovedny za obsah svojho konfiguracneho suboru pre svoj Apache HTTP server
(splnena poziadavka 1 a 4).

Ako si mozte precitat nizsie, obmedzenia sa daju obist spravnym navrhom
riesenia a este poskytnu celkom prijemne vedlajsie ucinky.

Kazdemu uzivatelovi som v systeme nakonfiguroval jednu lokalnu IP
adresu, ktora sa pouziva len vnutorne na servri a neobjavuje sa na
Internete (vybral som si neskromne siet 10.0.0.0) a vytvoril lokalne
virtualne sietove interfaces.

V Linuxe som pouzil dummy interfaces, v Solarise to bude fungovat, ak vytvorite
interface lo:?, kde ? je cislo virtualneho interface. Pouzivatel moze na
pridelenej lokalnej IP adrese pouzivat ktorykolvek port v rozsahu 1025-65535.

Cela adresarova struktura obsahujuca Apache server a k nemu potrebne veci
(napr. perl pre cgi-bin scripty) je vytvorena a spravovana administratorom.
Kazdy pouzivatel ju ma namountovanu read-only vo svojom domacom adresari (pod
Linuxom som pouzil prikaz
mount --bind -o ro', pod Solarisom `mount -F lofs -o ro).

Konfiguracny subor Apache HTTP servru umoznuje vkladanie textu prikazom
include, takze zakladne konfiguracne parametre su ulozene v system-wide
konfiguracnom subore (read-only pre pouzivatela) a je na uzivatelovi, co si
ulozi do svojho konfiguracneho suboru (read-write pre pouzivatela), ktory je
includovany system-wide konfiguracnym suborom.

Usporiadanie suborov moze vyzerat nasledovne:

/chroot - adresar obsahuje strukturu Apache servra

/home/mikulas/chroot
- tento adresar sluzi ako / po spusteni prikazu chroot, jeho obsah je
nasledovny:

lrwxrwxrwx 1 mikulas mikulas    7 Jan 28 11:19 bin -> sys/bin
lrwxrwxrwx 1 mikulas mikulas    7 Jan 28 11:19 dev -> sys/dev
lrwxrwxrwx 1 mikulas mikulas    7 Jan 28 11:19 etc -> sys/etc
lrwxrwxrwx 1 mikulas mikulas    7 Jan 28 11:19 lib -> sys/lib
drwx------ 3 mikulas mikulas 4096 Jan 28 21:31 proc
lrwxrwxrwx 1 mikulas mikulas    8 Jan 28 11:19 sbin -> sys/sbin
drwxr-xr-x 9 root    root    4096 Jan 28 18:32 sys
lrwxrwxrwx 1 mikulas mikulas    8 Jan 28 11:19 tmp -> user/tmp
drwx------ 7 mikulas mikulas 4096 Jan 28 18:41 user
lrwxrwxrwx 1 mikulas mikulas    7 Jan 28 11:19 usr -> sys/usr
lrwxrwxrwx 1 mikulas mikulas    8 Jan 28 11:19 var -> user/var

/home/mikulas/chroot/sys - v tomto adresari je
namountovany read-only adresar /chroot.

/home/mikulas/chroot/user - adresar `user' je read-write pre pouzivatela a
obsahuje napr. v system-wide httpd.conf includovany konfigurak.

Malou komplikaciou je skutocnost, ze prikaz chroot moze uspesne
pouzit len root.

Na elimininaciu tohto problemu som pouzil sudo (v RedHat Linuxe sa nachadza v
baliku sudo, v Solarise v baliku SFWsudo). Napr. pre start Apache HTTP servra
je potrebne pouzit prikaz:

sudo chroot /home/mikulas/chroot su - mikulas apachectl start

Text vyssie popisuje sposob ako dosiahnut stav, aby kazdemu pouzivatelovi mohol
bezat chrootovany HTTP server na jeho lokalnej IP adrese.

Aby sa k tymto servrom dostali poziadavky z Internetu, je potrebne podla obsahu
HTTP requestu presmerovat z nasej jedinej verejnej IP adresy pakety na
prislusne IP adresy a spat.

K tomuto som pouzil squid (pre RedHat
Linux balik squid, pre Solaris SFWsquid) beziaci v "accelerator mode" a perl
redirector, ktory prepisuje URL z Internetovej IP adresy/hostname na lokalne
adresy a porty. Samozrejme, ze squid bezi vo svojom sukromnom chroot prostredi.

Vyhody hore uvedeneho riesenia:


Nevyhody:

V pripade zajmu rad zverejnim detaily celej implementacie.

Mikulas Papuca