web-dev-qa-db-ja.com

IISリバースプロキシを介したサイトへのログインを許可する正しい方法は何ですか?

Nginxリバースプロキシを使用しており、IIS Webサイトにログインし、その背後で動作するようにしています。この質問が何度も尋ねられたことがわかりましたが、それぞれの回答が異なるようです、そしていくつかの問題は私が抱えている問題から少し逸脱しています。

私の現在の構成では、ログインに到達できますが、401エラーが発生し、資格情報を要求し続けます。

私の現在の設定:

/ 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://;

    }
}

私の質問は、これが機能するはずの正しい方法は何ですか?

これが私がこれまでに調査したものです:

これ リンク、それは不可能だと言います。

これ リンク、アップストリームでキープアライブを使用する必要があると述べています。それが答えかもしれませんが、upstream server2.mydomain.comに構成を追加すると、nginxは再起動に失敗します。構文に誤りがあると思いますが、いくつか試しました。私はこれまでに試みたすべてを投稿しますが、これが正しいアプローチであるかどうかさえわかりませんし、多くのことを試みたので、一般の人々にこれがどのように行われるかを尋ねるだけの方が簡単だと思いました。

This リンクは、proxy_pass_request_headers on;行を追加するだけで何とか機能することを示していますが、私には適していません。

This リンクが機能する可能性が最も高かったようですが、 this リンクを使用してbase64にエンコードする方法を見つけたところ、どこにも到達できませんでした。

どんな助けでも大歓迎です。 ここ は私が以前に尋ねた質問ですが、これに関連していますが、別の質問です。


EDIT1

私はこれが非常に遅いことをお詫び申し上げます。

Nginxリバースプロキシサーバーのアクセスログは次のとおりです。 192.168.0.5は私のクライアントFYIです。

これらのログは、サイトへのアクセス、ログインプロンプトの取得、ログインの1回の試行(成功なし)、およびログインプロンプトの終了からの私からのものです。

/ 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

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

ログインのセキュリティエラーがないため、実際にログインをシステムに送信することはないと思います。 「ログイン」を押すたびに、ログインポップアップが表示されます。

ライブHTTPヘッダープラグイン出力

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-明確にするために、ここではIPによる設定を示します。


クライアントマシン

192.168.0.5

Ubuntu 14.04デスクトップ


リバースプロキシサーバー

192.168.0.10

nginx 1.4.6

Ubuntu 14.04サーバー


サーバー2

192.168.0.20

server2.mydomain.com

Apache2

Ubuntu 14.04サーバー


EDIT3-たぶんこれはうまくいき、私はそれを間違っています...多分できない

this 投稿から、Fizzによって書かれた答え。

以下で試してみました

/ 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://;

    }
}

同じ結果。他の回答に基づいて....たぶんApache2が行くより良い方法ですか?


EDIT4-Maxim Douninからの回答に基づいて編集

私は今Nginx 1.9.9を使用しようとしています、そしてMaxim Douninの答えで言及されたストリームプロキシメソッド。

ソースからコンパイルしたため、ファイルの場所が異なります。

/ 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;
#    }
}

どうすればよいかわからなかったので、最後に推奨されたサーバー行をコメントアウトしましたが、他のエラーのために構成ファイルが取得されません。現在、私の/ opt/nginx/logs/error.logは27行目に問題があります

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

nginx -Vを実行するとconfigure arguments: --with-streamが得られるため、ngx_stream_ssl_moduleで確実にコンパイルしました

うまくいけば、私は正しい軌道に乗っています。

6
trueCamelType

問題は NTLM認証 です(注WWW-Authenticate: NTLM ...)、別名Windows認証。

NTLM認証は、リクエストの代わりに接続を認証します。これは、ステートレスであることが期待されるHTTPプロトコルとは多少矛盾します。結果として、それは一般的にnginxを含むプロキシを介して動作しません。

最も簡単な解決策は、IIS側で認証を「基本」に変更することです。これが何らかの理由でオプションにならない場合、他の可能性には以下が含まれます。

  • Nginx 1.9.xで利用可能な stream proxy を使用します。これにより、クライアントからアップストリームサーバーへの接続がマップされ、NTLM認証が機能します。

  • 商用nginxバージョンで利用可能な ntlm 機能を使用します。

NTLM認証が機能するために、キープアライブでアップストリームを使用するためのいくつかの推奨事項があることに注意してください。これらの推奨事項は不正確で有害です-1人のユーザーだけにプロキシを使用している場合を除きます。そして最悪のことは、正しく動作することが表示されることです。問題は、上流サーバーへのキープアライブ接続が共通のキャッシュに保持され、これらの接続がすべてのクライアントで使用できることです。そのため、キャッシュに認証された接続がある場合、この接続をたまたま使用する無関係のクライアントは認証をバイパスできます。

13
Maxim Dounin

YouTrackサーバーをリバースプロキシで構成するときに、同様のエラーが発生しました。

この行を追加してみてください:

proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

そして以下のリンクから:

NginxがSSL/TLS接続を終了してからYouTrackに転送する場合は、次のヘッダーも必要です。

proxy_set_header        X-Forwarded-Proto https;

これは解決策を見つけるのに役立つリンクです: https://confluence.jetbrains.com/display/YTD6/YouTrack+JAR+in+Nginx+Web+Server#

1
inv3rtig0