NGINX PlusでMicrosoft Azure App Serviceのアプリケーションを保護

NGINX | 2018年10月03日

クラウドコンピューティング、特にPlatform as a Service(PaaS)やContainer as a Service(CaaS)の普及により、企業がビジネスアプリケーションを導入・運用する方法は変化しています。クラウドアプリケーションを設計する際の最も重要な課題の1つは、セキュリティを損なうことなく、コストと時間のかかる運用作業を削減できるフルマネージドクラウドサービスを選択することです。

このブログ記事では、Microsoft Azure App Serviceでアプリケーションをホストし、NGINX Plusで保護してインターネットからの攻撃を防ぐ方法を紹介します。

Microsoft Azure App Serviceの概要

Microsoft Azure App Serviceは、図1に示すように、基盤となるインフラストラクチャを管理することなく、Web、API、モバイルアプリをMicrosoft Azureにデプロイできる、エンタープライズグレードのフルマネージドプラットフォームです。Azure App Serviceには、主に次の機能があります。

  • Web Appsでは、さまざまな言語やフレームワーク(ASP.NET、Node.js、Java、PHP、Python)を使用してWebアプリをデプロイし、実行できます。また、包括的なアプリケーション管理機能(監視、ステージング環境から本番環境へのスワップ、デプロイ済みアプリケーションの削除など)を備えたInternet Information Services(IIS)を使用して、スケーラブルで信頼性の高いWebアプリケーションを管理できます。さらに、コンテナを使用してLinux上でWebアプリケーションを実行するためのDockerランタイムも提供します。
  • API Appsは、CORS(クロスオリジンリソース共有)をサポートするREST APIのデプロイに必要なツールを提供します。Azure API Appsは、コードを変更することなく、Azure Active Directory、ソーシャルネットワークのシングルサインオン(SSO)、またはOAuthを使用して簡単に保護できます。
  • Mobile Appsは、認証、プッシュ通知、ユーザー管理、クラウドストレージなどの主要機能をサポートするモバイルバックエンドサービスを迅速にデプロイできます。

図1:Azure App Service

Azure App Serviceにより、Microsoftはクラウド上でWebアプリケーションを実行するための、機能が豊富で迅速な方法を提供しています。開発者は、ASP.NET、Java、Node.js、PHP、Pythonを使用してアプリケーションをローカルで開発し、Microsoft Visual StudioまたはAzure CLIを使用してAzure App Serviceに簡単にデプロイできます。また、DevOpsチームはAzure App Serviceの継続的デプロイ機能を活用し、複数の環境にアプリケーションリリースを迅速かつ確実にデプロイできます。

Azure App Service上のアプリケーションは、Azureにデプロイされた他のリソースにアクセスしたり、VPN経由でオンプレミスの企業リソースに接続したりできます。

Azure App Service Environmentについて

基本的に、Azure App Serviceで作成したアプリケーションはインターネットに直接公開され、azurewebsites.netのサブドメインが割り当てられます。セキュリティを強化するには、SSL終端や、OAuth2またはOpenID Connect(OIDC)などの認証・認可プロトコルを使用してアプリを保護できます。ただし、送受信トラフィックに対するきめ細かなセキュリティルールを使用してネットワークをカスタマイズしたり、Webアプリケーションファイアウォール(WAF)などのミドルウェアを適用して、インターネットからの悪意のある攻撃やエクスプロイトを防いだりすることはできません。

Azure App Serviceで機密性の高いアプリケーションを実行し、それらを保護する場合は、Azure App Service Environments(ASE)を使用できます。ASEは、仮想ネットワーク内にデプロイされ、単一のお客さまのアプリケーション専用に構成される分離環境です。これにより、アプリケーションの受信および送信ネットワークトラフィックをより細かく制御できます。

ASEを使用すると、図2に示すように、Web、API、モバイル、または関数アプリを、よりセキュアな環境に極めて大規模にデプロイできます。

図2:Azure ASEのトラフィックをフィルタリングするNGINX ModSecurity WAF

新しいASE v2の作成

ASEには、ASE v1とASE v2の2つのバージョンがあります。この記事では、ASE v2について説明します。

Azure Portalを使用して新しいASE v2を手動で作成することも、Azure Resource Managerを使用して自動的に作成することもできます。

新しいASEを作成する際は、次の2つのデプロイタイプから選択する必要があります。

  • An 外部ASEは、ASEでホストされているアプリケーションをパブリックIPアドレス経由で公開します。
  • An ILB ASEは、ASEでホストされるアプリケーションを、Azure Virtual Network内からのみアクセス可能なプライベートIPアドレスで公開します。この内部エンドポイントは、Azureでは内部ロードバランサー(ILB)と呼ばれます。

次の例では、インターネットからのアクセスを防ぐためにILB ASEを選択します。そのため、ASEにデプロイされたアプリケーションには、同じネットワーク上で稼働する仮想マシン(VM)からのみアクセスできます。次の2つのコマンドでは、Azure Resource ManagerとAzure CLIを使用して、新しいILB ASE v2をプロビジョニングします。

