Es gibt mehrere Ebenen, die Sie schützen müssen.
Einige der Hoster falsch Verlassen Sie sich auf PHP "Protections" wie open_basedir, safe_mode (ältere PHPs), disable_functions etc.
Sogar PHP betrachtet sie NICHT als Sicherheitsfunktionen - http://php.net/security- note.php
Diese können mit jedem Exploit für PHP deaktiviert werden und dann ist das ganze System dem Untergang geweiht, nicht mach das.
Wie es gemacht werden sollte
unten
- Separater Betriebssystem-/Systembenutzer für jede gehostete Site
- Korrekte Berechtigungen (einer kann die Seite des anderen nicht anzeigen/bearbeiten) - stellen Sie außerdem sicher, dass Unterverzeichnisse die richtigen Berechtigungen haben, da sie ähnlich sein werden
- Separate Session-Dateien (VIELE Webhostings legen Session-Dateien jeder PHP-gehosteten Seite in das gleiche Verzeichnis, das ist schlecht, schlecht, schlecht!
Apache hat dafür endlich ein eigenes Modul bekommen - Apache MPM-ITK .
Lange Rede kurzer Sinn: Stellen Sie sich das so vor, als würden Sie dem Benutzer eine Shell auf der Maschine geben (unter seiner eigenen UID) - er kann nichts mit den anderen gehosteten Sites machen.
- andere uid/gid
- Systemberechtigungen
- Frameworks wie SELinux, AppArmor und ähnliche
- Grsecurity, wenn Sie Hardcore sein wollen, aber das System wird schwieriger zu warten sein.
nach oben?
Sie können mehr Hardcore bekommen. Das Beste, was ich gesehen habe, ist eine gemeinsam genutzte Bibliothek für Apache (oder was auch immer Sie verwenden) - die verwendet wird, wenn Apache mit LD_PRELOAD
gestartet wird und es implementiert alle potenziell schädlichen Systemaufrufe wie system()
, execve()
und im Grunde jeder andere Anruf, den Sie schlecht finden.
Ich habe noch keine gute Implementierung davon gesehen (außer irgendwo benutzerdefinierte) - korrigiere mich, wenn ich falsch liege.
Stellen Sie sicher, dass Sie hierfür eine Whitelist implementieren, z. mail() in PHP führt standardmäßig sendmail aus und das wird nicht mehr funktionieren.
Schlussfolgerung
Fügen Sie klassische disable_functions, open_basedir usw. in die globale php.ini ein, fügen Sie session.save_path zu jedem vhost hinzu - legen Sie Sitzungen in Benutzerverzeichnisse. Stellen Sie sicher, dass Benutzer nichts teilen .
Implementieren Sie die zugrunde liegende Trennung auf Betriebssystemebene korrekt.
Holen Sie sich Hardcore mit grsec und LD_PRELOAD lib Hooking-Systemaufrufen.
Trennung, Trennung, Trennung ... bald werden Systeme wie Docker LXC-basierte Container bereitstellen, um Benutzer auf Kernel-Ebene zu trennen, aber es ist noch nicht ganz produktionsreif (imho).