Mysql
 sql >> Database >  >> RDS >> Mysql

Limitare l'esecuzione di PHP?

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.

  1. uid/gid diversi
  2. autorizzazioni di sistema
  3. Framworks come SELinux, AppArmor e simili
  4. 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).