[座学]
・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でたてる
・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クエリ

