PHP ja shelli scriptide jooksutamine kasutaja õigustes

Avatud kood on lahe! On mingi mure, võtad koodi ette ja lahendad probleemi.

Sedapuhku oli probleemiks jagatud keskkonnas php kaudu shelli scriptide jooksutamise turvalisus (Ps. antud probleem ei puuduta php turvalisust sellistes keskkondades kus kasutajaks on ainult üks inimene/klient apache serveri kohta) – või täpsemalt – nende scriptide õiguste piiramine.

Üks kasutaja kõigi kasutajate jaoks
Selline on üldine veebiserveri kasutamise mudel. Veebiserver jookseb näiteks apache õigustes ning seega on apache õigustes ka kõik protsessid mis tekitatakse. PHP ise annab võimaluse turvaliseks režiimiks kui võimaldab ka piirata käivitatavate scriptide / avatavate failide asukohta kataloogipuus. Kui esimese lahenduse probleemiks on n.ö. ebaturvalisus ise ning fakt, et php 6ndas versioonis see võimalus kaob, siis teise lahenduse puhul tekib probleem shelli scriptidega. Nimelt kui php enda käsude puhul piirangud töötavad, siis shelli scriptideni see turvalisus enam ulatu.

Olgu määratud open_basedir = /home/esimenekasutaja

fopen('/home/teinekasutaja/veeb/salajane.txt', 'r');

annab vea, küll aga töötab

exec('more /home/teinekasutaja/veeb/salajane.txt');

Teise käsu probleem seisnebki selles, et kõik shelli käsud jooksutatakse veebiserveri enda õigustes, ning kuhu veebiserver ligi saab, sinna saavad ligi ka kõik need, kes suudavad veebiserveri õigustes käske käivitada (s.t. php koodi jooksutada).

Olemasolevad ahendused
Neid on mitmeid. Näiteks suexec, suphp, fast-cgi… Tuleb tõdeda, et sai otsast neid proovima hakatud ja jäin hätta. Kas ei suutnud luua õigete õigustega faile või oli conf vigane.. dokumentatsioon nende kõigi kohta on minu meelest pisut puudulik. Üks versioon mis tööle sai joostud, olid mod_php’ga võrreldes ligi 10x aeglasem.
Pealegi on cgi ohtra kasutamise juures probleem jagatud mälu kasutamises (cgi lahenduste korral ei jooksutata kasutaja õigustes mitte ainult shelli scripte vaid ka kõiki php scripte, mis osutubki tegelikult probleemiks, eriti suurema koormuse korral).

Kui kellelgi on häid cgi-kasutamise-kogemusi jagada, võiks seda kommentaarides teha.

Ise PHP mootori kallale
Kui mõelda loogiliselt, ei tohiks ju muud lahendused keerulised olla. Ja selgub, et ei olegi. Tunnike progemist (millest enamuse aja võttis õige koha otsimine ja pakihalduri ärapetmine) ja oma alternatiivne lahendus on täiesti teostatav ja töötav.

Idee ise on lihtne – kõigi kasutajate veebilehed seadistatakse eraldi virtualhostidena ning neil on defineeritud open_basedir (see seab php poolelt juba piisavalt tugeva turvalisuse).
Iga veebilehe juurkataloogis tuleb teha näiteks bin/ kataloog koos scriptiga mis võtab parameetrid ning sudo käsuga käivitab kastaja käsu vastavalt seadistatud omaniku õigustes. Sudo tuleb muidugi ka vastavalt ära seadistada ning script ei tohi olla kasutajale endale muudetav.

Järgmine samm eeldab php enda mootori muutmist – kõik shelli suunatavad käsud muudetakse viisil, et mitte ei käivitata käsu ennast, vaid ülalpoolmainitud shelli script mille parammetriteks kasutaja poolt määratud käsk.

Jõudlus
Testitud ab2 programmiga, 1000 päringut (kümme samaaegset). Script teeb exec(‘whoami’). Tulemused:

originaalkood:

Requests per second:    263.27 [#/sec] (mean)
Time per request:       37.984 [ms] (mean)
Time per request:       3.798 [ms] (mean, across all concurrent requests)

muudetud php mootor koos scripti käivitamisega mis ei tee sudo:

Requests per second:    189.35 [#/sec] (mean)
Time per request:       52.811 [ms] (mean)
Time per request:       5.281 [ms] (mean, across all concurrent requests)

muudetud php mootor koos scriptiga mis teeb sudo kasutaja õigustesse

Requests per second:    91.68 [#/sec] (mean)
Time per request:       109.079 [ms] (mean)
Time per request:       10.908 [ms] (mean, across all concurrent requests)

Nagu näha, on lahendus küll praktiliselt kolm korda aeglasem, ent posiitiivne on see, et ülejäänud php kood saab ikka joosta mod_php peal.

Koodimuudatuse ning scripti teen ka millalgi lähitulevikus avalikuks, kui rohkem testida olen jõudnud ning huvilisi leidub.

Advertisements

Lisa kommentaar

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Muuda )

Twitter picture

You are commenting using your Twitter account. Log Out / Muuda )

Facebook photo

You are commenting using your Facebook account. Log Out / Muuda )

Google+ photo

You are commenting using your Google+ account. Log Out / Muuda )

Connecting to %s

%d bloggers like this: