AzureBastionを作成してNSGで送信元制御してみた

AzureCLI AzureBastion
この記事は約13分で読めます。

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ポータル上の表示での確認

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」という表示が出て作成できませんでした。

「BastionHostPublicIPNotStandard」という表示が出て作成できない

これはAzureBationのSKUを Basic として指定しても同じでした。

なのでBastionを作成する際にはパブリックIPは Standard を利用する必要があります

2.NSGで送信元制御できるか試してみる

BastionSubnetにはNSGを設定することが可能です。

そしてそのNSGで送信元IPの制御が可能です。

ただし、BastionSubnetに紐づけるNSGは特定の受信ルール/送信ルールが設定されていないと紐づけることができません。

2-1.Bastion用のNSGを作成する

まず、BastionのNSGを作成して、BastionSubnetに紐づけます。

今回は上記で作成したBastionをそのまま利用します。

追加する受信ルール/送信ルールは以下の記事をもとに作成しています。

Azure Bastion で VM と NSG を使用する
Azure 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で送信元制御が可能でした。