2013-03-17 14 views
9

Vedo molti sul web riferendosi all'uso di ProxyPreserveHost On per assicurarsi che un back-end proxy riceve il nome host del chiamante originale. Sto usando questo per rafforzare la sicurezza della mia applicazione web (Java, Tomcat), mentre sarebbe anche bello se i miei registri mostrassero dove sono effettivamente gli utenti. I miei log Tomcat mostrano ora questo – abbastanza inutile:ProxyPreserveHost sembra fare poco per me

127.0.0.1 - - [17/Mar/2013:06:32:13 +0100] "GET /webapp/frontend/app/partials/welcome.html HTTP/1.1" 200 54 

Questa è la mia configurazione che non chiaramente funziona come previsto:

"/ etc/apache2/sites-enabled/000-default"

<VirtualHost *:80> 
ProxyPreserveHost On 
ProxyPass /webapp http://localhost:8080/webapp 
ProxyPassReverse /webapp http://localhost:8080/webapp 
RewriteEngine On 
RewriteRule ^/$   /webapp/frontend/app/ [proxy] 
RewriteRule ^/webapp/$  /webapp/frontend/app/ [redirect] 
RewriteRule ^/webapp/app/$ /webapp/frontend/app/ [redirect] 

(da qui in roba di default che era in 000-default)

moduli abilitati:

sudo a2enmod proxy 
sudo a2enmod proxy_http 
sudo a2enmod rewrite 

Questo è Ubuntu 12.10 che esegue Apache HTTPD 2.2.22.

Il vostro aiuto sarebbe molto apprezzato.

risposta

10

Si presume che il log di accesso contenga ancora 127.0.0.1 nel campo client. Questo non è influenzato da ProxyPreserveHost; questo è l'indirizzo IP dell'endpoint di rete connesso ad Apache. Per le connessioni con proxy da un altro server, questo sarà sempre localhost.

Inoltre, ProxyPreserveHost riguarda la conservazione dell'intestazione Host inviata dal client, non quella relativa alla conservazione dell'IP originale del client. In altre parole, si tratta di informazioni che vanno nella direzione sbagliata per i tuoi scopi; sta preservando il nome del tuo server come inviato dal client, non dall'IP del client.

Penso che la tua domanda sia la stessa di this question. Vorrei aggiungere la nota aggiuntiva che è possibile registrare l'intestazione X-Forwarded-For nei registri utilizzando %{X-Forwarded-For}i nella configurazione CustomLog.

+0

Grazie. La domanda a cui fai riferimento ha una risposta votata che rimanda a un articolo al di fuori di Stack Overflow che in realtà si riferisce a 'ProxyPreserveHost' come una soluzione" quindi lo sviluppatore non deve finire usando l'intestazione 'X-Forwarded-For'" . Sono uno sviluppatore del genere, e mi sono sentito male dovendo usare qualcosa di non standard. Detto questo, ho cercato su google "X-Forwarded-For" e anche Wikipedia si riferisce ad esso come standard _de facto, che è molto meglio di quello che inizialmente pensavo fosse (qualcosa di specifico di Apache HTTPD che rende la mia applicazione Web specifica per Apache HTTPD) . –

+0

Penso che il blog post collegato sia scritto in modo confuso. Dice che la direttiva può essere utilizzata per preservare "l'host remoto non l'ip remoto". In circostanze normali, questi sarebbero due nomi diversi (tramite DNS) per la stessa cosa, ma penso che "l'host remoto" in realtà significhi "l'intestazione host inviata dal client remoto" piuttosto che il nome host del client remoto. Ma in effetti, come scritto, è piuttosto confuso. – rra

+0

Sono andato avanti e implementato un controllo sul valore restituito di 'HttpServletRequest.getHeader (" X-Forwarded-For ")' in aggiunta al mio controllo esistente su 'WebAuthenticationDetails.getRemoteAddress()'. La mia applicazione è ora consapevole di 'X-Forwarded-For'. Non è quello che speravo inizialmente, ma comunque lavorando. Grazie. –