Ci sono diversi livelli che devi proteggere.
Alcuni degli hoster erroneamente fare affidamento su "protezioni" PHP come open_basedir, safe_mode (precedenti PHP), disable_functions ecc.
Nemmeno PHP le considera funzionalità di sicurezza - http://php.net/security- note.php
Questi possono essere disabilitati con qualsiasi exploit per PHP e quindi l'intero sistema è condannato, non fallo.
Come dovrebbe essere fatto
il fondo
- Utente separato a livello di sistema operativo/di sistema per ogni sito ospitato
- autorizzazioni corrette (una non può essere in grado di visualizzare/modificare la pagina dell'altra) - assicurati anche che le sottodirectory abbiano le autorizzazioni corrette poiché saranno simili
- File di sessione separati (MOLTI webhosting mettono i file di sessione di ogni sito ospitato in PHP nella stessa directory, è brutto male cattivo!
Apache ha finalmente ottenuto il proprio modulo per questo - Apache MPM-ITK .
Per farla breve: immaginalo come daresti all'utente una shell sulla macchina (sotto il proprio uid):non può essere in grado di fare nulla per gli altri siti ospitati.
- uid/gid diversi
- autorizzazioni di sistema
- Framworks come SELinux, AppArmor e simili
- grsecurity se vuoi essere hardcore.. ma il sistema sarà più difficile da mantenere.
salendo?
Puoi diventare più duro. La migliore che ho visto è una libreria condivisa per apache (o qualunque cosa tu usi), che viene utilizzata quando apache viene avviato usando LD_PRELOAD
e implementa tutte le chiamate di sistema potenzialmente dannose come system()
, execve()
e praticamente qualsiasi altra chiamata che trovi male.
Non ho ancora visto una buona implementazione di questo là fuori (a parte quelli personalizzati da qualche parte):correggimi se sbaglio.
Assicurati di implementare una white-list per questo come ad es. mail() in PHP esegue sendmail per impostazione predefinita e non funzionerà più.
conclusione
Aggiungi le classiche disable_functions, open_basedir, ecc. in php.ini globale, aggiungi session.save_path a ogni vhost - inserisci le sessioni nelle directory utente. Assicurati che gli utenti non condividano niente .
Implementare correttamente la separazione a livello di sistema operativo sottostante.
Ottieni l'hardcore con grsec e LD_PRELOAD lib che agganciano le chiamate di sistema.
Separazione, separazione, separazione... abbastanza presto sistemi come Docker forniranno contenitori basati su LXC per separare gli utenti a livello di kernel, ma non è ancora pronto per la produzione (imho).