Apache 2.4 RequestHeader enquanto proxy reverso com ProxyPass

2

Estou usando o Ubuntu 14.04 e tenho vários VirtualHosts Apache HTTP escutando na porta 80. Um site é o proxy reverso para escutar aplicativos em localhost. O Apache tem a autenticação Básica configurada para a localização raiz no site.

Aqui está a configuração do apache:

<VirtualHost *:80>
        DocumentRoot /home/korisnik/site
        Alias /static /home/korisnik/site/static
        <Directory /home/korisnik/site/static>
          Require all granted
        </Directory>

        ProxyPass /static !
        ProxyPass / http://127.0.0.1:9002/
        ProxyPassReverse / http://127.0.0.1:9002/

        RequestHeader set X-Proxy-USER %{REMOTE_USER}e  #
        RequestHeader set X-Proxy-SECURE-USER %{REMOTE_USER}s
        RequestHeader set X-Foo "Bar"

        <Location />
          AuthType Basic
          AuthName "Authentication Required"
          AuthUserFile "/home/korisnik/htpasswd"
          Require valid-user
        </Location>
</VirtualHost>

Meu objetivo é passar o nome de usuário do usuário autenticado para o aplicativo backend via variável ENV, e isso funcionou em um servidor que tinha módulo SSL ativado no Apache, enquanto em outro servidor a mesma configuração deu a variável ENV HTTP_X_PROXY_REMOTE_USER definida como null. A única diferença entre os servidores foi ativada no módulo SSL.

A documentação ( link ) diz que

RequestHeader set X-VARNAME %{VARNAME}e

deve ser usado em nonSSL, enquanto isso em sites que executam SSL

RequestHeader set X-VARNAME %{VARNAME}s

Aqui está o script php que uso para descartar cabeçalhos:

<?php
        print "REMOTE_USER: ".$_SERVER['REMOTE_USER']."\n";
        print "HTTP_X_PROXY_USER: ".$_SERVER['HTTP_X_PROXY_USER']."\n";
        print "HTTP_X_PROXY_SECURE_USER: ".$_SERVER['HTTP_X_PROXY_SECURE_USER']."\n";
        print "HTTP_X_FOO: ".$_SERVER['HTTP_X_FOO']."\n";
?>

Descobri que, embora o SSL esteja desativado, nenhuma dessas diretivas funciona. Quando o SSL está ativado, a segunda diretiva funciona sem qualquer outra alteração, como ativar o SSL nesse site ou ativar o SSL em qualquer outro site.

Cabeçalhos com Apache2 mod_ssl habilitado e solicitação passando por ProxyPass

REMOTE_USER: 
HTTP_X_PROXY_USER: (null)
HTTP_X_PROXY_SECURE_USER: korisnik
HTTP_X_FOO: Bar

Cabeçalhos com o mod_ssl do Apache2 habilitado e pedido direto para o arquivo php, sem ProxyPass

REMOTE_USER: korisnik
HTTP_X_PROXY_USER: (null)
HTTP_X_PROXY_SECURE_USER: korisnik
HTTP_X_FOO: Bar

Cabeçalhos com o Apache2 mod_ssl desativado e pedido passando por ProxyPass

REMOTE_USER: 
HTTP_X_PROXY_USER: (null)
HTTP_X_PROXY_SECURE_USER: (null)
HTTP_X_FOO: Bar

Cabeçalhos com o Apache2 mod_ssl desativado e requisitado diretamente para o arquivo php, sem ProxyPass

REMOTE_USER: korisnik
HTTP_X_PROXY_USER: (null)
HTTP_X_PROXY_SECURE_USER: (null)
HTTP_X_FOO: Bar

Estou faltando alguma coisa, ou o Apache está se recusando a configurar o RequestHeader REMOTE_USER para conexões por trás da diretiva Proxy enquanto o módulo SSL está desativado?

    
por svakak 22.09.2014 / 19:58

1 resposta

2

O problema parece ser que o usuário remoto não está disponível via "%{REMOTE_USER}e" durante a fase do processamento da URL que a diretiva Header é avaliada. De acordo com a documentação do RewriteRule:

For instance, to rewrite according to the REMOTE_USER variable from within the per-server context (httpd.conf file) you must use %{LA-U:REMOTE_USER} - this variable is set by the authorization phases, which come after the URL translation phase (during which mod_rewrite operates).

Eu presumo que ele falha com a diretiva de cabeçalho por razões semelhantes. Eu não sei porque de repente ele se torna disponível sob SSL via "%{REMOTE_USER}s" , mas novamente presumo que seja porque o usuário remoto é definido durante uma fase anterior quando a comunicação é sobre SSL.

No entanto, tenho uma solução para o seu problema. Você pode usar um RewriteRule para fazer a previsão de acordo com a documentação para obter o usuário remoto e, em seguida, definir um cabeçalho de acordo.

RewriteEngine On
RewriteRule ^ - [E=MY_REMOTE_USER:%{LA-U:REMOTE_USER}]
RequestHeader set X-Proxy-USER %{MY_REMOTE_USER}e
    
por 27.09.2016 / 10:33