0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Azure Webapp をセキュアにする(プライベートエンドポイント、ApplicationGateway、WAF、NSG)

Last updated at Posted at 2024-12-22

概要

  • 以下のような構成です
    • webapp のパブリックアクセスを遮断して、ApplicationGateway からプライベートエンドポイント経由にします
    • 受信規則を WAF、送信規則を NSG か FW で作成します
      • やり方は一応どちらも調べたのですが、FW は料金がすごく高くて(月10万ぐらい)今回の場合は NSG で対応出来そうだったので NSG で進めます
  • 送信規則を NSG で作成した場合
    • FQDN で規則を作成出来ないので、送信先の IP が変わったり、一つの FQDN に大量の IP が存在する場合に設定が面倒くさい
    • 無料
  • 送信規則を Firewall で作成した場合
    • FQDN による規則を作成出来る(Standard 以上)
    • 料金が高い(月10万円超え)
  • デプロイ時の pip install も pypi.org の送信規則許可が必要で、IP を許可する事で pip install 出来ますが、FQDN で設定出来ない NSG は IP が変わる度に設定を更新する必要がありそうです

image.png

リソース作成

  • 各リソースを作成します

VirtualNetwork

  • VNET を 3 つ作成します
    • 動作確認のため NSG, FW 用をどちらも作っていますが、初めからどちらでやるか決めている場合は片方の作成で良いです
  • リージョンは揃えます

image.png

  • プライベートエンドポイント用にサブネットを作成します

image.png

  • FW 用にサブネットを 2 つ作成します

image.png

Webアプリ

  • AppService プランを作ります
    image.png
  • web アプリを作ります
    image.png
  • 適当なリクエストするアプリを作ります
app.py
import requests
import gradio as gr

def request(input: str):
    try:
        r = requests.get(input, timeout=(3.0, 5.0))
        return r.text
    except Exception as e:
        return e

demo = gr.Interface(
    fn=request,
    inputs=[gr.Textbox(value="https://pypi.org/")],
    outputs=["text"],
    flagging_mode="never"
)

demo.launch(server_port=8000, server_name='0.0.0.0')
requirements.txt
gradio==5.8.0
requests==2.32.3
  • 以下通りにデプロイします

統合する VNET は NSG, FW どちらか利用する方を選択して下さい

image.png

NetworkSecurityGroups

  • NSG を作ります
    image.png

  • サブネットと関連付けします
    image.png

  • デフォルトの設定では外部(Internet)の送信が全て許可となっているので、全て拒否(下記画像の優先度:200 のルール)を追加すると、下記のようにデプロイ時の pip install で失敗します

    • 下記画像の優先度 180, 181,( 190,191 は無くても良いかも)の pypi に関する規則を追加するとインストールが正常に完了して、アプリを立ち上げられました

image.png
image.png

Firewall

web アプリの VNET 統合を FW のサブネットに設定してください
NSG のサブネットと統合している場合は切断して付け替えます

image.png

  • 公式ページを参考に作っていきます
    https://learn.microsoft.com/ja-jp/azure/app-service/network-secure-outbound-traffic-azure-firewall

  • FW を作ります

    • ポリシー、管理パブリック IP は適当な名前で新規作成しました
    • DNS を使えるようにする設定は Standard 以上で可能す(Basic では FQDN による規則が作れなさそうでした。Firewall の Basic を使うなら NGS の方が無料・シンプルで良いかもしれないです)

image.png

  • ルートテーブルを作ります
    • ゲートウェイのルートを伝達する:No にします

image.png

  • ルートを追加します
  • 「次ホップ IP アドレス」は FW のプライベート IP アドレスです

image.png

  • サブネットを関連付けします
  • web アプリで VNET 統合したサブネットを選択します
    image.png
メモ 実施不要

DNS サーバを有効にした場合にリクエストが飛ばせなかった
時間切れなのでメモ

  • DNS Proxy を「有効」にします
  • 送信規則で FQDN を設定するために必要です

image.png

FW ポリシーを更新

  • VNET 統合したサブネットから全ての送信を拒否してみます
    • ソースはアプリのプライベート IP 指定でも良いみたいです
      image.png
  • リクエストは飛ばなくなります
    image.png
  • pypi の IP を許可するとリクエストが飛びます(優先度は値が低い方が優先されます)
    image.png

ApplicationGateway

image.png

  • この時点では web アプリのパブリックアクセスが有効であれば、ApplicationGateway に設定したパブリック IP にアクセスする事で web サイトが表示されます

ApplicationGateway の動作確認(web アプリのパブリックアクセス無効化~)

事前準備

  • web アプリのパブリックアクセスを無効化します
    image.png

  • web アプリのネットワーク設定から、プライベートエンドポイントを作成します
    image.png

アクセスして確認

az network application-gateway stop --resource-group rgname --name app-gatewayname
az network application-gateway start --resource-group rgname --name app-gatewayname
  • https://[webアプリ名].japanwest-01.azurewebsites.net/ にアクセスすると web アプリのネットワーク設定によりブロックされます
    image.png

  • ApplicationGateway に設定したパブリック IP にアクセスすると web ページが表示され……ますが css のロードが上記 URL なのでうまくいきません…

  • なぜか書き換えがうまくいっていないようです

image.png
image.png

受信規則の設定

  • WAF のモードを「検出」から「防止」に変更します
    image.png

  • WAF ポリシーから受信規則を設定します

    • 指定した IP を含まない場合は全て拒否と設定
      image.png
    • 指定した IP の場合(許可)
      image.png
    • 指定した IP ではない場合(拒否)
      image.png
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?