AzureCLI でファイアウォールポリシーを利用するAzureFirewall(クラシックではないAzureFirewall)を作成してみました。
事前準備
AzureFirewallを作成するにあたって事前に作成が必要な以下のリソースを作成していきます。
今回は ファイアウォールポリシーを利用した AzureFirewall を作成しますので、ファイアウォールポリシーも事前に作成します。
- リソースグループ(ResourceGroup)
- 仮想ネットワーク(VirtualNetwork)
- パブリックIPアドレス(PublicIPAddress)
- ファイアウォールポリシー(FirewallPolicy)
既に作成済みなどであればこれらのリソースの作成は不要です。
リソースグループ作成
以下のコマンドで作成します。
az group create --name <リソースグループ名> --location <リージョン>
・記載例
az group create --name RG-Test-AzureFW --location japaneast
今回は東日本リージョンに作成していきます。
仮想ネットワーク作成
AzureFirewallを作成する場合には、AzureFirewallSubnet という名前のサブネットを作成する必要があり、そのサブネットは /26 のIPアドレスレンジが必要です。
/25などでも作成可能ですが、余計にIPアドレスを利用するためおすすめはしません。
下部の「/25 の AzureFirewallSubnet でも作成は可能」にも試した結果を記載していますので参考にしてください。
以下のコマンドで作成します。
az network vnet create --name <仮想ネットワーク名> `
--resource-group <リソースグループ名> `
--location <リージョン名> `
--address-prefix <仮想ネットワークのIPアドレス帯> `
--subnet-name AzureFirewallSubnet `
--subnet-prefix <AzureFW用サブネットのIPアドレス帯(/26)>
・記載例
az network vnet create --name Vnet-Test `
--resource-group RG-Test-AzureFW `
--location japaneast `
--address-prefix 10.0.0.0/24 `
--subnet-name AzureFirewallSubnet `
--subnet-prefix 10.0.0.0/26
上記ではインターフェースとしてPowershellを利用しているので、改行する際には ` を利用していますが、コマンドプロンプトを利用する場合には、^ を利用する必要がありますのでその点は注意してください。
パブリックIPアドレス作成
AzureFirewallを作成する場合には、SKU は Standard にする必要があります。
以下のコマンドで作成します。
az network public-ip create `
--name <パブリックIPアドレス名> `
--resource-group <リソースグループ名> `
--location <リージョン> `
--allocation-method static `
--sku standard
・記載例
az network public-ip create `
--name pip-Test-AzureFW `
--resource-group RG-Test-AzureFW `
--location japaneast `
--allocation-method static `
--sku standard
ファイアウォールポリシー作成
ポリシーの中にルールも作成します。
今回はネットワークルールで全ての通信を許可するルールを付与します。
以下のコマンドで作成します。
#ポリシーの作成
az network firewall policy create `
--resource-group <リソースグループ名> `
--name <ファイアウォールポリシー名> `
--sku <Basic / Standard / Premium>
#ポリシー内の規則コレクショングループ作成
az network firewall policy rule-collection-group create `
--resource-group <リソースグループ名> `
--policy-name <ファイアウォールポリシー名> `
--name <規則コレクショングループ名> `
--priority <100 ~ 65000>
#規則コレクション内のフィルターコレクション(規則コレクション)の作成
az network firewall policy rule-collection-group collection add-filter-collection `
--resource-group <リソースグループ名> `
--policy-name <ファイアウォールポリシー名> `
--rule-collection-group-name <規則コレクショングループ名> `
--name <規則コレクション名> `
--action <Allow / Deny> `
--collection-priority <100 ~ 65000> `
--rule-type <ApplicationRule / NatRule / NetworkRule> `
--rule-name <ルール名> `
--source-addresses <IPアドレス> `
--destination-addresses <IPアドレス> `
--destination-ports <ポート番号> `
--ip-protocols <Any / ICMP / TCP / UDP>
・記載例
az network firewall policy create `
--resource-group RG-Test-AzureFW `
--name FW-Policy-Test `
--sku Standard
az network firewall policy rule-collection-group create `
--resource-group RG-Test-AzureFW `
--policy-name FW-Policy-Test `
--name RuleCollectionGroup-Test `
--priority 1000
az network firewall policy rule-collection-group collection add-filter-collection `
--resource-group RG-Test-AzureFW `
--policy-name FW-Policy-Test `
--rule-collection-group-name RuleCollectionGroup-Test `
--name Collection-Test `
--action Allow `
--collection-priority 1000 `
--rule-type NetworkRule `
--rule-name All-Allow `
--source-addresses "*" `
--destination-addresses "*" `
--destination-ports "*" `
--ip-protocols Any
ポリシー作成のコマンドを始めて実行すると、以下のように「拡張機能をインストールしていいか?」と聞かれるので Y(yes) でそのまま進めてください。
上記コマンド実行後にも作成されたリソースの詳細がインターフェースに表示されますが、
以下のコマンドでも作成されたリソースを確認できます。
#作成されたポリシーの確認
az network firewall policy list
#作成された規則コレクショングループの確認
az network firewall policy rule-collection-group list `
--resource-group <リソースグループ名> `
--policy-name <ファイアウォールポリシー名>
AzureCLI でファイアウォールポリシーの追加(ルールの追加)をする方法については、
下部の「ファイアウォールポリシーの規則コレクションにルールを追加する」に記載していますので参考にしてください。
AzureFirewall を作成する
事前準備が完了したら AzureFirewall を作成します。
以下のコマンドで作成可能です。
#AzureFirewalの作成
az network firewall create `
--resource-group <リソースグループ名> `
--location <リージョン> `
--name <AzureFirewall名> `
--sku <AZFW_Hub / AZFW_VNet> `
--tier <Basic / Standard / Premium> `
--public-ip <パブリックIPアドレス名> `
--vnet-name <仮想ネットワーク名> `
--conf-name <IP構成名> `
--firewall-policy <ファイアウォールポリシー名>
・記載例
az network firewall create `
--resource-group RG-Test-AzureFW `
--location japaneast `
--name AzureFW-Test `
--sku AZFW_VNet `
--tier Standard `
--public-ip pip-Test-AzureFW `
--vnet-name Vnet-Test `
--conf-name AzureFW-conf-Test `
--firewall-policy FW-Policy-Test
上記コマンド実行後にも作成されたリソースの詳細が表示されますが、
以下のコマンドでも作成されたAzureFirewallの設定を確認することができます。
#作成されたAzureFirewallの確認
az network firewall list
ファイアウォールポリシーの規則コレクションにルールを追加する
以下のコマンドで既存の規則コレクションにルールを追加することができます。
#ポリシー内の規則コレクションにルール追加
az network firewall policy rule-collection-group collection rule add `
--resource-group <リソースグループ名> `
--policy-name <ファイアウォールポリシー名> `
--rule-collection-group-name <規則コレクショングループ名> `
--collection-name <規則コレクション名> `
--rule-type <ApplicationRule / NatRule / NetworkRule> `
--name <ルール名> `
--source-addresses <IPアドレス> `
--destination-addresses <IPアドレス> `
--destination-ports <ポート番号> `
--ip-protocols <Any / ICMP / TCP / UDP>
・記載例
このコマンドでは上記で設定した規則コレクション [Collection-Test] にルールを追加しています。
az network firewall policy rule-collection-group collection rule add `
--resource-group RG-Test-AzureFW `
--policy-name FW-Policy-Test `
--rule-collection-group-name RuleCollectionGroup-Test `
--collection-name Collection-Test `
--rule-type NetworkRule `
--name Test-Add-Rule `
--source-addresses "*" `
--dest-addr "*" `
--destination-ports "*" `
--ip-protocols "TCP"
以下のコマンドで設定されているルールの一覧を確認することができます。
#ポリシー内の規則コレクションのルールの確認
az network firewall policy rule-collection-group collection list `
--resource-group <リソースグループ名> `
--policy-name <ファイアウォールポリシー名> `
--rule-collection-group-name <規則コレクショングループ名>
・記載例
az network firewall policy rule-collection-group collection list `
--resource-group RG-Test-AzureFW `
--policy-name FW-Policy-Test `
--rule-collection-group-name RuleCollectionGroup-Test
やってみて気づいたこと
/25 の AzureFirewallSubnet でも AzureFW は作成可能
/26以外のサブネットで作成したらどうなるのかについても調べてみました。
結論から言うと /25 のサブネットでも作成は可能です。
ただし、/26 で十分とmicrosoftも記載している中で /25 を指定するメリットはないと思うので、
/26 で作成したほうが良いと感じました。
参考:サービスのスケールに応じてファイアウォール サブネットのサイズを変更する必要はありますか。
・/25で作成したAzureFirewallSubnet
・接続されているデバイスに Azurefirewall のIPアドレスが存在
・AzureFirewall でも上記サブネット内のIPアドレスが付与
[ –conf-name ] の指定がないとネットワーク情報が連携されない
AzureCLIで作成する際に少しはまった点ですが、
設定値として「–conf-name(IP構成)」を指定しないと、AzureFWの作成自体は可能ですが、
プライベートIPやパブリックIPの設定値が null の状態でデプロイされます。
・CLIでは「–vnet-name」は指定していますが、作成結果にもネットワーク情報はなく、
・作成されたAzureFWではネットワークに関する情報が null となっている。
なので、[ –conf-name ] の指定をして AzureFirewall を作成する必要があります。
[参考] デフォルトの状態で DefaultNetworkRuleCollectionGroup は利用できない
Azureポータルで操作する際には、規則コレクションを作成する際にデフォルトの規則コレクショングループとして [DefaultNetworkRuleCollectionGroup] を選択できますが、AzureCLIではデフォルトの状態でこの規則コレクショングループを指定して規則コレクションを作成することができません。
明示的に [DefaultNetworkRuleCollectionGroup] を作成する必要があります。
デフォルトの状態で [DefaultNetworkRuleCollectionGroup] を指定して規則コレクションを作成した場合、以下のようなエラー(ResourceNotFound)となります。
・[DefaultNetworkRuleCollectionGroup] を作成する
以下のコマンドで作成することができます。
#ポリシー内の規則コレクショングループ作成
az network firewall policy rule-collection-group create `
--resource-group RG-Test-AzureFW `
--policy-name FW-Policy-Test `
--name DefaultNetworkRuleCollectionGroup `
--priority 500
作成後には [DefaultNetworkRuleCollectionGroup] を利用してルールなどを作成可能となります。
#規則コレクション内のフィルターコレクション(規則コレクション)の作成
az network firewall policy rule-collection-group collection add-filter-collection `
--resource-group RG-Test-AzureFW `
--policy-name FW-Policy-Test `
--rule-collection-group-name DefaultNetworkRuleCollectionGroup `
--name Collection-Test `
--action Allow `
--collection-priority 1000 `
--rule-type NetworkRule `
--rule-name All-Allow-Default `
--source-addresses "*" `
--destination-addresses "*" `
--destination-ports "*" `
--ip-protocols Any
【参考】VM1台とAFWを一括構築するCLIコマンド
上記を参考にしつつ、AFWと疎通確認用VM1台とルートテーブルでVMからインターネット向け通信をAFWに向けるような構成を以下のコマンドで一括作成します。
AFWのSKUは Basic としています。
##VM作成パラメータ
$rg_name = "RG-Test-AFW"
$location = "japaneast"
$vnet_name = "Vnet-Test-AFW"
$vnet_address = "10.16.0.0/24"
$subnet1_name = "Subnet-Client"
$subnet1_address = "10.16.0.0/26"
$subnet_afw_name = "AzureFirewallSubnet"
$subnet_afw_address = "10.16.0.64/26"
$subnet_afw_mgt_name = "AzureFirewallManagementSubnet"
$subnet_afw_mgt_address = "10.16.0.128/26"
$nsg1_name = "NSG-Test-Windows"
$nsgrule_name = "AllowRDP"
$my_gip = (Invoke-WebRequest https://ipinfo.io/ip).content
$nsgrule_sourceip = $my_gip + "/32"
$nsgrule_port = 3389
$nsgrule_priority = 200
$pip1_name = "PIP-VM-Test-Client"
$pip_afw_name = "pip-afw-test"
$pip_afw_mgt_name = "pip-afw-mgt-test"
$nic1_name = "NIC-VM-Test-Client"
$vm1_name = "VM-Test-Client"
$vm1_image = "Win2022Datacenter"
$vm_size = "Standard_B2ms"
$vm_authtype = "password"
$vm_adminname = "xxxxxxxx"
#リソースグループの作成
az group create `
-l $location `
-g $rg_name
#仮想ネットワークの作成とクライアント用サブネットの追加
az network vnet create `
-n $vnet_name `
-g $rg_name `
-l $location `
--address-prefix $vnet_address `
--subnet-name $subnet1_name `
--subnet-prefix $subnet1_address
#AFW用サブネットの追加
az network vnet subnet create `
-g $rg_name `
--vnet-name $vnet_name `
-n $subnet_afw_name `
--address-prefixes $subnet_afw_address
az network vnet subnet create `
-g $rg_name `
--vnet-name $vnet_name `
-n $subnet_afw_mgt_name `
--address-prefixes $subnet_afw_mgt_address
#NSGの作成
az network nsg create `
-n $nsg1_name `
-g $rg_name
#NSGのルール追加
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg1_name `
-n $nsgrule_name `
--source-address-prefixes $nsgrule_sourceip `
--destination-port-range $nsgrule_port `
--priority $nsgrule_priority
#NSGをサブネットに適用
az network vnet subnet update `
-g $rg_name `
-n $subnet1_name `
--vnet-name $vnet_name `
--network-security-group $nsg1_name
#VM用パブリックIPの作成
az network public-ip create `
-n $pip1_name `
-g $rg_name
#ネットワークインターフェースの作成
az network nic create `
-n $nic1_name `
-g $rg_name `
--vnet-name $vnet_name `
--subnet $subnet1_name `
--public-ip-address $pip1_name
#仮想マシンの作成
az vm create `
-n $vm1_name `
-g $rg_name `
--image $vm1_image `
--size $vm_size `
--nics $nic1_name `
--authentication-type $vm_authtype `
--admin-username $vm_adminname
##AzureFirewall関連リソースのパラメータ
$afw_policy_name = "afw-policy-test"
$collectiongroup_name = "collection-test-001"
$collectiongroup_priority = 1000
$collection_name = "collection-test-001"
$Action = "Allow"
$collection_priority = 1000
$rule_type = "ApplicationRule"
$rule1_name = "Allow-Internet"
$rule1_destination_fqdns = "*"
$rule1_destprotocol1 = "Https=443"
$afw_name = "afw-test"
$afw_conf_name = "conf-afw-test"
$afw_mgt_conf_name = "conf-afw-mgt-test"
$routetable_name = "rt-test-afw"
$rt_route1_name = "route_to_myself"
$rt_route2_name = "route_to_internet"
$destiprange = "0.0.0.0/0"
#AzureFirewallポリシーの作成
az network firewall policy create `
--resource-group $rg_name `
--name $afw_policy_name `
--sku Basic
#ポリシー内の規則コレクショングループ作成
az network firewall policy rule-collection-group create `
--resource-group $rg_name `
--policy-name $afw_policy_name `
--name $collectiongroup_name `
--priority $collectiongroup_priority
#規則コレクション内のフィルターコレクション(規則コレクション)の作成
az network firewall policy rule-collection-group collection add-filter-collection `
--resource-group $rg_name `
--policy-name $afw_policy_name `
--rule-collection-group-name $collectiongroup_name `
--name $collection_name `
--action $Action `
--collection-priority $collection_priority `
--rule-type $rule_type `
--rule-name $rule1_name `
--source-addresses $subnet1_address `
--target-fqdns $rule1_destination_fqdns `
--protocols $rule1_destprotocol1
#AFW用パブリックIPの作成
az network public-ip create `
-n $pip_afw_name `
-g $rg_name `
--allocation-method Static `
--sku Standard
#AFW管理用パブリックIPの作成
az network public-ip create `
-n $pip_afw_mgt_name `
-g $rg_name `
--allocation-method Static `
--sku Standard
#AzureFirewalの作成(tierはBasic)
az network firewall create `
--resource-group $rg_name `
--location $location `
--name $afw_name `
--sku AZFW_VNet `
--tier Basic `
--public-ip $pip_afw_name `
--vnet-name $vnet_name `
--conf-name $afw_conf_name `
--m-conf-name $afw_mgt_conf_name `
--m-public-ip $pip_afw_mgt_name `
--firewall-policy $afw_policy_name
#ルートテーブルの作成
az network route-table create `
-g $rg_name `
-n $routetable_name
#ルートテーブルをSubnet-Clientに適用
az network vnet subnet update `
-g $rg_name `
-n $subnet1_name `
--vnet-name $vnet_name `
--route-table $routetable_name
#ルートテーブルのルートを作成(自分のグローバルIPはAFW経由しない)
az network route-table route create `
-g $rg_name `
-n $rt_route1_name `
--route-table-name $routetable_name `
--address-prefix $nsgrule_sourceip `
--next-hop-type Internet
#ルートテーブルのルートを作成(インターネット向け通信をAFW経由にする)
$afw_conf_info = az network firewall ip-config show -g $rg_name -f $afw_name -n $afw_conf_name | ConvertFrom-Json
$afw_privateip = $afw_conf_info.privateIpAddress
az network route-table route create `
-g $rg_name `
-n $rt_route2_name `
--route-table-name $routetable_name `
--address-prefix $destiprange `
--next-hop-ip-address $afw_privateip `
--next-hop-type VirtualAppliance