AzureCLI でAzureBastionを作成してNSGで送信元制御を試してみました。
AzureBastionの作成にはAzureBastionSubnet という名前のサブネットを作成する必要があったり、利用するパブリックIPのSKUが Basic のリソースを指定して作成するとエラーとなったりいくつか注意点もあるのでその点もまとめてみました。
1.AzureBastion をAzureCLIで作成する
1-1.事前準備
AzureBastionを作成するにあたって事前に作成が必要な以下のリソースを作成していきます。
- リソースグループ(ResourceGroup)
- 仮想ネットワーク(VirtualNetwork)
- パブリックIPアドレス(PublicIPAddress)
既に作成済みなどであればこれらのリソースの作成は不要です。
# パラメータ定義
$rg_name = "RG-Test-AzureBastion"
$location = "japaneast"
$vnet_name = "Vnet-Test"
$subnet_name = "AzureBastionSubnet"
$vnet_address_range = "10.0.0.0/24"
$subnet_address_range = "10.0.0.0/26"
$pip_name = "pip-Test-AzureBation"
# RG作成
az group create `
--name $rg_name `
--location $location
# Vnet作成
az network vnet create `
--name $vnet_name `
--resource-group $rg_name `
--location $location `
--address-prefix $vnet_address_range `
--subnet-name $subnet_name `
--subnet-prefix $subnet_address_range
# パブリックIP作成
az network public-ip create `
--name $pip_name `
--resource-group $rg_name `
--location $location `
--allocation-method static `
--sku standard
今回は東日本リージョンに作成していきます。
上記ではインターフェースとしてPowershellを利用しているので、改行する際には ` を利用していますが、コマンドプロンプトを利用する場合には、^ を利用する必要がありますのでその点は注意してください。
1-1-1. [注意点] AzureBastionSubnetの最小レンジは/26
AzureBastionを作成する場合には、AzureBastionSubnet という名前のサブネットを作成する必要があり、そのサブネットは最小でも /26 のIPアドレスレンジが必要です。
/25 や /24 でも作成可能ですが、現時点では余計にIPアドレスを利用することになるためおすすめはしません。
1-1-2. [注意点] パブリックIPのSKUはStandardが必須
今回パブリックIPのSKU は Standard で作成します。
逆に Basic を指定して作成するとエラーとなりBastionを作成できません。
詳細は下部の「3-2.パブリックIPの SKU が Basic だと AzureBastion を作成できない」に記載しています。
また、パブリック IP アドレスは Bastion リソースと同じリージョン内にする必要があります。
1-2.AzureBastionの作成
事前準備が完了したら AzureBastion を作成します。
以下のコマンドで作成可能です。
$bastion_name = "bas-test"
# Bastionの作成
az network bastion create `
--resource-group $rg_name `
--location $location `
--name $bastion_name `
--vnet-name $vnet_name `
--public-ip-address $pip_name
上記コマンド実行後にも作成されたリソースの詳細が表示されますが、
以下のコマンドでも作成されたAzureBastionの設定を確認することができます。
# 作成されたAzureBastionの確認
az network bastion list
1-3.やってみて気づいたこと
1-3-1.デフォルトで作成される AzureBastion のSKUは Standard
コマンドで作成する際にSKUを指定せずにAzureBastionを作成すると、SKUはStandardで作成されます。
・コマンド実行後の表示での確認

・Azureポータル上の表示での確認

なので、Basicを利用したい場合にはコマンドのパラメータで明示的にSKUを指定する必要があります。
1-3-2.パブリックIPの SKU が Basic だと AzureBastion を作成できない
パブリックIPの SKU が Basic だと AzureBastion を作成できません。
試しにパブリックIPのSKUを Basic として、以下のコマンドで Bastionを作成してみましたが、
# パブリックIPを basic で作成
az network public-ip create `
--name pip-Test-AzureBation-basic `
--resource-group RG-Test-AzureBastion `
--location japaneast `
--allocation-method static `
--sku basic
# Bastionを作成
az network bastion create `
--resource-group RG-Test-AzureBastion `
--location japaneast `
--name AzureBation-Test `
--vnet-name Vnet-Test `
--public-ip-address pip-Test-AzureBation-basic
以下のように「BastionHostPublicIPNotStandard」という表示が出て作成できませんでした。

これはAzureBationのSKUを Basic として指定しても同じでした。
なのでBastionを作成する際にはパブリックIPは Standard を利用する必要があります。
2.NSGで送信元制御できるか試してみる
BastionSubnetにはNSGを設定することが可能です。
そしてそのNSGで送信元IPの制御が可能です。
ただし、BastionSubnetに紐づけるNSGは特定の受信ルール/送信ルールが設定されていないと紐づけることができません。
2-1.Bastion用のNSGを作成する
まず、BastionのNSGを作成して、BastionSubnetに紐づけます。
今回は上記で作成したBastionをそのまま利用します。
追加する受信ルール/送信ルールは以下の記事をもとに作成しています。

$nsg_name = "nsg-BastionSubnet"
$rg_name = "RG-Test-AzureBastion"
$location = "japaneast"
$vnet_name = "Vnet-Test"
$subnet_name = "AzureBastionSubnet"
# NSGの作成
az network nsg create `
-n $nsg_name `
-g $rg_name
# BastionサブネットのNSGに必要な通信要件の追加(受信ルール)
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg_name `
-n "AllowHttpsInbound" `
--source-address-prefixes "Internet" `
--destination-port-range 443 `
--protocol "Tcp" `
--priority 220
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg_name `
-n "AllowGatewayManagerInbound" `
--source-address-prefixes "GatewayManager" `
--destination-port-range 443 `
--protocol "Tcp" `
--priority 230
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg_name `
-n "AllowAzureLoadBalancerInbound" `
--source-address-prefixes "AzureLoadBalancer" `
--destination-port-range 443 `
--protocol "Tcp" `
--priority 240
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg_name `
-n "AllowBastionHostCommunication" `
--source-address-prefixes "VirtualNetwork" `
--destination-address-prefixes "VirtualNetwork" `
--destination-port-range 8080 5701 `
--protocol "*" `
--priority 250
# BastionサブネットのNSGに必要な通信要件の追加(送信ルール)
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg_name `
--direction "Outbound" `
-n "AllowSshRdpOutbound" `
--source-address-prefixes "*" `
--destination-address-prefixes "VirtualNetwork" `
--destination-port-range 22 3389 `
--protocol "*" `
--priority 220
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg_name `
--direction "Outbound" `
-n "AllowAzureCloudOutbound" `
--source-address-prefixes "*" `
--destination-address-prefixes "AzureCloud" `
--destination-port-range 443 `
--protocol "Tcp" `
--priority 230
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg_name `
--direction "Outbound" `
-n "AllowBastionCommunication" `
--source-address-prefixes "VirtualNetwork" `
--destination-address-prefixes "VirtualNetwork" `
--destination-port-range 8080 5701 `
--protocol "*" `
--priority 240
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg_name `
--direction "Outbound" `
-n "AllowHttpOutbound" `
--source-address-prefixes "*" `
--destination-address-prefixes "Internet" `
--destination-port-range 80 `
--protocol "*" `
--priority 250
# NSGをBastionサブネットに適用
az network vnet subnet update `
-g $rg_name `
-n $subnet_name `
--vnet-name $vnet_name `
--network-security-group $nsg_name
2-2.NSGで送信元を制御する
BastionSubnetにNSGを紐づけたらルールを追加して送信元制御できるかを試していきます。
2-2-1. AllDenyルールを入れると通信できない
まずAllDenyのルールを追加して、通信できるかを試します。
# AllDenyのルールを追加
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg_name `
-n "DenyAllInbound" `
--source-address-prefixes "*" `
--destination-port-range * `
--protocol "*" `
--priority 350
画面がないので伝わりづらいですが、この設定を入れるとID/PWを利用してBastionで接続した際に、白い画面になり接続ができない状態になります。
2-2-2.特定のIPのみ許可するルールを追加すると通信可能
次に自分の端末のGIPだけを許可して通信できるかを試します。
$my_gip = (Invoke-WebRequest https://ipinfo.io/ip).content
# 自分のグローバルIPのルールを追加
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg_name `
-n "AllowMyIpInbound" `
--source-address-prefixes $my_gip `
--destination-port-range * `
--protocol "*" `
--priority 300
これを設定すると、先ほどまでは白い画面となり繋がらなかったですが、正常にVMにつながるようになります。
BastionはNSGで送信元制御が可能でした。