NEXTSCAPE blog

株式会社ネクストスケープの社員による会社公式ブログです。ネスケラボでは、社員が日頃どのようなことに興味をもっているのか、仕事を通してどのような面白いことに取り組んでいるのかなど、会社や技術に関する情報をマイペースに紹介しています。

MENU

Azure Web Apps で WAF(Azure Application Gateway) がサポートされたのでやってみた

こんにちは。

コンサルティング & テクノロジー部 の Azureチームの 開發です。

先月、部の定例時にApplicationGatewayのMSドキュメントのFAQを確認していると・・

f:id:nextscape_blog:20210910223349p:plain
  

6月に見た時には「現時点では、Azure Web Apps はサポートされていません。」と記載されていたのが
Azure Web Apps などのマルチテナント バックエンドで構成できます。」ってなってるやん・・!

これは、WebApps で WAF(Application Gateway)が使えるようになった事を意味しています。

 

記載ミスじゃないよね?っと思い、AzurePowerShellのUpdate情報を調べたことろ
Azure PowerShell v4.2.0 リリースから Azure Application Gateway が Azure Web Apps のサポートが追加されていました!

こういう需要の多かったであろうものは、もっと大きく扱ってほしいものですねー。

f:id:nextscape_blog:20210910223426p:plain

今まで Application Gatewayのバックエンドプールとして

仮想マシンや、パブリック IP、内部 IP、完全修飾ドメイン名 (FQDN)が対応していましたが
Web Apps はサポートされていませんでした。
 

ですので、Azure Web AppsでWAFを構築する場合、下記の2点のどちらかの方法になっていたかと思います。

・方法1[ASE]: Azure App Service Environmentの中にAzure Web Apps を作成(料金が月額10万以上...)
・方法2[ModSecuriy]: オープンソースのModSecurityを利用。(別途ルールを追加する必要...) 
 
そして、今回のアップデートで
 
・方法3[ApplicationGateway]: Application GatewayのWAF機能で連携(詳細は後述します)
 
が可能となりました。簡単に導入できるようになったのです!
 

では早速、既存のWEBアプリケーションの環境(WebApps)にWAFを追加してみましょう。

 

 

既存環境(WebApps作成済)にWAFを追加してみる


今までもそうですが、今現在も AzurePortalからではApplicationGatewayのバックエンドプールに[IPアドレスまたはFQDN]でWebAppsを設定しただけでは接続できません。

f:id:nextscape_blog:20210910223524p:plain

現時点では、ポータルからApplicationGatewayからWebAppsへの接続する為の設定ができないので、
可能な部分はポータルを使って作成し、ポータルで設定できない部分をPowerShellで設定していきます。



f:id:nextscape_blog:20210910223551p:plain

1.Azure Application Gateway(VNet & Subnet & PublicIP) の作成


Azure Application Gateway を作成する際に、仮想ネットワーク(VNet)とゲートウェイサブネットとPublicIPが必要になりますが、Appication Gatewayと同時に作成可能ですので、今回は一緒に作成していきます。

左メニューの一番下の その他のサービス>カテゴリ:ネットワーク>アプリケーションゲートウェイ を選択し「+追加」ボタンを押します。

f:id:nextscape_blog:20210910223610p:plain




●1-1.基本設定



レベルやサイズなど基本的な設定をしていきます。

f:id:nextscape_blog:20210910223634p:plain

レベル:WAF (今回、アプリケーションファイアウォールとして設定するのでWAFを選ぶ)
SKUサイズ:M(WAFの場合は、MまたはLを選ぶことが可能)
インスタンス:2(検証環境の場合は1でも良い。ただし、SLA保障は2以上必要)
サブスクリプション:接続したいWebAppsと同じ
リソースグループ:接続したいWebAppsと同じリソースグループでもOK
場所:接続したいWebAppsと同じ


●1-2.設定



まずは、サブネット構成で、仮想ネットワークとサブネットを作成します。

仮想ネットワークの選択 > +新規作成 > 仮想ネットワークの作成(一緒にサブネットも作成されます)

f:id:nextscape_blog:20210910223654p:plain

例)
仮想ネットワーク:10.0.0.0/16
subnet:10.0.0.0/24



次に、フロントエンドIPの構成です。
IPアドレスの種類はパブリックにし、パブリックIPを作成します。
パブリックIPアドレスの選択 > +新規作成 > パブリックIPアドレスの作成

f:id:nextscape_blog:20210910223724p:plain



最後に、リスナー構成とWebアプリケーションファイアウォールの設定です。

f:id:nextscape_blog:20210910223741p:plain

プロトコル:HTTP
ポート:80
※HTTPSにする場合は、証明書のアップロードが必要になります。
ファイアーウォールの状態:有効
ファイアーフォールのモード:防止
※検出ログを出す場合は、作成後に[ログ診断]から設定出来ます。


●1-3.作成と確認



内容に間違いがなければOKボタンを押して作成します。

f:id:nextscape_blog:20210910223800p:plain
VNetなども一緒に作成しているので、完了するまで15分ほどかかります。


f:id:nextscape_blog:20210910223819p:plain


作成したApplication Gateway の概要から

