[座学]

・proxy_redirectディレクティブ

・httpリダイレクトとは?

html、Webアプリケーション、Webサーバそれぞれで指定する方法

・locationヘッダ

 値の意味。ipアドレスとFQDN、ポート番号、ディレクトリ、getクエリ

・cookieヘッダ、set cookieヘッダ

・proxy_cookie_pathディレクティブ

・cookieのsecureフラグ

・その他のcookieの値

・ ssl_prefer_server_ciphersディレクティブ

・add_headerディレクティブ

・hostヘッダを参照する処理

名前ベースのバーチャルホスト、TLSサーバ証明書のサーバ名検証、L7スイッチング?、アプリケーションフィルタ?

・X-Real-IPヘッダはだれが何に使うのか?

・X-Forwarded-Forヘッダは誰が何に使うのか?

リバースプロキシなどのHTTPを終端するホストが多段で存在するときのX-Forward-forヘッダも多重になるのか?この場合、X-Forward-forヘッダを活用するプログラムはどう解釈するのか?RFCのX-Forward-forやSquidのX-Forward-forで規格上の相違はあるのか?

・proxy_set_headerディレクティブ

・proxy_passディレクティブ

IPアドレス、FQDN、URLにポート番号、ディレクトリ、getクエリ、tomcatなどへのプロキシ

※tomcatなどのサーブレットコンテナへのプロキシの注意点(mod_http_proxyはどんな?)

・バックエンドがphpやmod_cgiなどのアプリケーションサーバの場合も注意点に共通する部分があるのか?(キャッシングとかプーリングとか書換とか・・・)

・プロキシと言えば昔はキャッシュだった。

・プロキシと言えば今はセキュリティ(ファイアウォール)だろうか???

 

[検証方針]

・HTTPSでリクエストを受けるサイトをnginxでたてる

nginx 課題13 TLSとSNI

・HTTPでリクエストを受けたらHTTPSのサイトにリダイレクトするサイトをnginxでたてる

・locationヘッダがついたレスポンスをパケットキャプチャで確認

・上記のnginxのフロントエンド側にもうひとつnginxでリバースプロキシサーバをたてる

・new_nginxのproxy_redirectディレクティブでリダイレクトするサイトをリバースプロキシできるか検証する

 

[想定される動作]

・最初のリクエストの流れ

PC(ブラウザ) -①→ リバースプロキシサーバ -②→ リダイレクトするwebサーバ

https://gad2.chinko2(のコンテンツ)をリクエスト         http://gad2.chinko2にリバースプロキシ    

・最初のレスポンスの流れ

PC(ブラウザ) ←④- リバースプロキシサーバ ←③- リダイレクトするwebサーバ

                         https://gad3.chinko3へのURLをセットしたlocationレスポンスヘッダをつけて応答

・リダイレクト時のリクエストの流れ

PC(ブラウザ) -⑤→ リバースプロキシサーバ -⑥→ リダイレクトするwebサーバ

https://gad3.chinko3をリクエスト             http://gad3.chinko3にリバースプロキシ   

・リダイレクト時のレスポンスの流れ

PC(ブラウザ) ←⑧- リバースプロキシサーバ ←⑦- リダイレクトするwebサーバ

http://gad3.chinko3(のコンテンツ)を受信            http://gad3.chinko3のコンテンツを返信

 

<凡例>

:TLSのリクエスト、→:平文リクエスト、:TLSのレスポンス、←:平文レスポンス

 

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

OS:centos7、ホスト名:centos7_sub、IP:192.168.2.70、nginx、プロンプト:「せ70>

・リダイレクトするwebサーバ

OS:centos7、ホスト名:centos7、IP:192.168.2.7、nginx、プロンプト:「せ7>

 

[準備]

・リバースプロキシサーバに2つの名前ベースバーチャルホストを立てる

https://gad2.chinko2

https://gad3.chinko3

※それぞれのサーバ証明書をセット(nginx 課題13 TLSとSNI参照)

・nginxの設定(リバースプロキシサーバ)

せ70> cat /etc/nginx/conf.d/proxy.conf

server {
    listen       443 default_server;
    ssl                  on;
    server_name  gad2.chinko2;

    ssl_certificate      /etc/pki/tls/certs/gad2.chinko2.crt;
    ssl_certificate_key  /etc/pki/tls/private/gad2.chinko2.key;

    ssl_session_timeout  10m;
    ssl_session_cache   shared:SSL:10m;

    ssl_protocols TLSv1.2;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    proxy_cookie_path / "/; secure";

    location / {
        proxy_set_header Host             $host;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.2.7;
        proxy_redirect default;
    }
}

server {
    listen       443;
    ssl                  on;
    server_name  gad3.chinko3;

    ssl_certificate      /etc/pki/tls/certs/gad3.chinko3.crt;
    ssl_certificate_key  /etc/pki/tls/private/gad3.chinko3.key;

    ssl_session_timeout  10m;
    ssl_session_cache   shared:SSL:10m;

    ssl_protocols TLSv1.2;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    proxy_cookie_path / "/; secure";

    location / {
        proxy_set_header Host             $host;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.2.7;
        proxy_redirect default;
    }
}

・nginxの設定(リダイレクトするWebサーバ)

せ7> cat /etc/nginx/conf.d/virtualhost.conf

server {
    listen 80;
    server_name gad2.chinko2;
    return 301 https://gad3.chinko3;
}
server {
    listen 80;
    server_name gad3.chinko3;
    root   /usr/share/nginx/html/gad3.chinko3;
    location / {
        charset utf-8;
        index  index.html index.htm;
    }
}

・ログフォーマットは下記の通り

せ7> cat /etc/nginx/nginx.conf

・・・前略・・・

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
    server_tokens off;
    include /etc/nginx/conf.d/*.conf;
}

・静的ページ

せ7> cat /usr/share/nginx/html/gad2.chinko2/index.html
<http>
<head>
<title>test</title>
</head>
<body>
<H1><font color="blue">これはgad2.chinko2だぎゃー</font></H1>
</body>
</http>

せ7> cat /usr/share/nginx/html/gad3.chinko3/index.html
<http>
<head>
<title>test</title>
</head>
<body>
<H1><font color="red">これはgad3.chinko3だぎゃー</font></H1>
</body>
</http>

・nginxサーバ再起動

せ7> systemctl restart nginx

せ70> systemctl restart nginx

・PCのhostsファイルに下記を追記

192.168.2.70            gad2.chinko2 gad3.chinko3

・動作確認

※事前にブラウザキャッシュをすべて削除してからブラウザも再起動してから試行する。

URL窓に https://gad2.chinko2 と入力してエンター

リダイレクトされたページに飛ぶ

せ7> tail -1 /var/log/nginx/access.log

192.168.2.70 - - [26/May/2018:22:18:16 +0900] "GET / HTTP/1.0" 200 133 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0" "192.168.2.2"

 

[研究] それぞれのディレクティブの意味を調べる

【検証1】 return ディレクティブによるlocationヘッダ追記、proxy_redirectディレクティブによるlocationヘッダの書換え

【検証1-1】 returnディレクティブの有無によるレスポンスの違い

【検証1-2】 proxy_redirectディレクティブによる下記の書換を試す

ipアドレスとFQDN、ポート番号、ディレクトリ、getクエリ

※ブラウザからhttps://gad2.chinko2にアクセスして各箇所でパケットをキャプチャしてみる

【検証2】 proxy_cookie_pathディレクティブとcookieヘッダ、およびset cookieヘッダ

ブラウザのEditThisCookieツールでクッキーを見てみる

【検証3】  ssl_prefer_server_ciphersディレクティブ

【検証3-1】 「ON」のときと「OFF」のときでSSLパケットをキャプチャしてみる

【検証4】  proxy_set_headerディレクティブ

【検証4-1】 下記のヘッダがそれぞれセットされることを確認する

  host ← $host あるいは 定数値

 X-Real-IP ← $remote_addr あるいは 定数値。そしてこのヘッダは一体何か?

  X-Forwarded-For ← $proxy_add_x_forwarded_for あるいは定数値

  ※proxyサーバにX-Forward-forヘッダが付与されることによって、バックエンドのアクセスロ       グ、アクセスコントロールの動きを変えられることを確認する  

【検証5】 proxy_passディレクティブ

【検証5-1】 IPアドレス、FQDN、URLにポート番号、ディレクトリ、getクエリ