オウルです。
Azure Application Gatewayは、Web アプリケーションに対するトラフィックを管理できるWebトラフィックロードバランサーですが、WAF機能もあります。今回はWAFとしてAzure Application Gatewayを使用します。
本題は、認証CookieのセキュリティポリシーをCookieSecurePolicy.Alwaysで構成しているASP.NET Core Appに、Azure Application GatewayでTLS終了させたHTTPトラフィックを、どう転送するかです。

今回は、バックエンドプールのVM(Ubuntu)にHTTPトラフィックを転送するシンプルな構成です。
OS | Ubuntu18.04 LTS |
Nginx | 1.18.0 |
Redis Server | 4.0.9 |
App | .NET Core3.1 |
TLS 終了のメリット
僕の理解でざっくり説明すると、ハンドシェイク以降の通信は、セッション鍵(共通鍵暗号)を使ってC/S間で暗号・復号をするのでバックエンドのVMに負荷がかかります。なので、Azure Application GatewayでTLS終了させて、ASP.NET Core Appには平文で処理させます。公式ドキュメントのApplication Gateway での TLS 終了とエンド ツー エンド TLS の概要では、TLS 終了のメリットとして「パフォーマンスの向上」「バックエンド サーバーの使用率の向上」「インテリジェントなルーティング」「証明書の管理」の説明があります。
ASP.NET Core AppへのWebトラフィックの転
ASP.NET Core AppのCookie構成
クッキーを発行した同じサイトかつTLSでないとCookieをサーバに送信しませんよ、という何の変哲もない構成です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public void ConfigureServices(IServiceCollection services) { ・・・ services.Configure<CookiePolicyOptions>(options => { options.MinimumSameSitePolicy = SameSiteMode.Strict; }); services.ConfigureApplicationCookie(options => { ・・・ options.Cookie.HttpOnly = true; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; ・・・ }); } |
当然上記の設定でhttpでアプリの認証などにアクセスしようとしても拒否されます。
Azure Application Gateway
公式ドキュメントのクイック スタート:Azure Application Gateway による Web トラフィックのルーティングに沿って進めれば問題なくデプロイできるので、デプロイ方法については省略します(TLS終了するように構成)。ポータル以外にも、PowerShell、Azure CLI、ARMのドキュメントが用意されています。
但し、SKUによって出来ることと出来ないことがあります。例えば独自ドメインを使いたい場合などはSKUの選択に注意が必要です。
補足 IPフィルターする場合
検証用に特定のIPアドレスからのみ接続を許可したい場合は、ネットワークセキュリティグループを作成して、Azure Application Gatewayのサブネットに適応してください。
Nginx構成
リバース プロキシとしてNginxを構成して、Kestrelで実行しているASP.NET Core Appに HTTPトラフィックを転送します。
1 2 3 4 5 6 |
server { listen 80; ・・・ #proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; } |
まずはローカルでNginxをリバースプロキシとして試してみたいという方はこちらはどうぞ。
ASP.NET Core Appの構成
公式ドキュメントにあるLinux および非 IIS のリバース プロキシのスキームを転送する のように構成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public void ConfigureServices(IServiceCollection services) { ・・・ if (string.Equals( Environment.GetEnvironmentVariable("ASPNETCORE_FORWARDEDHEADERS_ENABLED"), "true", StringComparison.OrdinalIgnoreCase)) { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; options.KnownNetworks.Clear(); options.KnownProxies.Clear(); }); ・・・ } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto }); ・・・ } |
以上でシンプルな構成ですが、Azure Application Gateway⇒Nginx⇒ASP.NET Core AppにWebトラフィックを転送することができます。