フロントエンドのバックエンドIPアドレスが割り当てられている事が確認できます。


●1-4.Azure Powe Shell でApplication Gateway を WebAppsを接続可能にする

下記のPowerShellにサブスクリプション名、リソースグループ名、Gateway名、WebAppsのFQDNを入れてを実行します。

 
(なお、AzurePowerShellを最新にアップデートしておく必要があります。

アップデートの方法として、AzurePowerShellのコマンド「Update-Module AzureRM」でアップデートするか、
Windows8以上であれば、Windowsの左下の検索から「webp」を入れると「Microsoft Web Platform Installer」が出てくるので、そこから簡単にアップデートする事が可能です。)

#1.Azureへのログイン
Login-AzureRmAccount

#2.サブスクリプションの選択
Select-AzureRmSubscription -SubscriptionName "<サブスクリプション名>"

#3.リソースグループ
$rg = Get-AzureRmResourceGroup -Name "<リソースグループ名>"

#5.アプリケーションゲートウェイ名
$gw = Get-AzureRmApplicationGateway -Name "<アプリケーションゲートウェイ名>" -ResourceGroupName $rg.ResourceGroupName

#6.Web Apps のFQDN
$webappFQDN = "<WebAppsのFQDN /i.e. mywebsite.azurewebsites.net>"

#7.プローブの正常判断
$match = New-AzureRmApplicationGatewayProbeHealthResponseMatch -StatusCode 200-399

#8.プローブ設定 -PickHostNameFromBackendHttpSettings のスイッチでWebAppsとの接続可能になる
Add-AzureRmApplicationGatewayProbeConfig -name webappprobe -ApplicationGateway $gw -Protocol Http -Path / -Interval 30 -Timeout 120 -UnhealthyThreshold 3 -PickHostNameFromBackendHttpSettings -Match $match
$probe = Get-AzureRmApplicationGatewayProbeConfig -name webappprobe -ApplicationGateway $gw

#9.バックエンドHTTP設定 -PickHostNameFromBackendAddress のスイッチでWebAppsとの接続可能になる
Set-AzureRmApplicationGatewayBackendHttpSettings -Name appGatewayBackendHttpSettings -ApplicationGateway $gw -PickHostNameFromBackendAddress -Port 80 -Protocol http -CookieBasedAffinity Disabled -RequestTimeout 30 -Probe $probe

#10.ApplicationGatewayのバックエンドプール設定
Set-AzureRmApplicationGatewayBackendAddressPool -Name appGatewayBackendPool -ApplicationGateway $gw -BackendIPAddresses $webappFQDN

#11.ApplicationGatewayのUPDATE これを実行しないと上記がセットされない
Set-AzureRmApplicationGateway -ApplicationGateway $gw

8番と9番のコマンドにより、ApplicationGateway(WAF)とWebAppsをつないでいます。
ここは2分程度で作成されます。
(追記:「#8.プローブ設定 」にて、「Set-AzureRmApplicationGatewayProbeConfig」→「Add-AzureRmApplicationGatewayProbeConfig」に訂正しました)

f:id:nextscape_blog:20210910223847p:plain

WebAppsにアプリをデプロイ済みの場合、[バックエンド正常性]から確認ができます。
もちろん、ブラウザからApplicationGatewayのPublicIPやDNS名(xxxxxx-xxxx-xxxxxxx-xxxxxx.cloudapp.net)からアクセスして確認も可能です。

ApplicationGateway(WAF)を作成してWebAppsに接続できるまで、簡単に出来ちゃいましたね♪


2.WAFの動作確認

 

では、入力したTextをPOSTして画面に表示されるだけの、簡単な掲示板アプリをWebAppsにデプロイし、
Webサイトへの攻撃方法として代表的な、SQLインジェクション と クロスサイトスクリプト(XSS) となるTextをPOSTした際に、ちゃんとブロックするかどうかチェックしてみます。


SQLインジェクション

 

f:id:nextscape_blog:20210910223913p:plain

クロスサイトスクリプト

 

f:id:nextscape_blog:20210910224021p:plain

どちらも403のアクセス拒否のサーバーエラーとなりました。
ちゃんとブロックできているようです!





その他、WAFのルール設定は
WEBアプリケーション ファイアウォール > ルール設定・ルール詳細
から可能です。

f:id:nextscape_blog:20210910224046p:plain




まとめ


現在は、WebAppsへ接続する為のApplicationGatewayの設定は、ポータルから出来ずPowerShellのみになりますが、
PowerShellの内容を見る限り、[HTTP設定][正常性プローブ]にWebAppsへの接続可能にするスイッチが実装されれば、ポータルから作成可能になるのではないかと思います(予想)
対応すれば、PowerShellが苦手な人も作りやすくなりますね!

f:id:nextscape_blog:20210910224108p:plain




弊社ではAzureコンサルティングやセミナーなど行っております。

NextscapeのAzure -クラウド開発/導入/教育/コンサルティング

問い合わせ 

 

■Azure関連記事
Azure の OCR の日本語認識力徹底調査
予約インスタンス登場!!お安くなった Azure VM を使いこなそう!!
サービスエンドポイントを使ってStorageに外部接続制限をしてみた
...Azure関連記事一覧へ