Young Leaves

Azure Bastion を使用しピアリングした仮想ネットワーク内の仮想マシンに接続する

今回はAzure 上の仮想マシンに接続するための踏み台を提供するAzure Bastion を使い、ピアリングしている仮想ネットワーク内の仮想マシンに接続する方法について説明します。

Azure Bastion とは

Azure Bastion とは、Azure Portal から仮想ネットワークのサブネット内にある仮想マシンへ接続する踏み台を提供するサービスです。Azure Bation は従来の踏み台サーバと比較し、以下のような特徴があります。

  • ブラウザのHTTPS 接続(443番ポート)を使用して接続するため、SSH/RDP のクライアントは不要
  • Azure の仮想マシンでは、パブリックIP アドレスのない仮想マシンにアクセスできる
  • NSG の設定が不要
  • 踏み台用の仮想マシン構築が不要となる

そのため、Azure Bastion を使用することで仮想マシンへの踏み台を簡単に作成することができます。Azure Bation にはBasic とStandard の2つのSKU があります。2つのSKU の違いについては以下の通りです。

Basic、Standard 共通

  • ピアリングを利用したVM へのアクセス
  • Key Vault を使用したSSH 接続
  • SSH を使用したLinux VM へのアクセス
  • RDP を使用したWindows VM へのアクセス

Standardのみ可能

  • ホストのスケーリング
  • カスタム受信ポートの指定
  • SSH を使用したWindows VM へのアクセス
  • RDP を使用したLinux VM へのアクセス

規模の大きい環境の踏み台作成や独自の受信ポートを設定したい場合にはStandard を設定し、それ以外はBasic を設定します。

今回の構成

今回作成する構成は以下の通りです。VNET1 とVNET2 でピアリング接続させ、Azure Bastion でVNET1 の仮想マシンとVNET2 の仮想マシンのどちらでもアクセスできるように構成します。

Azure Bastion 設定時の注意

Azure Bastion を作成するには、以下のものが必要となります。

  • /26 以上のサブネットを持っている
  • サブネット名がAzureBationSubnet である
  • パブリックIP のSKU がStandard である

上記を満たしていないとAzure Bastion を作成できないため注意が必要です。

Azure Bastion の設定

今回は構成図のリソース作成をCloud Shell から行い、Bastion の接続につきましてはAzure Portal を使用して行います。仮想ネットワーク、サブネット、仮想マシン、Bastion の作成を行うコマンドは以下の通りです。

# 変数定義
RESOURCE_GROUP="test-rg1"
VNET_NAME1="test-vnet1"
VNET_NAME2="test-vnet2"
SUBNET_NAME1="subnet1"
SUBNET_NAME2="subnet2"
BASTION_SUBNET_NAME="AzureBastionSubnet"
PEERING_NAME1="test-peering1"
PEERING_NAME2="test-peering2"
BASTION_NAME="test-bastion1"
PUBIP_NAME="test-pubip1"
VM_NAME1="test-vm1"
VM_NAME2="test-vm2"
VM_USER="azureuser"
LOCATION="japaneast"

# リソースグループを作成
az group create -g $RESOURCE_GROUP -l $LOCATION

# 仮想ネットワークおよびサブネットの作成
# Azure Bastion用のサブネットは別途作成
az network vnet create -n $VNET_NAME1 \
    -g $RESOURCE_GROUP \
    -l $LOCATION \
    --address-prefixes 10.10.0.0/16 \
    --subnet-name $SUBNET_NAME1 \
    --subnet-prefixes 10.10.0.0/24

az network vnet create -n $VNET_NAME2 \
    -g $RESOURCE_GROUP \
    -l $LOCATION \
    --address-prefixes 10.20.0.0/16 \
    --subnet-name $SUBNET_NAME2 \
    --subnet-prefixes 10.20.0.0/24

az network vnet subnet create -n $BASTION_SUBNET_NAME \
    -g $RESOURCE_GROUP \
    --address-prefixes 10.10.10.0/26 \
    --vnet-name $VNET_NAME1

# 仮想ネットワーク間でピアリング接続を作成
# ピアリング接続は両方の仮想ネットワークで接続させる必要がある
az network vnet peering create -n $PEERING_NAME1 \
    -g $RESOURCE_GROUP \
    --vnet-name $VNET_NAME1 \
    --remote-vnet $VNET_NAME2 \
    --allow-forwarded-traffic \
    --allow-vnet-access

az network vnet peering create -n $PEERING_NAME2 \
    -g $RESOURCE_GROUP \
    --vnet-name $VNET_NAME2 \
    --remote-vnet $VNET_NAME1 \
    --allow-forwarded-traffic \
    --allow-vnet-access

# Bastion用のPublicIPアドレスを作成
# SKUをStandardにしないとBastion作成時にエラーとなる
az network public-ip create -n $PUBIP_NAME \
    -g $RESOURCE_GROUP \
    --sku Standard

# Azure Bastionを作成
# Azure CLIで作成するとSKUがStandardになる
az network bastion create -n $BASTION_NAME \
    -g $RESOURCE_GROUP \
    --public-ip-address $PUBIP_NAME \
    --vnet-name $VNET_NAME1

# 仮想マシンの作成
# Bastionのみ接続可能にするためPublic IPアドレスを空にする
az vm create --name $VM_NAME1 \
    --resource-group $RESOURCE_GROUP \
    --image UbuntuLTS \
    --vnet-name $VNET_NAME1 \
    --subnet $SUBNET_NAME1 \
    --public-ip-address "" \
    --admin-username $VM_USER \
    --generate-ssh-keys

az vm create --name $VM_NAME2 \
    --resource-group $RESOURCE_GROUP \
    --image UbuntuLTS \
    --vnet-name $VNET_NAME2 \
    --subnet $SUBNET_NAME2 \
    --public-ip-address "" \
    --admin-username $VM_USER \
    --generate-ssh-keys

仮想マシンの作成完了後、仮想マシンの秘密鍵を表示し文字列をエディタ等にメモしておきます。

# 秘密鍵を表示する
# 表示された文字列を全てコピーする
cat .ssh/id_rsa

Azureリソースの作成が一通り完了したら、Azure Portalから作成した仮想マシンを選択し「接続」から「Bastion」をクリックします。

Bastion 選択後、SSH 接続のユーザー名と秘密鍵の文字列を入力し「接続」をクリックします。

test-vm1のコンソールが表示されれば接続成功となります。

ピアリング接続を行っているtest-vm2も同様の手順で接続を行い、以下のコンソールが接続できれば接続成功となります。

ピアリング接続やアクセス権限が正しく設定できていない場合、接続時にAzure Basion の作成画面が表示されるため、以下のような画像が表示されたらピアリング等の設定を再度確認してみましょう。

全ての操作が終了したらリソースをクリーンアップします。

# リソースのクリーンアップ
az group delete -n $RESOURCE_GROUP

まとめ

  • Azure Bastion はAzure の仮想マシンへ接続するための踏み台サーバの役割を提供するサービス
  • Azure Basion 作成時には/26 以上のサブネット、サブネット名がAzureBationSubnet、Standard のパブリックIP が必要
  • 仮想ネットワーク間でピアリング接続があれば、ピアリング先の仮想ネットワークの仮想マシンにも接続可能
  • ピアリング接続やアクセス権限が正しく設定されていないと、ピアリング先の接続でBastion の作成を促されるため、うまく接続できない際は設定を確認する

参考資料