$ azure config mode arm$ azure group deployment create my-resource-group my-deployment-name --template-uri https://raw.githubusercontent.com/azure/azure-quickstart-templates/master/201-web-app-asev2-ilb-create/azuredeploy.json

一般公開されているASE内のアプリへのアクセスを保護

一方、アプリをインターネットからアクセス可能にする場合は、アプリケーションに保存されている機密情報を盗もうとする悪意のある攻撃者からアプリを保護する必要があります。

ASEでレイヤー7のアプリケーションを保護するには、主に2つの選択肢があります。

(WAF機能を備えたカスタムのアプリケーションデリバリーコントローラー[ADC]で代用できますが、そのユースケースについてはここでは説明しません。)

ソリューションの選択は、セキュリティ上の制約によって異なります。Azure Application Gatewayは、セキュリティポリシーを適用するためのターンキーソリューションであり、基盤となるインフラストラクチャを管理する必要がありません。一方、NGINX PlusをVM上にデプロイすると、より高度な制御と柔軟性を備えた強力なスタックを利用でき、セキュリティルールをきめ細かく調整できます。

ASE内で作成されたアプリケーションの負荷分散とセキュリティ確保にAzure Application GatewayとNGINX Plusのどちらを使用するかを選択するには、各ソリューションが提供する機能を十分に理解する必要があります。Azure Application Gatewayは単純なユースケースには対応できますが、複雑なユースケースでは、NGINX Plusに標準搭載されている多くの機能を提供していません。

次の表では、Azure Application GatewayとNGINX Plusにおける負荷分散機能とセキュリティ機能のサポート状況を比較しています。NGINX Plusの機能の詳細については、表の下をご覧ください。

機能 Azure Application Gateway NGINX Plus緩和機能 アプリケーション層(レイヤー7) アプリケーション層(レイヤー7)HTTP対応 ✅ ✅HTTP/2対応 ❌ ✅WebSocket対応 ❌ ✅SSLオフロード ✅ ✅ルーティング機能 リクエストURLまたはCookieベースのセッションアフィニティに基づく単純な判定 高度なルーティング機能IPアドレスベースのアクセス制御リスト ❌(AzureのWebアプリレベルで定義する必要があります) ✅エンドポイント Azureの任意の内部IPアドレス、パブリックインターネットIPアドレス、Azure VM、またはAzure Cloud Service Azureの任意の内部IPアドレス、パブリックインターネットIPアドレス、Azure VM、またはAzure Cloud ServiceAzure Vnet対応 インターネット向けアプリケーションと内部(Vnet)アプリケーションの両方 インターネット向けアプリケーションと内部(Vnet)アプリケーションの両方WAF ✅ ✅ボリューム攻撃 部分対応 部分対応プロトコル攻撃 部分対応 部分対応アプリケーション層攻撃 ✅ ✅HTTP Basic認証 ❌ ✅JWT認証 ❌ ✅OpenID Connect SSO ❌ ✅

ご覧のとおり、NGINX PlusとAzure Application Gatewayはいずれも、Layer 7の負荷分散機能とWAFを備えたADCとして機能し、一般的なWebの脆弱性やエクスプロイトに対して強力な保護を実現します。

NGINX Plusは、Azure Application Gatewayにはない次の追加機能を提供します。

  • URLの書き換えとリダイレクト – NGINX Plusでは、リクエストをバックエンドサーバーに渡す前に、リクエストのURLを書き換えることができます。これにより、クライアントに提示するURLを変更せずに、ファイルの場所やリクエストパスを変更できます。また、リクエストをリダイレクトすることもできます。たとえば、すべてのHTTPリクエストをHTTPSサーバーにリダイレクトできます。
  • 接続数とレートの制限 – NGINX Plusインスタンスで送受信されるトラフィックを制御するために、複数の制限を設定できます。これには、受信接続数、受信リクエストのレート、バックエンドノードへの接続数、NGINX Plusからクライアントへのデータ転送レートの制限が含まれます。
  • HTTP/2およびWebSocketのサポート – NGINX Plusは、HTTP/2とWebSocketをアプリケーション層(レイヤー7)でサポートします。Azure Application Gatewayはこれらをサポートしていません。代わりに、Azure Load Balancerが、TCPとUDPが動作するネットワーク層(レイヤー4)でサポートします。

セキュリティをさらに強化するために、Azure DDoS Protectionを導入できます。これにより、レイヤー3および4の脅威を緩和し、Azure Application GatewayまたはNGINX Plusが提供するレイヤー7の脅威緩和機能を補完できます。

NGINX PlusとAzure App Serviceを使用したアプリケーションの保護

図3は、NGINX PlusとAzure App Serviceを組み合わせて、ビジネスアプリケーションを本番環境で実行するためのセキュアな環境を提供する方法を示しています。この導入戦略では、NGINX Plusの負荷分散機能とWAF機能を使用します。

図3:NGINX PlusはAzure ASE内のアプリケーションへのトラフィックを負荷分散

