Proxy reverso separado por usuário no apache2.4

1

Do guia mod_proxy configurei o proxy reverso com autenticação de usuário.

# Set reverse proxy
ProxyPass "/" "http://localhost:10080/"
ProxyPassReverse "/" "http://localhost:10080/"
ProxyRequests On
ProxyVia On

<Proxy *>
    Order deny,allow
    Allow from all
    AuthType Basic
    AuthName "Password Required"
    AuthUserFile /home/secure/.passwords
    Require user ivy
</Proxy>

Isso funciona da seguinte maneira: Acessos do usuário para o servidor - > Servidor pede nome de usuário / senha - > Usuário insere suas credenciais - > Se as credenciais estiverem corretas para o hera do usuário, o proxy reverso funcionará para a porta 10080 no host local.

Todos os usuários são adicionados com o htpasswd. Eu corro o apache2.4 pelo Linux.

O que preciso fazer: Eu quero permitir que usuários diferentes usem o proxy. No número do servidor de túneis reversos estão abertos com as portas 10080, 10081, 10082 e assim por diante ... Eu quero atribuir cada usuário único para usar a porta do proxy separado. Ou seja:

  • ivy - > 10080
  • joe - > 10081
  • doe - > 10082

Se eu escrever Require user ivy joe doe , redireciono todos os usuários para a porta única 10080.

Parece que o truque está em algum lugar nas linhas ProxyPass "/" "http://localhost:10080/" e <Proxy *> . Ou onde?

Atualização: Seguindo a sugestão de Jenny tentou:

LoadModule rewrite_module modules/mod_rewrite.so
<IfModule mod_rewrite.c>
    RewriteEngine On
    #RewriteCond %{REMOTE_USER} ivy  # Unconditional redirect for testing.
    RewriteRule ^/(.*)$ "http://localhost:10080/test.html" [R=301,L]
</IfModule>

Tentei isso com o Proxy ativado (o proxy é mais strong que o Rewrite) e o Proxy desabilitado (o Index.html local é exibido).

Tentei usar sinalizadores [R,L] , [L,R] , [L,R=301] - sem sorte.

Tentou adicionar em <Directory "/var/www/html"> e em <Proxy *> :

RewriteEngine On
RewriteRule ^/(.*)$ "http://localhost:10080/test.html" [R=301,L]

Tentei isso com o Proxy ativado (o proxy é mais strong que o Rewrite) e o Proxy desabilitado (o Index.html local é exibido).

Deep dig encontrou este truque:

RedirectMatch ^/.*$ /test.html

Isso funciona, mas isso não é condicional: ou seja, ainda não consigo atribuir redirecionamentos diferentes por usuário.

Update2: Tentei solução de Cedric Knight sem sorte também. Decidi desistir do Apache, mudei para o nginx. Funciona bem. A configuração do servidor para proxy reverso separado por usuário é:

server {
    listen       80 default_server;
    listen [::]:80  default_server ipv6only=on;
    set $auth_status 100;
    server_name  localhost;
    root         /usr/share/nginx/html;

    location / {
        try_files $uri $uri/ =404;
        auth_basic "Restricted content";
        auth_basic_user_file "/home/secure/.passwords";
        auth_request_set $auth_status $upstream_status;

        if ($remote_user = "ivy") {
            proxy_pass http://localhost:10080;
            break;  # break is essential since proxy_pass in 'if' isn't allowed.
        }
        if ($remote_user = "joe") {
            proxy_pass http://localhost:10081;
            break;
        }
    }
}

Esta é uma solução de força bruta. Na próxima etapa, adicionarei a leitura do usuário do mapa: port do arquivo.

    
por Ivy Growing 19.08.2017 / 15:10

1 resposta

0

Sim, a ideia de Jenny faz sentido. Não use a diretiva ProxyPass, apenas use mod_proxy via mod_rewrite usando o sinalizador P . você pode, na próxima etapa, definir usuários adicionais com RewriteMap .

<IfModule mod_proxy.c>
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REMOTE_USER} ivy
    RewriteRule ^/(.*)$ "http://localhost:10080/$1" [P]
    RewriteCond %{REMOTE_USER} joe
    RewriteRule ^/(.*)$ "http://localhost:10081/$1" [P]
    #etc.
    # optional step: set up RewriteMap
    RewriteMap user-to-port txt:/home/proxy-ports.txt
    # contains one entry per line 'doe 10082' etc
    RewriteCond %{REMOTE_USER} ^(.*)$
    RewriteRule ^/(.*)$ "http://localhost:${user-to-port:%1|10080}/$1" [P]
    # 10080 is default port for other users
</IfModule>
</IfModule>

E se você se livrar da seção <Proxy> , separe o desafio de autenticação de acordo, usando as diretivas do Apache 2.4:

<Location "/">
    AuthType Basic
    AuthName "Password Required"
    AuthUserFile /home/secure/.passwords
    <RequireAll>
        Require valid-user
    </RequireAll>
</Location>

Não vejo a necessidade de ProxyVia em uma situação de proxy reverso; embora você possa querer registrar portas locais e remotas. Eu não testei nenhum dos itens acima, apenas queria sugerir uma direção para o que você quer fazer.

    
por 21.08.2017 / 12:37