Der er flere lag, du skal beskytte.
Nogle af hosterne forkert stole på PHP "beskyttelser" som open_basedir, safe_mode (ældre PHP'er), disable_functions osv.
Selv PHP anser dem IKKE for at være sikkerhedsfunktioner - http://php.net/security- note.php
Disse kan deaktiveres med enhver udnyttelse af PHP, og så er hele systemet dømt, ikke gør det.
Sådan skal det gøres
bunden
- Særskilt OS-niveau/systembruger for hvert hostet websted
- korrekte tilladelser (den ene kan ikke være i stand til at se/redigere siden på den anden) - sørg også for, at undermapper har korrekte tilladelser, da de kommer til at ligne hinanden.
- Særskilte sessionsfiler (MANGE webhostings placerer sessionsfiler for hvert PHP-hostet websted i den samme mappe, det er dårligt dårligt dårligt!
Apache fik endelig sit eget modul til dette - Apache MPM-ITK .
Lang historie kort: Forestil dig dette, som du vil give brugeren en shell på maskinen (under hans eget uid) - han kan ikke være i stand til at gøre noget ved de andre hostede websteder.
- forskellige uid/gid
- systemtilladelser
- rammer som SELinux, AppArmor og lignende
- grsikkerhed, hvis du vil være hardcore.. men systemet vil være sværere at vedligeholde.
går op?
Du kan blive mere hard-core. Det bedste, jeg har set, er et delt bibliotek til apache (eller hvad du nu bruger) - som bruges, når apache startes med LD_PRELOAD
og det implementerer alle de potentielt ondsindede systemkald som system()
, execve()
og i princippet ethvert andet opkald, som du finder dårligt.
Jeg har ikke set en god implementering af dette derude endnu (bortset fra brugerdefinerede et eller andet sted) - ret mig, hvis jeg tager fejl.
Sørg for at implementere en hvidliste til dette som f.eks. mail() i PHP udfører sendmail som standard, og det virker ikke længere.
konklusion
Tilføj klassiske disable_functions, open_basedir osv. til globale php.ini, tilføj session.save_path til hver vhost - sæt sessioner i brugermapper. Sørg for, at brugerne ikke deler noget .
Implementer underliggende separation på OS-niveau korrekt.
Få hardcore med grsec og LD_PRELOAD lib hooking systemopkald.
Adskillelse, adskillelse, adskillelse .. snart nok vil systemer som Docker levere LXC-baserede containere til at adskille brugere på kerneniveau, men det er ikke helt produktionsklar endnu (imho).