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

Allikas: Kuutõrvaja
(Teooria, ehk kuidas see ideeliselt toimib)
(Teooria, ehk kuidas see ideeliselt toimib)
143. rida: 143. rida:
 
   
 
   
 
Php sarnaselt käivitamiseks tuleb kirjutada põhimõtteliselt wrapper, cgi skript mis omakorda kutsub välja cli php mis siis interpreteerib koodifaili
 
Php sarnaselt käivitamiseks tuleb kirjutada põhimõtteliselt wrapper, cgi skript mis omakorda kutsub välja cli php mis siis interpreteerib koodifaili
 
===Teooria, ehk kuidas see ideeliselt toimib===
 
 
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'''
 
 
Kõik toimub sellises järjekorras
 
.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.
 
 
====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 abil suexeci üle tööle====
 
 
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
 
 
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
 
 
#!/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
 
 
'''Wrapperita'''
 
 
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
 
  
 
===Testimine===
 
===Testimine===

Redaktsioon: 22. september 2010, kell 19:39

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 saab kasutaja õigused

mis defineeritud virtualhostis. Plussiks on tunduvalt suurem kiirus võrreldes suexeciga.

  • Suexec - suexec on 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 mooduliga.

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 ja 22 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 lisarida

AssignUserId katse katse

või paranoilisemal juhul

<IfModule mpm_itk_module>
 AssignUserId katse katse
</IfModule>

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

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


Mitme PHP versiooni 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.

Suexec

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 mooduleid.

Php sarnaselt käivitamiseks tuleb kirjutada põhimõtteliselt wrapper, cgi skript mis omakorda kutsub välja cli php mis siis interpreteerib koodifaili

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