PHP käivitamine kasutaja õigustes
Sisukord
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)