2011-08-19 15 views
10

Sto cercando un modo per utilizzare uno script PHP per controllare l'accesso alle risorse in Apache. Voglio avere il controllo di accesso che non dipende dalla risorsa di destinazione; cioè funzionerà per html, file, altri script e programmi cgi, proprio come farebbe una direttiva "Consenti da" o "Nega da" - eccetto l'uso della logica personalizzata.Come utilizzare lo script PHP per il controllo degli accessi in Apache

Ho guardato diversi modi per cercare di gestire questo:

  1. Usare un modulo di Apache come mod_auth_script (ok ma questo modulo è vecchio e presumo non scala bene)
  2. direttiva
  3. Usa FastCGI FastCgiAccessChecker
  4. creare il mio modulo Apache per invocare php e fare tutto ciò che ho bisogno

di questi 2 # sembrava più promettente, e anche più portatile data la popolarità di FastCG IO. Quindi, sono riuscito a sostituire il solito modulo linux di php e far funzionare php tramite fastcgi. E 'stato più difficile di quanto su Windows, ma ha a lavorare alla fine come un server esterno, vale a dire utilizzando la direttiva di Apache

FastCGIExternalServer /var/www/html/thing -host 192.168.0.11:9000

e partendo php daemon

php-cgi -q -b 192.168.0.11:9000 &

Il problema è venuto nel tentativo di trovare un modo per richiamare uno script PHP usando FastCgiAccessChecker.

Ho provato vari modi per provare a passare il nome dello script che voglio eseguire cambiando il nome del file nelle direttive FastCGIExternalServer e/o FastCgiAccessChecker - non funziona. Ho anche provato a partire php-cgi con un identificatore di sceneggiatura, vale a dire

php-cgi -q -b 192.168.0.11:9000 -f /var/www/html/thing/access.php &

Niente funziona. Posso dire apache riconosce le mie direttive, in qualche modo, perché quando includo FastCgiAccessChecker quindi visita una pagina php, le modifiche del tipo di contenuto in text/plain e perdo i primi ~ 8000 byte di contenuto dalla pagina pubblicata se è uno script (no idea perché). Ma non chiama lo script PHP che voglio eseguire.

Per quanto posso immaginare, ciò che sta accadendo è che FastCgiAccessChecker presuppone che il server FastCgi specificato sia compilato appositamente per fungere da controllo degli accessi. Non c'è modo di dire al server fastcgi (PHP nel mio caso) quale script eseguire per fare il controllo dell'accesso.

Ho cercato nel web e per quanto posso dire nessuno ha mai provato a utilizzare uno script PHP per questo prima, o nessuno ha scritto su di esso.

Quindi la mia domanda: cosa dovrei fare? riesco a vedere un paio di possibilità:

1) mi manca qualcosa, e c'è qualche modo magico per fare FastCgiAccessChecker fare quello che voglio: eseguire uno script PHP per il controllo di controllo di accesso apache

2) Scrivo il mio server FastCGI in c e incorpora PHP, quindi posso specificare lo script PHP che voglio eseguire (ho passato alcuni minuti a guardarlo, sembra complicato e spaventoso, e non lavoro in c dal 1995)

3) Mi arrendo su FastCGI e scrivo un modulo apache per chiamare direttamente il mio script PHP per controllare l'accesso. (Sembra anche complicato e questa tecnica richiederebbe la creazione di un nuovo processo per ogni richiesta di esecuzione PHP.)

Qualcuno ha qualche consiglio, sia su come ottenere FastCGI per fare ciò che voglio, sia su (ragionevolmente) semplice alternativa a FastCGI?

Grazie per tutto ciò che potete suggerire

risposta

8

Il mio approccio a questo tipo di situazioni è quello di utilizzare in combinazione con mod_xsendfilemod_rewrite. Questi potrebbero non apparire come prima cosa, ma se:

  1. Utilizzare le regole mod_rewrite per creare un front controller (un singolo script PHP che gestisce tutte le richieste in arrivo).
  2. Determinare quale file viene richiesto guardando il contenuto di $ _SERVER (probabilmente $ _SERVER ['PATH_INFO']).
  3. Inserisci qui il tuo controllo di accesso/livello di sicurezza.
  4. Utilizzare mod_xsendfile per inviare il contenuto del file, se la sicurezza passa.

È possibile implementare sostanzialmente qualsiasi sistema di sicurezza desiderato in questo modo.

mod_xsendfile essenzialmente invia semplicemente un file esattamente nello stesso modo in cui Apache avrebbe eseguito l'accesso diretto al file. È stabile e funziona alla grande in ogni situazione che ho gettato. Dovrebbe anche "funzionare" senza un carico enorme di configurazione, con cui sembra che tu stia lottando un po '.

+0

Mi piace questa soluzione! – Achronos

0

probabilmente avrete bisogno di guardare in shell_exec() e system(). Questi ti permetteranno di eseguire i cmd della shell di Linux fino a quando avrai abilitato il tuo cfg. Inoltre, per FastCGI ti consiglio di installare php5-fpm. Abbastanza facile da fare # apt-get install php5-fpm

+0

Ciao Timothy, grazie per la risposta. Quello di cui ho bisogno è un modo per dire ad Apache di usare uno script PHP per decidere se consentire l'accesso a una pagina. FastCGI funziona davvero bene per me, è solo che non c'è modo che io possa vedere per ottenere la direttiva 'FastCGIAccessChecker' per funzionare con PHP. – Achronos

0

Attualmente sto lavorando su un problema simile - nella mia situazione avevo bisogno di impostare l'utente remoto (autenticato) in PHP. In parole semplici, si spinge il cookie di sessione e il nome utente autenticato in memcache (dai un'occhiata alla versione couchdb per un sistema molto scalabile) dal tuo script PHP, quindi la mod imposta l'utente in Apache e può applicare le informazioni utilizzando l'accesso standard di Apache regole di controllo.

Ciò evita il sovraccarico dell'avvio di processi aggiuntivi/l'inserimento di tutti gli accessi nel codice PHP.

vedere la domanda e le risposte alle Populating remote user in apache log files from PHP session

1

Grazie per le risposte! Mi piace molto la tecnica di ezzatron, che dovrebbe funzionare con qualsiasi Apache senza strumenti personalizzati necessari.

Come accade ho finito per andare con la mia opzione # 3 prima di leggere una qualsiasi delle risposte:

ho scritto un modulo di Apache per fare il lavoro. È in grado di gestire il controllo degli accessi a qualsiasi apache di documenti che può essere utilizzato, utilizzando un sottorequest, quindi funziona con qualsiasi linguaggio di script o programma CGI. Per una tipica configurazione PHP che utilizza php_module o fastcgi, questa scala si adatta abbastanza bene perché non è necessario alcun processo aggiuntivo.

Si scopre che l'API del modulo di Apache non è troppo difficile da usare, e suppongo che C sia come andare in bicicletta - non si dimentica mai davvero come.

Problemi correlati