このデプロイメントは、以下のコンポーネントを組み合わせたものです。

  • Azure Virtual Network (VNet) – 組織専用のAzureクラウド内の仮想ネットワークを表します。論理的に分離された環境を提供し、仮想ネットワーク内のAzureリソース間で安全に通信できるようにします。ここでは、2つのサブネットを定義しています。Internalはインターネットに直接公開されないWebアプリケーション用、WafはNGINX Plusとその基盤となるインフラストラクチャ用です。
  • Azure App Service Environment – このサンプルデプロイでは、2つのサンプルWebアプリケーション(Web App 1とWeb App 2)を使用して、NGINX Plusで異なるWebアプリケーションを保護し、負荷分散する方法を示します。NGINX Plusでは、個別のupstreamブロックを設定してリクエストを異なるWebアプリケーションに分散し、locationブロックを使用してURIに基づくコンテンツルーティングを行います。以下は、この目的を達成するための最小限のNGINX Plus構成です(ここでは、すべてのリクエストが同じアップストリームグループに送信されます)。
upstream backend {    server IP-address-of-your-ASE-ILB;
}

server {
    location / {
        proxy_set_header Host $host;
        proxy_pass http://backend;
    }
}
  • NGINX Plus – 複数のWebアプリケーションにHTTP(S)接続を負荷分散します。NGINX PlusをVMにデプロイすると、他のAzureサービスよりもインフラストラクチャを細かく制御できます。たとえば、VMでは、分離された仮想ネットワーク内で実行するオペレーティングシステム(LinuxまたはWindows)を選択できます。実際、Azure VMでは、NGINX PlusがサポートするすべてのLinuxディストリビューションを利用できます(当然ながら、Amazon Linuxを除きます)。
  • Azure VMスケールセット – VMスケールセットは、同一構成のVM群をデプロイして管理できるAzureコンピューティングリソースです。VMのサイズを設定し、適切なVNetに割り当てることができます。スケールセット内で稼働するすべてのVMは、VMインスタンス間のTCP接続を提供するAzure Load Balancerによって負荷分散されます。ここでは、スケールセット内の各VMは、Azure Marketplaceで提供されているNGINX Plusイメージをベースにしています。スケールセットは、真の自動スケーリングを実現するように設計されています。

Azureでは、アプリケーションのAzureリソースを論理的に簡単にグループ化する方法として、リソースグループもサポートしています。リソースグループを使用してもインフラストラクチャの設計やトポロジには影響しないため、ここでは示していません。

Azure VM Scale SetsによるNGINX Plusの高可用性と自動スケーリング

Azure VM Scale Setsを使用すると、スケーリングを支える物理ハードウェアを購入・保守することなく、仮想化のメリットを活用していつでもスケールできます。ただし、構成、パッチ適用、セキュリティ更新、VM上で実行するソフトウェアのインストールなど、VMの保守は引き続きお客さまの責任となります。

図4に示すアーキテクチャでは、Azure VMスケールセット内にNGINX Plusインスタンスを配置し、アクティブ/アクティブ構成で高可用性を実現しています。この構成では、Azure Load Balancerによってルーティングされた受信リクエストをすべてのNGINX Plus VMで処理できるため、コスト効率の高いキャパシティを確保できます。

図4:Azure Load BalancerでNGINX Plusへのトラフィックを負荷分散するAzure VMスケールセット

Azure VMスケールセットを使用すると、平均CPU使用率に基づくNGINX Plusインスタンスの自動スケーリングも簡単に設定できます。この場合、NGINX Plusの設定ファイルが同期されるようにする必要があります。この目的には、NGINX Plus管理ガイドに記載されているNGINX Plusの設定共有機能を使用できます。

まとめ

クラウドアプリケーションにAzure App Serviceを使用し、Webアプリ、API、モバイルバックエンドの前段にNGINX Plusを配置することで、これらのアプリケーションをグローバル規模で負荷分散し、保護できます。NGINX PlusとAzure App Serviceを併用すると、Web経由のエクスプロイトや攻撃に対して高いレベルの保護を備えた、完全に負荷分散されたインフラストラクチャを構築できます。これにより、重要なアプリケーションを本番環境で安全に実行するための堅牢な設計が実現します。

リソース

Web Appsの概要(Microsoft)
App Service Environmentの概要(Microsoft)
Azure portalを使用してWebアプリケーションファイアウォールを備えたアプリケーションゲートウェイを作成する(Microsoft)
NGINX Open SourceとNGINX Plusの機能比較(NGINX)
HTTPロードバランシング(NGINX)

ゲスト共同執筆者のCedric Derue氏は、Altranのソリューションアーキテクト兼Microsoft MVPです。ゲスト共同執筆者のVincent Thavonekham氏は、VISEOのMicrosoft Regional Director兼Azure MVPです。


共有

関連するブログ記事

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
NGINX | 2024/01/18

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する

OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
NGINX | 2023/05/31

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正

Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
NGINX | 2023/02/09

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法

Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINX | 2022/05/24

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング

NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
NGINX | 2018/08/17

SELinuxでNGINXおよびNGINX Plusを使用する

Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。

NGINX PlusによるAWS Auto Scalingグループの負荷分散
NGINX | 2017/03/06

NGINX PlusによるAWS Auto Scalingグループの負荷分散

新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります