O que é uma maneira correta de permitir o login em um site do IIS através de um proxy reverso?

4

Eu tenho um proxy reverso nginx e estou tentando criar um site do IIS com login para funcionar por trás dele. Eu encontrei esta pergunta várias vezes, mas cada resposta parece ser diferente, e alguns dos problemas se desviam um pouco do problema que estou tendo.

Com a minha configuração atual, consigo acessar o login, mas estou recebendo um erro 401 e ele continua solicitando credenciais.

Minha configuração atual:

/ etc / nginx / sites-available / default

server {
    listen 80 default;
    server_name _;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name server2.mydomain.com;

    ssl_certificate /usr/local/nginx/conf/mydomain.com.crt;
    ssl_certificate_key /usr/local/nginx/conf/mydomain.com.key;
    ssl_session_cache shared:SSL:10m;

    ssl_session_timeout 5m;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://192.168.0.20:80;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect http:// $scheme://;

    }
}

Minha pergunta é: qual é a maneira correta de funcionar?

Veja o que pesquisei até agora:

Este link , diz que não é possível.

Este link , diz que eu deveria usar keepalive no upstream. Essa pode ser a resposta, mas sempre que eu adiciono um upstream server2.mydomain.com com qualquer configuração nele, o nginx falha ao reiniciar. Tenho certeza que tenho alguma sintaxe incorreta, mas já tentei várias coisas. Eu colocaria tudo que já tentei, mas nem tenho certeza de que essa é a abordagem correta, e já tentei muitas coisas, imaginei que seria mais fácil perguntar à população em geral como isso é feito. / p>

Este link diz que você pode adicionar apenas uma linha proxy_pass_request_headers on; e, de alguma forma, funcionará ... mas não funciona para mim.

Este link, parecia o mais provável para o trabalho, mas depois de tentar descobrir como codificar a base64 usando este link , eu estava chegando a lugar nenhum.

Qualquer ajuda é muito apreciada. Aqui 'sa pergunta anterior que eu perguntei, que estão relacionados a isso, mas são questões diferentes.

EDIT1

Peço desculpas por isso ser tão tarde, foi embora por um tempo.

Aqui estão os meus logs de acesso para o servidor proxy reverso nginx. 192.168.0.5 é meu cliente FYI.

Esses registros são de mim acessando o site, obtendo um prompt de login, tentando o login uma vez (sem sucesso) e saindo do prompt de login.

/var/log/nginx/access.log

192.168.0.5 - - [09/Feb/2016:14:04:14 -0600] "GET / HTTP/1.1" 401 1293 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0"
192.168.0.5 - - [09/Feb/2016:14:04:31 -0600] "GET / HTTP/1.1" 401 341 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0"
192.168.0.5 - - [09/Feb/2016:14:04:31 -0600] "GET / HTTP/1.1" 401 1293 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0"
192.168.0.5 - - [09/Feb/2016:14:04:34 -0600] "GET /favicon.ico HTTP/1.1" 401 1293 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0"

/var/log/nginx/error.log

This file is empty

Logs do IIS

2016-02-11 19:39:22 192.168.0.20 GET /login - 80 - 192.168.0.10 Mozilla/5.0+(X11;+Linux+x86_64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Ubuntu+Chromium/45.0.2454.101+Chrome/45.0.2454.101+Safari/537.36 401 2 5 125
2016-02-11 19:39:28 192.168.0.20 GET /login - 80 - 192.168.0.10 Mozilla/5.0+(X11;+Linux+x86_64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Ubuntu+Chromium/45.0.2454.101+Chrome/45.0.2454.101+Safari/537.36 401 1 21480424 0
2016-02-11 19:39:36 192.168.0.20 GET /login - 80 - 192.168.0.10 Mozilla/5.0+(X11;+Linux+x86_64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Ubuntu+Chromium/45.0.2454.101+Chrome/45.0.2454.101+Safari/537.36 401 1 21480724 0
2016-02-11 19:40:16 192.168.0.20 GET /login - 80 - 192.168.0.10 Mozilla/5.0+(X11;+Linux+x86_64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Ubuntu+Chromium/45.0.2454.101+Chrome/45.0.2454.101+Safari/537.36 401 1 21407424 15
2016-02-11 19:40:22 192.168.0.20 GET /login - 80 - 192.168.0.10 Mozilla/5.0+(X11;+Linux+x86_64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Ubuntu+Chromium/45.0.2454.101+Chrome/45.0.2454.101+Safari/537.36 401 1 21480742 0

Não há erros de segurança para logins, então, na verdade, ele nunca está enviando o login para o sistema, eu acho. Ele simplesmente me dá o pop-up de login novamente toda vez que eu clico em "login".

Saída de plug-in de cabeçalhos HTTP ativos

https://server2.mydomain.com/

GET / HTTP/1.1
Host: server2.mydomain.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

HTTP/1.1 401 Unauthorized
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 09 Feb 2016 19:21:04 GMT
Content-Type: text/html
Content-Length: 1293
Connection: keep-alive
WWW-Authenticate: NTLM
WWW-Authenticate: Negotiate
X-Powered-By: ASP.NET
----------------------------------------------------------
https://server2.mydomain.com/

GET / HTTP/1.1
Host: server2.mydomain.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Authorization: NTLM TlRNTVMTUAAAB4IIAAAAAAAAAAAAACDAFGAAAAAAAAAAAAAAAAA=

HTTP/1.1 401 Unauthorized
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 09 Feb 2016 19:22:00 GMT
Content-Type: text/html; charset=us-ascii
Content-Length: 341
Connection: keep-alive
WWW-Authenticate: NTLM TlRMTVNTUAACAAAAGgAaADgAAuzKir6ADucAAAAAAAAAAL4A&%$DSDADvgBSAAAABgGxHQAAAA9HAEUARQBLAFMAQQBOAEQATgBFAFIARABTAAIAGgBHRQBLAFMAQQBOAEQATgBFDFAFIARABTAAEADABLAEUATABWAEkATgAEACIAZwBlAGUAawBzAGEAbgBkAG4AZQByAGQAcwAuAGMAbwBtAAMAMABLAEUATABWAEkATgAuAGcAZQBlAGsAcwBhAG4AZABuAGUAcgBkAHMALgBjAG8AbQAFACIAZwBlAGUAawBzAGEAbgBkAG4AZQByAGQAcwAuAGMAbwBtAAcACAABRuM1b2PRAQAAAAA=
----------------------------------------------------------
https://server2.mydomain.com/

GET / HTTP/1.1
Host: server2.mydomain.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHAAAADqAOoAiAAAAAAAAAAGgAaAEAAAAAWABYAWgAAAAAAAAAAAAAABYIIAGEAbQBhAG4AZABhAC4AYgBsAG8AdQBuAHQAVwBPAFIASwBTAFQAQQBUAEkATwBOAHorEf/j46zta4wONTUAADAA-98uH//ZL0Am16vGzdWutoAAAAGAAYAHQAAAAAAAACFdzVEB9QHmLWLCuQQAAAAAAgAaAEcARQBFAEsAUwBBAE4ARABOAEUAUgBEAFMAAQAMAEsARQBMAFYASQBOAAQAIgBnAGUAZQBrAHMAYQBuAGQAbgBlAHIAZABzAC4AYwBvAG0AAwAwAEsARQBMAFYASQBOAC4AZwBlAGUAawBzAGEAbgBkAG4AZQByAGQAcwAuAGMAbwBtAAUAIgBnAGUAZQBrAHMAYQBuAGQAbgBlAHIAZABzAC4AYwBvAG0ABwAIAAFG4zVvY9EBAAAAAA==

HTTP/1.1 401 Unauthorized
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 09 Feb 2016 19:22:00 GMT
Content-Type: text/html
Content-Length: 1293
Connection: keep-alive
WWW-Authenticate: NTLM
WWW-Authenticate: Negotiate
X-Powered-By: ASP.NET
----------------------------------------------------------

EDIT2 - Para maior clareza, aqui está a configuração por IP.

Máquina cliente

192.168.0.5

Ubuntu 14.04 desktop

Servidor proxy reverso

192.168.0.10

nginx 1.4.6

Ubuntu 14.04 server

Servidor 2

192.168.0.20

server2.mydomain.com

apache2

Ubuntu 14.04 server

EDIT3 - Talvez isso funcione e eu esteja fazendo errado, .... talvez não

De este post, a resposta está escrita por Fizz.

Eu tentei isso abaixo

/ etc / nginx / sites-available / default

server {
    listen 80 default;
    server_name _;
    return 301 https://$host$request_uri;
}

upstream server2.mydomain.com {
        server 192.168.0.20:80
keepalive 16;
}

server {
    listen 443 ssl;
    server_name server2.mydomain.com;

    ssl_certificate /usr/local/nginx/conf/mydomain.com.crt;
    ssl_certificate_key /usr/local/nginx/conf/mydomain.com.key;
    ssl_session_cache shared:SSL:10m;

    ssl_session_timeout 5m;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://192.168.0.20:80;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect http:// $scheme://;

    }
}

Mesmos resultados. Com base nas outras respostas .... talvez o apache2 seja o melhor caminho a seguir?

EDIT4 - Edite com base na resposta de Maxim Dounin

Estou tentando usar o Nginx 1.9.9 agora, e o método proxy de fluxo mencionado na resposta de Maxim Dounin.

Eu compilei a partir do código-fonte, então meus locais de arquivos são diferentes agora.

/opt/nginx/nginx.conf

worker_processes 1;
events {
    worker_connections 1024;
}

stream {
    upstream backend {
       hash $remote_addr consistent;

       server server2.mydomain.com:80 weight=5;
       server 192.168.0.20:80            max_fails=3 fail_timeout=30s;

    }

    server {
        listen 443 ssl;        #Line 27
        server_name server2.mydomain.com;

        ssl_certificate /usr/local/nginx/conf/mydomain.com.crt;
        ssl_certificate_key /usr/local/nginx/conf/mydomain.com.key;
        ssl_session_cache shared:SSL:10m;

        ssl_session_timeout 5m;

        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }

#    server {
#        listen [::1]:12345;
#        proxy_pass unix:/tmp/stream.socket;
#    }
}

Eu comentei a última linha de servidor recomendada, porque eu não tinha ideia do que fazer com isso, mas meu arquivo de configuração não chega lá de qualquer maneira devido a outros erros. Agora meu /opt/nginx/logs/error.log está tendo problemas com a linha 27

the "ssl" parameter requires ngx_stream_ssl_module in /opt/nginx/nginx.conf:27

Eu definitivamente compilei com o ngx_stream_ssl_module porque quando eu faço um nginx -V eu recebo configure arguments: --with-stream

Espero que eu esteja no caminho certo.

    
por trueCamelType 05.02.2016 / 21:36

2 respostas

8

O problema é Autenticação NTLM (note WWW-Authenticate: NTLM ... ), autenticação do Windows do AKA.

A autenticação NTLM autentica conexões em vez de solicitações, e isso é um pouco contraditório com o protocolo HTTP, que deve ser stateless. Como resultado, geralmente não funciona através de proxies, incluindo nginx.

A solução mais simples seria alterar a autenticação para "Básico" no lado do IIS. Se isso não for uma opção por algum motivo, outras possibilidades incluem:

  • Use o proxy de fluxo disponível em nginx 1.9.x. Isso mapeará as conexões dos clientes para o servidor upstream e, assim, a autenticação NTLM funcionará.

  • Use o recurso ntlm conforme disponível na versão comercial do nginx.

Observe que há algumas recomendações para usar upstream com keepalive para que a autenticação NTLM funcione. Essas recomendações são incorretas e prejudiciais - a menos que você esteja usando o proxy para apenas um usuário. E o pior é que pode aparecer para funcionar corretamente. O problema é que as conexões keepalive ao servidor upstream são mantidas em um cache comum e essas conexões podem ser usadas para todos os clientes. Portanto, se houver uma conexão autenticada no cache, um cliente não relacionado que use essa conexão poderá ignorar a autenticação.

    
por 16.02.2016 / 18:45
1

Eu tive um erro semelhante ao configurar um servidor do YouTrack com um proxy reverso.

Você pode tentar adicionar esta linha:

proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

E no link abaixo:

If Nginx is going to terminate SSL/TLS connections before forwarding them to YouTrack, then the following header is also necessary:

proxy_set_header        X-Forwarded-Proto https;

Este é o link que me ajudou a encontrar uma solução: link

    
por 11.02.2016 / 20:24