Devo impersonare PHP tramite FastCGI?


16

Sto installando l'ultima versione di PHP su IIS 7.5 tramite FastCGI e tutte le istruzioni indicano che FastCGI dovrebbe impersonare il client chiamante impostando

 fastcgi.impersonate = 1

Se il mio sito Web avrà questa configurazione

  • pool di applicazioni dedicato
  • identità del pool di applicazioni di ApplicationPoolIdentity
  • solo autenticazione anonima (come IUSR)

perché voglio impersonare?

Vengo da uno sfondo ASP.NET, in cui lo IUSR ottiene autorizzazioni di sola lettura e l'identità del pool di applicazioni ottiene eventuali autorizzazioni di scrittura. Concedere l'accesso in scrittura allo IUSR di solito apre le porte alle vulnerabilità di WebDAV. Quindi esito a far funzionare PHP come IUSR.

Non riesco a trovare molte persone che fanno questa domanda ( 1 | 2 ), quindi penso che mi debba mancare qualcosa. Qualcuno può chiarire questo per me?

Risposte:


17

13 mesi dopo, volevo rivisitare la mia domanda. In quel momento ho trasferito una mezza dozzina di siti Web da IIS 6 a IIS 7.5 e li ho configurati con il mio metodo preferito. Tutto quello che posso dire è che i siti Web funzionano, non hanno avuto problemi di sicurezza (non che si tratti di siti popolari) e, a mio avviso, l'installazione è più sicura di quanto raccomandato da learn.iis.net.

Per i posteri, ecco le impostazioni pertinenti. In PHP INI:

cgi.force_redirect = 0
cgi.fix_pathinfo=1
fastcgi.impersonate = 0

In IIS:

  • Pool di applicazioni> Identità> ApplicationPoolIdentity
  • Sito Web> Autenticazione> Autenticazione anonima> Utente specifico: IUSR

Le autorizzazioni NTFS e dove applicarle:

  • IUSR - Concedi lettura, nega scrittura
    • La directory principale del sito Web IIS. Ad esempio, in un progetto Zend Framework questa sarebbe la directory / public.
    • Se l'applicazione carica i file e li salva in una directory pubblica, è necessario applicare questa autorizzazione alla directory di caricamento temporanea. Questo perché move_uploaded_fileconserverà le autorizzazioni della directory di upload. Questo è il più grande svantaggio di questa configurazione di autorizzazioni che ho trovato.
  • ApplicationPoolIdentity ( IIS AppPool\<<YourApplicationPoolName>>) - Concedi lettura ed elenco
    • La radice della tua applicazione PHP. Ad esempio, in un progetto Zend Framework questo sarebbe l'intero progetto.
    • Eventuali librerie esterne (Zend, Doctrine, ecc.) Incluse dall'applicazione che non si trovano nella cartella dell'applicazione.
  • ApplicationPoolIdentity - Modifica concessione
    • Qualsiasi posizione in cui l'applicazione scriverà, come upload_tmp_dir, session.save_pathe error_log.
    • A volte ho bisogno di aggiungere questa autorizzazione alla radice dell'applicazione PHP nel mio ambiente di sviluppo per supportare cose come la generazione automatica di proxy di Doctrine .
  • ApplicationPoolIdentity - Elenco concessioni
    • Se l'applicazione si trova in una directory virtuale, sarà necessario aggiungere questa autorizzazione alla radice del sito Web. Ciò consente all'applicazione di leggere il proprio web.config principale. Ad esempio, se la radice dell'applicazione è http://example.com/MyPHPApp , impostare questa autorizzazione sulla directory web example.com. In particolare, devi solo applicare a "Questa cartella e file", "solo all'interno di questo contenitore".

Spero che questo aiuti chiunque altro a decidere che le istruzioni di learn.iis.net non sono l'ideale.


Grazie mille per questo! Aggiunto uno script batch per automatizzare. Funziona bene per la mia installazione.
Sire, il

È necessario abilitare l'impersanation e impostare Autenticazione> Accesso anonimo> Modifica su Identità pool di applicazioni. Quindi impostare solo le autorizzazioni del file system utilizzando IIS APPPOOL \ <Nome pool di applicazioni>.
Monstieur,

@Kurian Sì, questo approccio è più semplice e secondo le istruzioni di learn.iis.net. Offre altri vantaggi? Ho scelto il sistema descritto sopra perché separa le autorizzazioni dell'applicazione da quelle dell'utente Web.
WimpyProgrammer,

Impedisce a più applicazioni di accedere ai dati reciproci. Senza ApplicationPoolIdentity se viene violata un'applicazione, può essere utilizzata per hackerare altre applicazioni su quel server. In secondo luogo, consente di trattare FastCGI come ASP.NET per quanto riguarda le autorizzazioni.
Monstieur,

Sono d'accordo con la prima parte. ApplicationPoolIdentity è ottimo per le applicazioni sandboxing, motivo per cui lo uso anche sopra. Per il tuo secondo punto, immagino che gestiamo i nostri siti ASP.NET in modo diverso. Quando installo un sito ASP.NET, utilizzo IUSR per l'utente anonimo e ApplicationPoolIdentity per il pool di applicazioni e le autorizzazioni sembrano molto simili a quelle descritte in precedenza.
WimpyProgrammer,

1

Vedi: http://www.php.net/manual/en/install.windows.iis6.php

Rappresentazione e accesso al file system

Si consiglia di abilitare la rappresentazione FastCGI in PHP quando si utilizza IIS. Questo è controllato dalla direttiva fastcgi.impersonate nel file php.ini. Quando la rappresentazione è abilitata, PHP eseguirà tutte le operazioni del file system per conto dell'account utente che è stato determinato dall'autenticazione IIS.

Per documentazione, consente semplicemente a fastcgi di agire per conto del client utilizzando tutte le stesse autorizzazioni (nel tuo caso essere quello che sembra l'account IUSR). In altre parole, per eseguire tutte le azioni normalmente consentite alle proprie credenziali del cliente (o anon). Ne più ne meno. Senza questo set, immagino che il fastcgi povero rimarrebbe paralizzato.


Stando così le cose nella sua situazione, accederà in base all'account dell'ospite o qualcosa del genere.
Matt,

Grazie per le risposte Matt e Bob! Stavo iniziando a pensare che nessuno avrebbe preso una pugnalata.
WimpyProgrammer,

2
Quando PHP viene eseguito senza rappresentazione, viene eseguito come identità del pool di applicazioni. Ciò mi consente di concedere i diritti di sola lettura all'utente anon e di dare accesso in scrittura all'identità dell'app. Quindi PHP non è indifeso senza imitazione. Ho creato un test che potrebbe chiarire. IUSR (anon): lettura concessa, scrittura negata. identità app: concesso in lettura / scrittura. Con la rappresentazione disattivata, posso ancora scrivere file tramite codice. Con la rappresentazione attivata, non posso. Ma non voglio che lo IUSR abbia accesso in scrittura. Penso che farò alcune domande in altri forum e tornerò qui quando ne saprò di più.
WimpyProgrammer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.