Erinevus lehekülje "PHP käivitamine kasutaja õigustes" redaktsioonide vahel

Allikas: Kuutõrvaja
(PHP install algkoodist)
 
(ei näidata sama kasutaja 90 vahepealset redaktsiooni)
1. rida: 1. rida:
Apache suexec on programm, mis lisati versioonis 1.2 ja mis annab apache kasutajatele võimaluse käivitada cgi ja ssi programme kasutaja id-ga,
+
===Sissejuhatus===
mis erineb veebiserveri id-st. Normaalselt toimivad kõik skriptid veebiserveri õigustes.
 
Kahjuks võimaldab see nõnda startida ainult cgi skripte. Käesolev pala kirjeldab, kuidas saada iga serveris asuv php tükk samuti käima
 
antud kasutaja õigustes. Näites kasutatav PHP on 5. versioon, kuid kasutada võib ka neljandat.
 
Trellidega (#) on näidetes tähistatud käsuviip.
 
  
'''Tarkvara installeerimine'''
+
Harilikult kõik veebiskriptid ja cgi skriptid samuti
 +
toimivad veebiserveri kasutaja õigustes. Siiski
 +
on turva ja muudel kaalutlustel vajalik saada iga php ja perli
 +
skript töötama kasutaja õigustes kellele ta kuulub.
  
Installeerime apache koos suexec-ga:
+
Lahendused oleksid
 +
 
 +
*MPM-ITK - apache worker millepuhul valimatult kõik (moodulid, skriptid etc) saavad selle kasutaja õigused
 +
kes virtualhostis eelnevalt. Plussiks on tunduvalt suurem kiirus võrreldes suexeciga.
 +
 
 +
*Suexec - Mõeldud cgi skriptide käivitamiseks kasutaja õigustes
 +
ning sellega ei saa otse php jms apache moodulite skripte startida.
 +
Selleks tuleb suunata skriptid php-cgi peale mis stardib need cgi skriptide laadis.
 +
Miinuseks sellel tehnikal on suur aeglus võrreldes moodulitega.
 +
 
 +
Selle teksti autor soovitaks ise kasutada suexec ja cgi baasil lahendust vaid mingil erijuhtumil, nt kui apache versiooni ei saa muuta, ning eelistada MPM-ITK lahendust.
 +
 
 +
===PHP install algkoodist===
 +
 
 +
Tõmbame uusima php ja pakime lahti kausta /usr/src/php-versioon
 +
Peale kompileerimist paigaldatakse php binaarfailid kausta /usr/local/php5
 +
 
 +
<source lang=bash>
 +
#!/bin/sh
 +
cd /usr/src/php-5.2.6/
 +
make clean
 +
kaust=/usr/local/php5/
 +
./configure --prefix=$kaust \
 +
--with-mysql \
 +
"--with-config-file-path=$kaust/etc" \
 +
"--enable-memory-limit" \
 +
"--disable-debug" \
 +
"--with-regex=php" \
 +
"--disable-rpath" \
 +
"--enable-calendar" \
 +
"--enable-sysvsem" \
 +
"--enable-sysvshm" \
 +
"--enable-sysvmsg" \
 +
"--enable-track-vars" \
 +
"--enable-trans-sid" \
 +
"--with-bz2" \
 +
"--enable-ctype" \
 +
"--with-iconv" \
 +
"--enable-exif" \
 +
"--enable-filepro" \
 +
"--with-gettext" \
 +
"--enable-mbstring" \
 +
"--enable-sockets" \
 +
"--with-zlib" \
 +
"--without-zip" \
 +
"--enable-dbx" \
 +
"--enable-gd-native-ttf" \
 +
"--disable-xpm"
 +
make
 +
make install DESTDIR=$kaust
 +
</source>
 +
 
 +
===MPM-ITK===
 +
 
 +
Selleks ,et saavutada suexecile sarnane olukord
 +
kus kõik skriptid töötavad kasutaja õigustes võib kasutada apache moodulit mpm-itk.
 +
lähemalt sellest http://mpm-itk.sesse.net/
 +
 
 +
Põhimõtteliselt on see modifitseeritud MPM-prefork, mis säilitab osad
 +
roodu õigused (CAP_SETUID ja CAP_SETGID) kõikidel oma protsessidel ja
 +
siis, kui vhost on kindlaks määratud, saab vajalikuks kasutajaks ja
 +
lahendab päringu selle kasutaja õigustes. Sealhulgas kõik tavapärased
 +
apache moodulid toimivad samuti selle kasutaja õigustes (nt mod_php, mod_perl jms).
 +
 
 +
Hea kokkuvõttev artikkel kõikidest suPHP, suexec, MPM-perchild/Metux ja
 +
MPM-itk omadustest ja puudustest:
 +
http://mitka.us/articles/mpm-itk/
 +
 
 +
MPM-itk miinuseks on asjaolu, et kuniks vhost pole kindlaks määratud, on
 +
protsess roodu osalistes õigustes, seega igasugune haavatavus sel hetkel
 +
on roodu haavatavus.
 +
Samas kuipalju apachel endal ikka vigu sees on, mis tekivad *enne* HTTP
 +
päringu parsimist ja võimaldaksid koodi käivitda (kuni 2004. aastani
 +
GLSA-de hulgast, ei leidnud). Lisaks veel see, et isegi, kui
 +
rünne õnnestuks, saavutataks vaid võime lugeda roodu faile, kuid mitte
 +
midagi muud (siin äkki apache + chroot abiks, kui isu).
 +
 
 +
'''Paigaldamine FreeBSD opsüsteemis Apache 2.2 versioonil'''
 +
 
 +
Selleks tuleb paigaldada apache-itk pakett järgmiselt
 +
 
 +
cd /usr/ports/www/apache22
 +
echo 'WITH_MPM=itk' >> Makefile.local
 +
make install clean
 +
 
 +
'''Kasutamine'''
 +
 
 +
Virtualhosti tuleb tekitada lisarida
 +
 
 +
AssignUserId katse katse
 +
 
 +
Neid direktiive võib kasutada ka <Directory> blokis, mitte ainult virtualhostis
 +
ja kaust ei pea olema seejuures konkreetse kasutaja omanduses.
 +
 
 +
<Directory /usr/local/www/apache22/data/suvakas>
 +
    AllowOverride None
 +
    Order deny,allow 
 +
    allow from all
 +
    AssignUserId suvakas suvakas
 +
</Directory>
 +
 
 +
Silmas tuleb pidada, et virtuaalseid kasutajad nt olematut uid/gid saa luua, kasutaja
 +
peab reaalselt süsteemis eksisteerima.
 +
 
 +
Kui Apache annab veateadet
 +
 
 +
Permission denied: unable to check htaccess file, ensure it is readable
 +
 
 +
on probleem allowoverryde reeglites ja apache mpm-itk chrootimise mehanismis
 +
Ehk siistervele kaustale võib anda õigused
 +
 
 +
chmod 751 või 771
 +
 
 +
Kuid .htaccessi mingi override käivitatakse tõenäoliselt enne kui apache
 +
on omandanud kasutaja õigused. Seega peab hetkel toore häkina andma
 +
htaccessile õigused
 +
 
 +
chmod 755
 +
 
 +
Ehk siis see fail peab omama other grupi lugemisõigusi.
 +
 
 +
===Teooria, ehk kuidas läbi CGI Wrapperi PHP käivitamine toimub===
 +
 
 +
Apache oskab siduda mingit laiendit teatud cgi skripti käivitamisega
 +
näiteks saame globlaalselt käivitada php lisades httpd.conf'i
 +
 
 +
ScriptAlias /php-cgi/ /usr/local/www/data/cgi-bin
 +
AddType application/x-httpd-fastphp .php
 +
Action application/x-httpd-fastphp /php-fastcgi/php5-fcgi
 +
 
 +
Apache ei oska kohe suunata faile edasi kettal olevale binaryle või skriptile.
 +
Küll aga näiteks http://mingiaadress/cgi-bin all olvevale cgi skriptile
 +
või binaarfailile.
 +
 
 +
'''Täpsemalt siis...'''
 +
 
 +
Kõik toimub sellises järjekorras, php skript mis käivitatud läbi järgmised kihid
 +
.php -> http://nimi.ee/php-cgi/php5-fcgi -> /usr/local/bin/php-cgi
 +
 
 +
Reaga '''ScriptAlias /php-fastcgi/ /usr/local/www/data/cgi-bin'''
 +
tekitame me enda veebiserverile aliase php-cgi
 +
url'iga http://nimi/php-cgi
 +
 
 +
Järgmise reaga '''AddType application/x-httpd-fastphp .php'''
 +
Tekitame uue application tüübi nimega x-httpd-fastphp mille seome .php laiendiga
 +
 
 +
Kolmas rida '''Action application/x-httpd-fastphp /php-cgi/php5-fcgi''' määrab ,et
 +
application x-httpd-fastphp. Seetähendab kõik .php failid suunatakse automaatselt
 +
skriptile nimega '''php5-fcgi''' ehk siis http://nimi.ee/php-cgi/php5-fcgi
 +
 
 +
skript php5-fcgi ise on sellise sisuga
 +
 
 +
#!/bin/sh
 +
exec /usr/local/bin/php-cgi
 +
 
 +
Nii saame näiteks hõlsasti teha kasvõi uue application tüübi näiteks laiendiga .jms
 +
ja siduda selle cgi skriptiga mis loeb talle saadetud .jms laiendiga
 +
failidest käske ja täidab neid luues nii kasvõi endale primitiivse veebiskriptimise keele.
 +
 
 +
===Mitme PHP versiooni samaaegne koos kasutamine CGI wrapperi abil===
 +
 
 +
Olgu näiteks vaja kasutada koos samas keskkonnas php4 ja php5 või lähitulevikus viimane ning php6
 +
Kuna Apache moodulina saab vähemalt hetkel laadida vaid ühe php siis tuleb teise saamiseks pisut trikutada. Kõige lihtsam on selgitada välja esiteks kumb versioon on kasutatavam ning tekitab suuremat loadi. See versioon tasuks laadida moodulina, teine aga käivitada läbi cgi wrapperi
 +
 
 +
Näiteks on meil vaikimisi töös php5 kuid vaja kasutada ka php4 programme.
 +
Sellisel juhul laeme php5 moodulina kasutades standartseid lahendusi ning php4 puhul seadistame järgnevalt
 +
 
 +
cgi binaar
 +
 
 +
/usr/local/php4/bin/php-cgi
 +
 
 +
httpd.conf'i read
 +
 
 +
AllowOverride All
 +
ScriptAlias /php4-cgi /usr/local/php4/bin/php-cgi
 +
<Directory /usr/local/php4/bin/>
 +
    Options none
 +
    AllowOverride All
 +
    Order Deny,Allow
 +
  Allow from All
 +
</Directory>
 +
 
 +
ja .htaccessi fail kausta /serv/wwww/kasutaja/html sisuga
 +
 
 +
AddType application/x-httpd-fastphp4 .php4
 +
Action application/x-httpd-fastphp4 /php4-cgi
 +
 
 +
Mispuhul kõik .php4 laiendiga failid käivitatakse läbi eraldi kihi.
 +
 
 +
'''Wrapperita''' ehk suexeci kasutamiseks ei pea olema ilmtingimata olemas vahekiht, võime suunata ka otse õigele binaarfailile
 +
 
 +
ScriptAlias /php5-cgi /usr/local/bin/php-cgi
 +
AddType application/x-httpd-fastphp .php
 +
Action application/x-httpd-fastphp /php5-cgi
 +
 
 +
'''Mitme php versiooni kasutamine'''
 +
 
 +
Kasutada saab ka korraga nii php4'ja kui php5't näiteks on meil
 +
installitud php5 ja php4 cgi versioonid
 +
 
 +
/usr/bin/php-cgi
 +
/usr/bin/php5-cgi
 +
 
 +
===Suexec abil veebide kasutajaõigustesse jagamine===
 +
 
 +
Apache suexec on programm, mis Apache'l olemas alates versioonis 1.2 ja mis annab apache kasutajatele võimaluse käivitada cgi ja ssi programme kasutaja UID-ga. Kahjuks võimaldab see nõnda vaikimisi startida ainult cgi skripte ja mitte Apache mooduleid.
 +
 +
Php käivitamiseks tuleb kirjutada põhimõtteliselt eraldi kiht e wrapper, cgi skript mis omakorda kutsub välja käsurea (cli) php mis siis töötleb e interpreteerib koodifaile.
 +
 
 +
====Suexec tarkvara installeerimine FreeBSD süsteemis====
 +
 
 +
Installeerime apache koos suexec-ga näiteks FreeBSD's
  
 
   # cd /usr/ports/www/apache2
 
   # cd /usr/ports/www/apache2
 
   # make  WITH_SUEXEC_MODULES="YES"  install  
 
   # make  WITH_SUEXEC_MODULES="YES"  install  
  
Seejärel installeerime php:
+
Seejärel installeerime php
 
 
  # cd /usr/ports/lang/php5
 
  # make install clean
 
  
 
PHP installeerimisel küsitakse täiendavaid parameetreid. Valida tuleb CGI ja FastCGI tugi.
 
PHP installeerimisel küsitakse täiendavaid parameetreid. Valida tuleb CGI ja FastCGI tugi.
25. rida: 232. rida:
 
   # make install clean
 
   # make install clean
  
Peale installeerimist saame kontrollida MILLE? olemasolu ja parameetreid selliselt:
+
====Php CGI wrapperi üle läbi suexeci käima====
 +
 
 +
Tegemist on natuke keerukama ja aeglasema meetodiga
 +
aga vaatame seda ,et täpsemalt mõista teooriat.
 +
 
 +
kontrollime suexec'i parameetreid selliselt:
  
 
  # suexec -V
 
  # suexec -V
36. rida: 248. rida:
 
   -D AP_USERDIR_SUFFIX="public_html"
 
   -D AP_USERDIR_SUFFIX="public_html"
  
 
+
Nagu näha, soovib suexec, et kõik skriptid, mida tema abil käivitatakse, asuksid kataloogis ''
Nagu näha, soovib suexec, et kõik skriptid, mida tema abil käivitatakse, asuksid kataloogis /usr/local/www/data
+
'''/usr/local/www/data'''
 
Ei hakka DOC_ROOT muutma ja loome testi sinna.
 
Ei hakka DOC_ROOT muutma ja loome testi sinna.
  
 
'''Apache konfiguratsioon'''
 
'''Apache konfiguratsioon'''
 +
 +
Serveris on kaks veebi http://www.nimi.ee ja http://test.nimi.ee
 +
 +
Esimene peab toimima kasutaja katse õigustes ja teine katse3
  
 
Muudame httpd.conf, vajadusel lisame:
 
Muudame httpd.conf, vajadusel lisame:
47. rida: 263. rida:
 
  LoadModule fastcgi_module    libexec/apache2/mod_fastcgi.so
 
  LoadModule fastcgi_module    libexec/apache2/mod_fastcgi.so
  
Tekitasime veel konfiguratsioonifaili sellise sektsiooni:
+
Tekitame virtualhostid httpd.conf faili
 
 
<IfModule mod_fastcgi.c>
 
    FastCgiWrapper  /usr/local/sbin/suexec
 
    FastCgiConfig  -singleThreshold 1 -pass-header HTTP_AUTHORIZATION
 
</IfModule>
 
 
 
 
 
Tekitame virtualhostid
 
  
 
  <VirtualHost *:80>
 
  <VirtualHost *:80>
 
   SuexecUserGroup katse katse
 
   SuexecUserGroup katse katse
  ServerAdmin kasutaja@nimi.ee
 
 
   DocumentRoot /usr/local/www/data/katse
 
   DocumentRoot /usr/local/www/data/katse
 
   ServerName www.nimi.ee
 
   ServerName www.nimi.ee
 
   
 
   
  ScriptAlias /php-fastcgi/ /usr/local/www/data/katse/
+
  ScriptAlias /php-fastcgi/ /usr/local/www/data/katse/cgi
 
  AddType application/x-httpd-fastphp .php
 
  AddType application/x-httpd-fastphp .php
 
  Action application/x-httpd-fastphp /php-fastcgi/php5-fcgi
 
  Action application/x-httpd-fastphp /php-fastcgi/php5-fcgi
 
   
 
   
 
  </VirtualHost>
 
  </VirtualHost>
 
+
 
  <VirtualHost *:80>
 
  <VirtualHost *:80>
 
   SuexecUserGroup katse3 katse3
 
   SuexecUserGroup katse3 katse3
  ServerAdmin kasutaja@nimi.ee
 
 
   DocumentRoot /usr/local/www/data/katse3/cgi-bin
 
   DocumentRoot /usr/local/www/data/katse3/cgi-bin
 
   ServerName test.nimi.ee
 
   ServerName test.nimi.ee
 
   
 
   
  ScriptAlias /php-fastcgi/ /usr/local/www/data/katse3/cgi-bin
+
  ScriptAlias /php-fastcgi/ /usr/local/www/data/katse3/cgi
 
  AddType application/x-httpd-fastphp .php
 
  AddType application/x-httpd-fastphp .php
 
  Action application/x-httpd-fastphp /php-fastcgi/php5-fcgi
 
  Action application/x-httpd-fastphp /php-fastcgi/php5-fcgi
81. rida: 287. rida:
 
  </VirtualHost>
 
  </VirtualHost>
  
Alternatiivselt kataloogipõhiselt:
+
Loome kaustad cgi skriptidele
 
 
  SuexecUserGroup katse katse
 
 
 
  <Directory "/usr/local/www/data/cgi">
 
    Options +ExecCGI
 
    AddHandler fastcgi-script .cgi
 
    AddType application/x-httpd-fastphp .php
 
    Action application/x-httpd-fastphp /cgi/php5-fcgi.cgi
 
  </Directory>
 
 
 
  
'''Skript wrapperiks'''
+
mkdir /usr/local/www/data/katse/cgi-bin
 +
mkdir /usr/local/www/data/katse3/cgi-bin
  
Varasemalt sidusime virtualhostis  iga .php laiendi kindla cgi skriptiga, mida suexeciga käivitame.
+
'''wrapper'''
Viimaks ehitame skripti enda, mis käivitatuna suexeci abil kasutaja õigustes stardib php enda ja sellekaudu ka veebi.
 
  
 +
Skript ise millele suunatakse .php laiendiga failid on järgnev
  
 
  #!/bin/sh
 
  #!/bin/sh
  #PHPRC="/usr/local/etc/php.ini"
+
  PHPRC="/usr/local/etc/php.ini"
 
  export PHPRC
 
  export PHPRC
PHP_FCGI_CHILDREN=4
 
export PHP_FCGI_CHILDREN
 
 
  exec /usr/local/bin/php-cgi
 
  exec /usr/local/bin/php-cgi
  
Kopeerime selle faili kasutajate katse ja katse 3 kaustadesse (kataloogidesse):
+
Loome selle faili kasutajate katse ja katse 3 alla
 
 
/usr/local/www/data/katse/cgi-bin/php5-fcgi
 
  
/usr/local/www/data/katse3/cgi-bin/php5-fcgi
+
/usr/local/www/data/katse/cgi/php5-fcgi
 +
/usr/local/www/data/katse3/cgi/php5-fcgi
  
 
Muudame mõlema faili kasutajaõigusi chown käsuga:
 
Muudame mõlema faili kasutajaõigusi chown käsuga:
  
chown katse:katse /usr/local/www/data/katse/cgi-bin/php5-fcgi
+
chown katse:katse /usr/local/www/data/katse/cgi-bin/php5-fcgi
 +
chown katse3:katse3 /usr/local/www/data/katse3/cgi-bin/php5-fcgi
  
chown katse3:katse3 /usr/local/www/data/katse3/cgi-bin/php5-fcgi
+
===Kasutaja õiguste toimimise testimine===
  
'''Testimine'''
+
Testimiseks saab kasutada järgmist php skripti
  
Testimiseks saab teha skripti
+
<source lang=php>
 
+
  <?php
  < ?php
 
print "hello world< p >\n";
 
 
  system("id");
 
  system("id");
  php? >
+
  php?>
 
+
</source>
  
 
www.nimi.ee skripti vaadates
 
www.nimi.ee skripti vaadates
  
hello world
 
 
 
  uid=1004(katse) gid=1004(katse) groups=1004(katse)  
 
  uid=1004(katse) gid=1004(katse) groups=1004(katse)  
  
 
test.nimi.ee
 
test.nimi.ee
  
hello world
+
  uid=1009(katse3) gid=1009(katse3) groups=1009(katse3)
 
  uid=1009(katse3) gid=1009(katse3) groups=1009(katse3)  
 
  
 +
===Lingid===
  
EENet 2006
+
* http://www.freebsd.org/cgi/url.cgi?ports/www/apache22-peruser-mpm/pkg-descr tudub olevat eestlaste tehtud alternatiiv kasutajateõigustes lehtede käivitamiseks

Viimane redaktsioon: 6. november 2011, kell 03:42

Sissejuhatus

Harilikult kõik veebiskriptid ja cgi skriptid samuti toimivad veebiserveri kasutaja õigustes. Siiski on turva ja muudel kaalutlustel vajalik saada iga php ja perli skript töötama kasutaja õigustes kellele ta kuulub.

Lahendused oleksid

  • MPM-ITK - apache worker millepuhul valimatult kõik (moodulid, skriptid etc) saavad selle kasutaja õigused

kes virtualhostis eelnevalt. Plussiks on tunduvalt suurem kiirus võrreldes suexeciga.

  • Suexec - Mõeldud cgi skriptide käivitamiseks kasutaja õigustes

ning sellega ei saa otse php jms apache moodulite skripte startida. Selleks tuleb suunata skriptid php-cgi peale mis stardib need cgi skriptide laadis. Miinuseks sellel tehnikal on suur aeglus võrreldes moodulitega.

Selle teksti autor soovitaks ise kasutada suexec ja cgi baasil lahendust vaid mingil erijuhtumil, nt kui apache versiooni ei saa muuta, ning eelistada MPM-ITK lahendust.

PHP install algkoodist

Tõmbame uusima php ja pakime lahti kausta /usr/src/php-versioon Peale kompileerimist paigaldatakse php binaarfailid kausta /usr/local/php5

 #!/bin/sh
 cd /usr/src/php-5.2.6/
 make clean
 kaust=/usr/local/php5/
 ./configure --prefix=$kaust \
 --with-mysql \
 "--with-config-file-path=$kaust/etc" \
 "--enable-memory-limit" \
 "--disable-debug" \
 "--with-regex=php" \
 "--disable-rpath" \
 "--enable-calendar" \
 "--enable-sysvsem" \
 "--enable-sysvshm" \
 "--enable-sysvmsg" \
 "--enable-track-vars" \
 "--enable-trans-sid" \
 "--with-bz2" \
 "--enable-ctype" \
 "--with-iconv" \
 "--enable-exif" \
 "--enable-filepro" \
 "--with-gettext" \
 "--enable-mbstring" \
 "--enable-sockets" \
 "--with-zlib" \
 "--without-zip" \
 "--enable-dbx" \
 "--enable-gd-native-ttf" \
 "--disable-xpm"
 make
 make install DESTDIR=$kaust

MPM-ITK

Selleks ,et saavutada suexecile sarnane olukord kus kõik skriptid töötavad kasutaja õigustes võib kasutada apache moodulit mpm-itk. lähemalt sellest http://mpm-itk.sesse.net/

Põhimõtteliselt on see modifitseeritud MPM-prefork, mis säilitab osad roodu õigused (CAP_SETUID ja CAP_SETGID) kõikidel oma protsessidel ja siis, kui vhost on kindlaks määratud, saab vajalikuks kasutajaks ja lahendab päringu selle kasutaja õigustes. Sealhulgas kõik tavapärased apache moodulid toimivad samuti selle kasutaja õigustes (nt mod_php, mod_perl jms).

Hea kokkuvõttev artikkel kõikidest suPHP, suexec, MPM-perchild/Metux ja MPM-itk omadustest ja puudustest: http://mitka.us/articles/mpm-itk/

MPM-itk miinuseks on asjaolu, et kuniks vhost pole kindlaks määratud, on protsess roodu osalistes õigustes, seega igasugune haavatavus sel hetkel on roodu haavatavus. Samas kuipalju apachel endal ikka vigu sees on, mis tekivad *enne* HTTP päringu parsimist ja võimaldaksid koodi käivitda (kuni 2004. aastani GLSA-de hulgast, ei leidnud). Lisaks veel see, et isegi, kui rünne õnnestuks, saavutataks vaid võime lugeda roodu faile, kuid mitte midagi muud (siin äkki apache + chroot abiks, kui isu).

Paigaldamine FreeBSD opsüsteemis Apache 2.2 versioonil

Selleks tuleb paigaldada apache-itk pakett järgmiselt

cd /usr/ports/www/apache22
echo 'WITH_MPM=itk' >> Makefile.local
make install clean

Kasutamine

Virtualhosti tuleb tekitada lisarida

AssignUserId katse katse

Neid direktiive võib kasutada ka <Directory> blokis, mitte ainult virtualhostis ja kaust ei pea olema seejuures konkreetse kasutaja omanduses.

<Directory /usr/local/www/apache22/data/suvakas>
    AllowOverride None
    Order deny,allow  
    allow from all
    AssignUserId suvakas suvakas
</Directory>

Silmas tuleb pidada, et virtuaalseid kasutajad nt olematut uid/gid saa luua, kasutaja peab reaalselt süsteemis eksisteerima.

Kui Apache annab veateadet

Permission denied: unable to check htaccess file, ensure it is readable

on probleem allowoverryde reeglites ja apache mpm-itk chrootimise mehanismis Ehk siistervele kaustale võib anda õigused

chmod 751 või 771

Kuid .htaccessi mingi override käivitatakse tõenäoliselt enne kui apache on omandanud kasutaja õigused. Seega peab hetkel toore häkina andma htaccessile õigused

chmod 755

Ehk siis see fail peab omama other grupi lugemisõigusi.

Teooria, ehk kuidas läbi CGI Wrapperi PHP käivitamine toimub

Apache oskab siduda mingit laiendit teatud cgi skripti käivitamisega näiteks saame globlaalselt käivitada php lisades httpd.conf'i

ScriptAlias /php-cgi/ /usr/local/www/data/cgi-bin
AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fastcgi/php5-fcgi

Apache ei oska kohe suunata faile edasi kettal olevale binaryle või skriptile. Küll aga näiteks http://mingiaadress/cgi-bin all olvevale cgi skriptile või binaarfailile.

Täpsemalt siis...

Kõik toimub sellises järjekorras, php skript mis käivitatud läbi järgmised kihid

.php -> http://nimi.ee/php-cgi/php5-fcgi -> /usr/local/bin/php-cgi

Reaga ScriptAlias /php-fastcgi/ /usr/local/www/data/cgi-bin tekitame me enda veebiserverile aliase php-cgi url'iga http://nimi/php-cgi

Järgmise reaga AddType application/x-httpd-fastphp .php Tekitame uue application tüübi nimega x-httpd-fastphp mille seome .php laiendiga

Kolmas rida Action application/x-httpd-fastphp /php-cgi/php5-fcgi määrab ,et application x-httpd-fastphp. Seetähendab kõik .php failid suunatakse automaatselt skriptile nimega php5-fcgi ehk siis http://nimi.ee/php-cgi/php5-fcgi

skript php5-fcgi ise on sellise sisuga

#!/bin/sh
exec /usr/local/bin/php-cgi

Nii saame näiteks hõlsasti teha kasvõi uue application tüübi näiteks laiendiga .jms ja siduda selle cgi skriptiga mis loeb talle saadetud .jms laiendiga failidest käske ja täidab neid luues nii kasvõi endale primitiivse veebiskriptimise keele.

Mitme PHP versiooni samaaegne koos kasutamine CGI wrapperi abil

Olgu näiteks vaja kasutada koos samas keskkonnas php4 ja php5 või lähitulevikus viimane ning php6 Kuna Apache moodulina saab vähemalt hetkel laadida vaid ühe php siis tuleb teise saamiseks pisut trikutada. Kõige lihtsam on selgitada välja esiteks kumb versioon on kasutatavam ning tekitab suuremat loadi. See versioon tasuks laadida moodulina, teine aga käivitada läbi cgi wrapperi

Näiteks on meil vaikimisi töös php5 kuid vaja kasutada ka php4 programme. Sellisel juhul laeme php5 moodulina kasutades standartseid lahendusi ning php4 puhul seadistame järgnevalt

cgi binaar

/usr/local/php4/bin/php-cgi 

httpd.conf'i read

AllowOverride All
ScriptAlias /php4-cgi /usr/local/php4/bin/php-cgi
<Directory /usr/local/php4/bin/>
   Options none
   AllowOverride All
   Order Deny,Allow
  Allow from All
</Directory>

ja .htaccessi fail kausta /serv/wwww/kasutaja/html sisuga

AddType application/x-httpd-fastphp4 .php4
Action application/x-httpd-fastphp4 /php4-cgi 

Mispuhul kõik .php4 laiendiga failid käivitatakse läbi eraldi kihi.

Wrapperita ehk suexeci kasutamiseks ei pea olema ilmtingimata olemas vahekiht, võime suunata ka otse õigele binaarfailile

ScriptAlias /php5-cgi /usr/local/bin/php-cgi
AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php5-cgi

Mitme php versiooni kasutamine

Kasutada saab ka korraga nii php4'ja kui php5't näiteks on meil installitud php5 ja php4 cgi versioonid

/usr/bin/php-cgi
/usr/bin/php5-cgi

Suexec abil veebide kasutajaõigustesse jagamine

Apache suexec on programm, mis Apache'l olemas alates versioonis 1.2 ja mis annab apache kasutajatele võimaluse käivitada cgi ja ssi programme kasutaja UID-ga. Kahjuks võimaldab see nõnda vaikimisi startida ainult cgi skripte ja mitte Apache mooduleid.

Php käivitamiseks tuleb kirjutada põhimõtteliselt eraldi kiht e wrapper, cgi skript mis omakorda kutsub välja käsurea (cli) php mis siis töötleb e interpreteerib koodifaile.

Suexec tarkvara installeerimine FreeBSD süsteemis

Installeerime apache koos suexec-ga näiteks FreeBSD's

 # cd /usr/ports/www/apache2
 # make  WITH_SUEXEC_MODULES="YES"  install 

Seejärel installeerime php

PHP installeerimisel küsitakse täiendavaid parameetreid. Valida tuleb CGI ja FastCGI tugi. Apache moodulit pole vaja, kui seda ei plaanita täiendavalt paralleelselt kasutada.

Järgneb fastcgi installeerimine:

 # cd /usr/ports/www/mod_fastcgi
 # make install clean

Php CGI wrapperi üle läbi suexeci käima

Tegemist on natuke keerukama ja aeglasema meetodiga aga vaatame seda ,et täpsemalt mõista teooriat.

kontrollime suexec'i parameetreid selliselt:

# suexec -V
 -D AP_DOC_ROOT="/usr/local/www/data"
 -D AP_GID_MIN=1000
 -D AP_HTTPD_USER="www"
 -D AP_LOG_EXEC="/var/log/httpd-suexec.log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=1000
 -D AP_USERDIR_SUFFIX="public_html"

Nagu näha, soovib suexec, et kõik skriptid, mida tema abil käivitatakse, asuksid kataloogis /usr/local/www/data Ei hakka DOC_ROOT muutma ja loome testi sinna.

Apache konfiguratsioon

Serveris on kaks veebi http://www.nimi.ee ja http://test.nimi.ee

Esimene peab toimima kasutaja katse õigustes ja teine katse3

Muudame httpd.conf, vajadusel lisame:

LoadModule suexec_module libexec/apache2/mod_suexec.so
LoadModule fastcgi_module     libexec/apache2/mod_fastcgi.so

Tekitame virtualhostid httpd.conf faili

<VirtualHost *:80>
 SuexecUserGroup katse katse
 DocumentRoot /usr/local/www/data/katse
 ServerName www.nimi.ee

ScriptAlias /php-fastcgi/ /usr/local/www/data/katse/cgi
AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fastcgi/php5-fcgi

</VirtualHost>

<VirtualHost *:80>
 SuexecUserGroup katse3 katse3
 DocumentRoot /usr/local/www/data/katse3/cgi-bin
 ServerName test.nimi.ee

ScriptAlias /php-fastcgi/ /usr/local/www/data/katse3/cgi
AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fastcgi/php5-fcgi

</VirtualHost>

Loome kaustad cgi skriptidele

mkdir /usr/local/www/data/katse/cgi-bin
mkdir /usr/local/www/data/katse3/cgi-bin

wrapper

Skript ise millele suunatakse .php laiendiga failid on järgnev

#!/bin/sh
PHPRC="/usr/local/etc/php.ini"
export PHPRC
exec /usr/local/bin/php-cgi

Loome selle faili kasutajate katse ja katse 3 alla

/usr/local/www/data/katse/cgi/php5-fcgi
/usr/local/www/data/katse3/cgi/php5-fcgi

Muudame mõlema faili kasutajaõigusi chown käsuga:

chown katse:katse /usr/local/www/data/katse/cgi-bin/php5-fcgi
chown katse3:katse3 /usr/local/www/data/katse3/cgi-bin/php5-fcgi

Kasutaja õiguste toimimise testimine

Testimiseks saab kasutada järgmist php skripti

 <?php
 system("id");
 php?>

www.nimi.ee skripti vaadates

uid=1004(katse) gid=1004(katse) groups=1004(katse) 

test.nimi.ee

uid=1009(katse3) gid=1009(katse3) groups=1009(katse3)

Lingid