見出し画像

Azure Firewall を使って通信を制限してみよう!

VNet の通信を制御するマネージドネットワークファイアウォールサービスである 『 Azure Firewall 』 ご存じでしょうか?
NSG とは異なるファイアウォールなのです。

マネージド仮想アプライアンスとして提供されるので構築や運用が楽ですし、多様なルールでフィルタリングを実現できます。

Azure Firewall は、Azure で実行されているクラウド ワークロードに最高レベルの脅威保護を提供する、クラウドネイティブでインテリジェントなネットワーク ファイアウォールのセキュリティ サービスです。

Azure Firewall とは | Microsoft Docs

セキュリティに対する階層型アプローチとして多層防御を行うことは大変重要ですが、その中の一つの層であるネットワークの部分で大いに関わってくるサービスです。

ということで今回は、ルートテーブルをカスタマイズしてユーザー定義ルート ( UDR ) を作成し、特定のサブネットからインターネットへの通信を Azure Firewall で検査(制御)してみたいと思います。

準備した環境

作成する環境のイメージとしては以下の図になります。

Azure Firewall に関連する Bicep での記述

VNet

以下のように三つのサブネットを持つ VNet を作成します。
Jump-SN は踏み台サーバー用サブネットですので、別に用意しなくても良いのですが今回はあえて作成することにしました。もしくはここは、Bastion という選択肢もあります。

Azure Firewall ( 仮想アプライアンス ) がデプロイされるサブネットは、『 AzureFirewallSubnet 』 という名前で専用のものを作成する必要があります。

あと、後述するルートテーブルをワークロードサブネット ( Workload-SN ) に紐づけます。 ( ⭐ )

param virtualNetworks_Test_FW_VN_name string = 'Test-FW-VN' 
param location string

var azureFWSNaddressPrefix = '10.0.1' 
var WorkloadSNaddressPrefix = '10.0.2'
var JumpSNaddressPrefix = '10.0.3'

resource virtualNetworks_Test_FW_VN_name_resource 'Microsoft.Network/virtualNetworks@2018-12-01' = { 
  name: virtualNetworks_Test_FW_VN_name 
  location: location 
  properties: { 
    provisioningState: 'Succeeded' 
    addressSpace: { 
      addressPrefixes: [ 
        '10.0.0.0/16' 
      ] 
    } 
    subnets: [ 
      { 
        name: 'AzureFirewallSubnet' 
        properties: { 
          provisioningState: 'Succeeded' 
          addressPrefix: '${azureFWSNaddressPrefix}.0/24' 
          delegations: [] 
        } 
      } 
      { 
        name: 'Workload-SN' 
        properties: { 
          provisioningState: 'Succeeded' 
          addressPrefix: '${WorkloadSNaddressPrefix}.0/24' 
          routeTable: { 
            id: routeTable.id // ⭐
          } 
          serviceEndpoints: [] 
          delegations: [] 
        } 
      } 
      { 
        name: 'Jump-SN' 
        properties: { 
          provisioningState: 'Succeeded' 
          addressPrefix: '${JumpSNaddressPrefix}.0/24' 
          serviceEndpoints: [] 
          delegations: [] 
        } 
      } 
    ] 
    virtualNetworkPeerings: [] 
    enableDdosProtection: false 
    enableVmProtection: false 
  } 
}

仮想アプライアンス関連リソース

1️⃣ Azure Firewall ( 仮想アプライアンス ) 用のパブリックIP
2️⃣ Azure Firewall ( 仮想アプライアンス )
というリソースを二つ作成します。
1️⃣ は当然 2️⃣ に紐づけます。

✅ Firewall tier は今回 Standard として、ネットワークルール ( ♠ ) とアプリケーションルール ( ♣ ) を構成します。

♠ では、ポート 53 ( DNS ) の 2つの IPアドレスへの送信アクセスを許可するネットワーク規則を作成します。
なお、Google のパブリックDNSサービスの IPアドレス ( ✨ ) を参照させることにしました。

♣ では note のサイト ( 💡 note.com ) への送信アクセスを許可するアプリケーション ルールを作成します。他のサイトへは許可されません。

そしてこれらのルールのソースは、ワークロードサブネット ( Workload-SN ) のもの ( 10.0.2.0/24 ) を指定します。

resource fireWallPIP 'Microsoft.Network/publicIPAddresses@2022-01-01' = { // 1️⃣
  name: 'Test-FW-PIP' 
  location: location 
  sku: { 
    name: 'Standard' 
    tier: 'Regional' 
  } 
  properties: { 
    publicIPAddressVersion: 'IPv4' 
    publicIPAllocationMethod: 'Static' 
    idleTimeoutInMinutes: 4 
  } 
}

