All Articles

Azure Bastion を使って Azure VM にセキュアにリモートアクセスできる環境を作る

AZ-500 の勉強をしていたところ、Azure Bastion を使うと Azure VM にパブリック IP を割り当てなくても RDP や SSH によるリモートアクセスをできるようになるということを知りました。

また、Azure Bastion を使うとホストを VM に接続しなくても Azure ポータル上から操作ができるようになるとのことで、これはさっそく構築するしかないと思い実践してみました。

今回は、Azure Bastion でリモートアクセスできる環境を構築した際のメモをまとめます。

もくじ

Azure Bastion とは

Azure Bastion は、Virtual network にデプロイされ、Azure VM に対する RDP、SSH 接続を可能にするフルマネージドなサービスです。

Azure Bastion を使うと、Azure VM にパブリック IP を割り当てることなく、Azure Bastion 経由でセキュアにリモートアクセスを行うことができます。

また、ホストマシンから RDP や SSH 接続を行うことなく、Azure portal 上から仮想マシンをリモートコントロールできるのも非常に嬉しいポイントです。

img

参考:Azure Bastion - Fully Managed RDP/SSH | Microsoft Azure

参考:About Azure Bastion | Microsoft Learn

Virtual network とサブネットを作成する

Bastion を使用するためには、Bastion をデプロイするための Virtual network と、サブネット内にデプロイされた仮想マシンが必要です。

そのため、まずはラボ環境用の Virtual network を作成します。

Virtual network は、アドレススペースを172.16.0.0/20で作成し、172.16.1.0/24のサブネットを 1 つ作成しました。

Create virtual network

この時、仮想マシンを配置する予定の172.16.1.0/24のサブネットには、vNet からのインバウンド通信が許可される既定の構成の NSG を割り当てておきます。

Virtual machine を作成する

続いて、Bastion でリモートアクセスを構成する仮想マシンを構成します。

今回は RedHat 7.9 と Windows Server 2012 R2 の 2 台のマシンを構成しました。

それぞれの仮想マシンは、先ほど作成した172.16.1.0/24のサブネットに追加しました。

また、NSG は既定の規則のみが適用されているものを構成しました。

Virtual network に Bastion をデプロイする(かんたん設定)

先ほど作成した Virtual network のリソースページを開き、[Bastion] から [Deploy Bastion] をクリックします。

image-20230504095648733

20 分ほど待つと、Bastion が自動的に Virtual network にデプロイされます。

ただし、この方法で構成した Bastion は既定の構成であり、有効なプランは Basic になります。

そのため、後述するネイティブクライアントによる仮想マシンへのリモート接続など、Standard プランでしか使用できない機能を使用する場合はカスタム構成で Bastion を作成する必要がある点に注意が必要です。

Bastion のデプロイが完了したら、VM の一覧に先ほど作成した仮想マシンが表示されることを確認します。

仮想マシンの情報は Virtual network 内で連携される情報を元にしているため、仮想マシンが所属するサブネットと仮想マシン側の NSG で vNet からのインバウンド通信が許可されていない場合、Bastion 側で仮想マシンを選択することができなくなります。

image-20230504142633198

仮想マシンを選択したら、そのマシンに対してパスワードや秘密鍵を用いて接続を行います。

この時、パスワードやローカルファイルの証明書以外に、Key Vault で管理している秘密鍵を使用することもできます。

image-20230504142916198

これで、新しいブラウザウィンドウが起動して、サブネット内の仮想マシンに SSH でリモートアクセスを行うことができるようになりました。

image-20230504143239855

もちろん Windows マシンの方にもブラウザ上で RDP 接続を行うことができます。

image-20230504143520601

Virtual network に Bastion をデプロイする(カスタム)

カスタム Bastion をデプロイする場合、Virtual network のリソースページを開き、[Bastion] から [Configure manually] をクリックします。

今回はリモートアクセスにネイティブクライアントを使用したいので、Tier は Standard を選択しました。

image-20230505160629936

続いて、Advanced でも [Native client support] を有効にしておきます。

image-20230505160820277

これでカスタム構成で Bastion を作成できました。

ネイティブクライアントで仮想マシンにリモート接続を行う

Bastion を使ってブラウザからリモートアクセスを行うのは非常に便利ですが、時にはホストマシンから RDP や SSH を使用して直接接続したい場合もあります。

その場合は、Azure CLI を使用します。

Azure CLI をインストールしていない場合は、以下の手順でインストールを行います。

参考:Install the Azure CLI for Windows | Microsoft Learn

参考:Install the Azure CLI on Linux | Microsoft Learn

winget 使うとインストールが簡単です。

winget install -e --id Microsoft.AzureCLI

インストールが完了したら、コマンドプロンプトなどで以下のいずれかのコマンドを実行して Azure CLI の認証を行います。

az login
az login --use-device-code

Azure CLI の認証が完了したら、以下のコマンドでネイティブの RDP クライアントを使用して Bastion 経由で Windows マシンに接続できるようになります。

az network bastion rdp --name "<BastionName>" --resource-group "<BastionResourceGroupName>" --target-resource-id "<VMResourceId>"

参考:ネイティブ クライアント接続を使用してファイルをアップロードまたはダウンロードする - Azure Bastion | マイクロソフト ラーン

ここで、--target-resource-idに指定する仮想マシンの ID は、リソースグループと仮想マシンの名前がわかっていれば以下のコマンドでも取得ができます。

az vm list --show-details --resource-group EPLab --query "[?name == 'Win2012R2'].id"

これで取得した仮想マシンの ID を使用してコマンドを実行すると、自動的に RDP クライアントが起動して Bastion 経由で仮想マシンに RDP 接続することができました。

az network bastion rdp --name "EPBastion" --resource-group "EPLab" --target-resource-id "<VMResourceId>"

image-20230505162937635

次に、ホストマシンから Linux マシンに SSH 接続を行います。

SSH 接続は、以下のコマンドでトンネリングを構成することで可能になります。

az network bastion tunnel --name "<BastionName>" --resource-group "<ResourceGroupName>" --target-resource-id "<VMResourceId>" --resource-port "<TargetVMPort>" --port "<LocalMachinePort>"

今回は以下のようなコマンドを使用しました。

az network bastion tunnel --name "EPBastion" --resource-group "EPLab" --resource-port 22 --port 2222 --target-resource-id "<VMResourceId>" 

このコマンドにより、ローカルホストの 2222 ポートを Bastion 経由で仮想マシンの 22 ポートにフォワーディングできるため、以下のコマンドで SSH 接続ができるようになります。

ssh -p 2222 azureuser@127.0.0.1

これで、ローカルホストから Azure VM に SSH 接続を実行することができました。

image-20230505163838605

まとめ

これで Azure Bastion 環境を構築できたので、また一つ検証環境がレベルアップしたような気がします。

Azure ポータル上から VM の操作ができるのは、自分のローカル端末とネットワーク的に完全に分離したい用途で使うのにも非常に良さそうです。

追記(2023年5月6日)

こんな感じで構築した Azure Bastion 環境は非常に快適なものになったのですが、利用料が 1 日 1000 円ほどかかるため個人での運用が難しく、削除してしまいました。

残念。。