resource fireWall 'Microsoft.Network/azureFirewalls@2022-01-01' = { // 2️⃣
  name: 'Test-FW01' 
  location: location 
  properties: { 
    sku: { 
      name: 'AZFW_VNet' 
      tier: 'Standard' // ✅
    } 
    threatIntelMode: 'Alert' 
    additionalProperties: {} 
    ipConfigurations: [ 
      { 
        name: 'Test-FW-PIP' 
        properties: { 
          publicIPAddress: { 
            id: fireWallPIP.id 
          } 
          subnet: { 
            id: virtualNetworks_Test_FW_VN_name_resource.properties.subnets[0].id 
          } 
        } 
      } 
    ] 
    networkRuleCollections: [ // ♠ 
      { 
        name: 'Net-Coll01' 
        properties: { 
          priority: 200 
          action: { 
            type: 'Allow' 
          } 
          rules: [ 
            { 
              name: 'AllowDNS' 
              protocols: [ 
                'UDP' 
              ] 
              sourceAddresses: [ 
                virtualNetworks_Test_FW_VN_name_resource.properties.subnets[1].properties.addressPrefix 
              ] 
              destinationAddresses: [ // ✨
                '8.8.8.8' 
                '8.8.4.4' 
              ] 
              destinationPorts: [ 
                '53' 
              ] 
            } 
          ] 
        } 
      } 
    ] 
    applicationRuleCollections: [ // ♣ 
      { 
        name: 'App-Coll01' 
        properties: { 
          priority: 200 
          action: { 
            type: 'Allow' 
          } 
          rules: [ 
            { 
              name: 'AllowGH' 
              protocols: [ 
                { 
                  protocolType: 'Http' 
                  port: 80 
                } 
                { 
                  protocolType: 'Https' 
                  port: 443 
                } 
              ] 
              fqdnTags: [] 
              targetFqdns: [ 
                'note.com' // 💡
              ] 
              sourceAddresses: [ 
                virtualNetworks_Test_FW_VN_name_resource.properties.subnets[1].properties.addressPrefix 
              ] 
              sourceIpGroups: [] 
            } 
          ] 
        } 
      } 
    ] 
    natRuleCollections: [] 
  } 
}

ルートテーブル ( UDR )

本来はルートテーブルは Azure ( Microsoft ) によって管理されるためユーザー側は管理しなくて良いですが、今回のような場合にはカスタマイズが必要です。つまりユーザー定義ルート ( UDR ) を作成します。
仮想アプライアンスをデフォルトゲートウェイとするので 👈 のようにしました。
また、前述したとおりワークロードサブネット ( Workload-SN ) に関連付けされています。

resource routeTable 'Microsoft.Network/routeTables@2022-01-01' = { 
  name: 'FireWall-route' 
  location: location 
  properties: { 
    disableBgpRoutePropagation: false 
    routes: [ 
      { 
        name: 'FW-DG' // ユーザー定義ルート 
        properties: { 
          addressPrefix: '0.0.0.0/0' 
          nextHopType: 'VirtualAppliance' // 👈
          nextHopIpAddress: '${azureFWSNaddressPrefix}.4' // 👈
          hasBgpOverride: false 
        } 
      } 
    ] 
  } 
}

今回定義したルーティングが追加されている事をさらに確認してみます。
既定のインターネットに抜ける通信が無効になり、全てファイアウォールを経由するようになっています。

試してみる

アプリケーションルール ( ♣ ) のとおり note.com ( 💡 ) を表示できるか試してみます。

はい、ちゃんと表示できました。

では、許可登録のない FQDN ( 今回は例として Azure portal ) を参照しようとすると、もちろん拒否されて表示できませんでした。

🟠 さいごに 🔚

はい、ということでインターネットへの通信をルールでフィルタリングして制御することができました。

今回の内容はインターネットへの通信でしたが、もちろん別のサブネットへの通信を一旦ファイアウォールで検査するといった使い方もできます。

今後も Azure に関する技術情報やその他の資格試験に関する記事を書いていこうと思いますので、よろしければフォローをお願いします🔆

また、この記事が少しでもタメになった、面白かったという方がいらっしゃいましたら、ぜひ 「 スキ 」 ボタンのクリックをお願いします😋

最後までお読みいただきありがとうございました 😊

▶ 続けて読むのにおススメな記事

▶ おススメ Azure 学習書籍


この記事が参加している募集

スキしてみて

やってみた

もしこの記事が何かの参考になったもしくは面白かったという方は、応援していただけると大変嬉しいです😊 これからもよろしくお願いします。