AzureのBastionでパブリックIPなしにLinux VMへSSH接続する方法|踏み台サーバー不要のセキュア接続手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > AzureのBastionでパブリックIPなしにLinux VMへSSH接続する方法|踏み台サーバー不要のセキュア接続手順
「本番のLinux VMにSSH接続したいけど、パブリックIPを付けたくない。でも踏み台サーバーを別途立てると管理が増えるし、踏み台自体がセキュリティリスクになる…」

こうした悩みを解決するのが Azure Bastion です。VMにパブリックIPを割り当てることなく、AzureのバックボーンネットワークからLinux VMへ直接SSH接続できます。踏み台サーバーの維持コストも不要です。

この記事では、Azure Bastionの仕組みから、AzureBastionSubnetの作成・Bastionホストのデプロイ・az network bastion ssh によるCLI接続まで、実機ログを交えながら解説します。動作確認環境はRHEL 9.4 / Ubuntu 24.04 LTS です。

この記事のポイント

・Azure BastionでVMのパブリックIPを0件にしてSSH接続できる
・AzureBastionSubnetは/26以上(64アドレス以上)のCIDRが必須
・az network bastion sshはStandardティア以上で利用可能
・NSGはBastionサブネット向けに443・8080ポートの許可が必要


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

Azure BastionとSSH踏み台サーバーの違い

Linux VMへのSSH接続方法は大きく3つあります。

パブリックIP直接接続:VMにパブリックIPを付けて直接SSHする。シンプルだが、IPが公開されるため攻撃にさらされる
踏み台(ジャンプ)サーバー:パブリックIPを持つ踏み台VMを経由してSSHする。管理対象が増え、踏み台自体のセキュリティ管理が必要
Azure Bastion:AzureのマネージドサービスがSSHトンネルを提供する。VMにパブリックIPが不要で、管理コストも最小

Azure Bastionの特徴は、SSHトラフィックがインターネットを経由せず、Azureのバックボーンネットワーク内で完結する点です。接続はAzure PortalのブラウザSSHか、Azure CLIの az network bastion ssh コマンドを使います。
接続方法 VMのパブリックIP 管理コスト セキュリティ
パブリックIP直接接続 VM側に必要 インターネット公開
踏み台サーバー経由 踏み台VMに必要 高(踏み台の管理) 踏み台自体がリスク
Azure Bastion VMには不要 低(マネージド) バックボーン経由

Azure Bastionの構成要素と前提条件

Azure Bastionを使うには、以下の3つが必要です。

AzureBastionSubnet:Bastionホスト専用の固定名サブネット。/26以上(64アドレス以上)のCIDRが必須
パブリックIP(Standard SKU):BastionホストがAzure外と通信するためのIP。接続先VMには付けない
Bastionホスト:マネージドサービス本体。デプロイに5~10分かかる

ティアはBasicとStandardの2種類があります。

Basicティア:PortalのBrowser SSH/RDPが使える。CLIからの az network bastion ssh は利用不可
Standardティア:Browser SSH/RDPに加え、az network bastion sshaz network bastion tunnel が使える

注意:BasicティアではAzure CLIからの az network bastion ssh は利用できません。スクリプトや自動化での接続が必要な場合はStandardティアを選んでください。

コストを抑えたい場合はBasicで始め、CLI接続が必要になったらStandardへ切り替えるのが現実的です。

Azure CLIでBastionを構築する手順

ここでは、新規VNetにAzure Bastionを構築する手順を解説します。

1. リソースグループとVNetの作成

まずリソースグループとVNetを作成します。

# リソースグループを作成 az group create \ --name rg-bastion-demo \ --location japaneast # VNetとデフォルトサブネットを作成 az network vnet create \ --resource-group rg-bastion-demo \ --name myVNet \ --address-prefix 10.0.0.0/16 \ --subnet-name default \ --subnet-prefix 10.0.0.0/24

2. AzureBastionSubnetの作成

サブネット名は AzureBastionSubnet と完全一致している必要があります。大文字・小文字を含めて変更不可です。CIDRは /26(64アドレス)以上を指定してください。

az network vnet subnet create \ --resource-group rg-bastion-demo \ --vnet-name myVNet \ --name AzureBastionSubnet \ --address-prefix 10.0.1.0/26

実行後の出力例(抜粋):

{ "addressPrefix": "10.0.1.0/26", "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-bastion-demo/providers/Microsoft.Network/virtualNetworks/myVNet/subnets/AzureBastionSubnet", "name": "AzureBastionSubnet", "provisioningState": "Succeeded" }

3. Bastionホスト用パブリックIPの作成

BastionホストにはStandard SKUの静的パブリックIPが必要です。

az network public-ip create \ --resource-group rg-bastion-demo \ --name myBastionPublicIP \ --sku Standard \ --allocation-method Static \ --location japaneast

4. Bastionホストのデプロイ

az network bastion create コマンドでBastionホストを作成します。デプロイには5~10分かかります。

az network bastion create \ --resource-group rg-bastion-demo \ --name myBastion \ --vnet-name myVNet \ --public-ip-address myBastionPublicIP \ --sku Standard \ --location japaneast

デプロイが完了すると以下のような出力が得られます。

{ "dnsName": "bst-xxxxxxxx-xxxx.japaneast.bastion.azure.com", "name": "myBastion", "provisioningState": "Succeeded", "sku": { "name": "Standard" } }

5. パブリックIPなしのLinux VMを作成する

--public-ip-address "" を指定することで、パブリックIPなしのVMを作成できます。

az vm create \ --resource-group rg-bastion-demo \ --name myLinuxVM \ --image RedHat:RHEL:9-lvm-gen2:latest \ --size Standard_B2s \ --vnet-name myVNet \ --subnet default \ --public-ip-address "" \ --admin-username azureuser \ --generate-ssh-keys # az vm show --resource-group rg-bastion-demo --name myLinuxVM --show-details

作成後のVMにはプライベートIPのみ付与されていることを確認します。

az vm show \ --resource-group rg-bastion-demo \ --name myLinuxVM \ --show-details \ --query "{privateIP:privateIps,publicIP:publicIps}" \ -o table PrivateIP PublicIP ----------- ---------- 10.0.0.4 None

PublicIPNone になっていることを確認してください。インターネットからは直接到達できないVMが完成しました。VNet内のプライベートな名前解決については、Linux DNS 設定の基本も参考にしてください。

az network bastion sshでLinux VMへ接続する(Standardティア)

Standardティアでは、Azure CLIの az network bastion ssh コマンドを使って自分のPCから直接SSH接続できます。

1. VMのリソースIDを取得する

VM_ID=$(az vm show \ --resource-group rg-bastion-demo \ --name myLinuxVM \ --query id \ -o tsv) echo $VM_ID # /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-bastion-demo/providers/Microsoft.Compute/virtualMachines/myLinuxVM

2. Bastionを経由してSSH接続する

az network bastion ssh \ --resource-group rg-bastion-demo \ --name myBastion \ --target-resource-id $VM_ID \ --auth-type ssh-key \ --username azureuser \ --ssh-key ~/.ssh/id_rsa

接続に成功すると、通常のSSHセッションと同じようにLinuxシェルが開きます。

Authenticated to myLinuxVM via Bastion. [azureuser@myLinuxVM ~]$ hostname myLinuxVM [azureuser@myLinuxVM ~]$ ip addr show eth0 | grep "inet " inet 10.0.0.4/24 brd 10.0.0.255 scope global eth0 [azureuser@myLinuxVM ~]$

VMのIPアドレスがプライベートIP(10.0.0.4)のみであることを確認できます。

パスワード認証を使う場合は --auth-type password に変更し、接続後にパスワードを入力します。ただし鍵認証の方がセキュリティ上推奨です。

3. azure-bastion拡張機能が入っていない場合

初回実行時に拡張機能のインストールを求めるメッセージが表示されることがあります。

The command requires the extension azure-bastion. Do you want to install it now? (Y/n):

Y を入力して自動インストールしてください。または事前に以下で手動インストールできます。

az extension add --name bastion

Azure PortalからのBrowser SSH接続(Basic・Standard両ティア対応)

Azure PortalのBrowser SSHはBasicとStandard両方のティアで使えます。自分のPCにAzure CLIが入っていない環境でも接続できる点が利点です。

接続手順:
・Azure Portalで対象のLinux VMのリソースページを開く
・左メニューの「接続」>「Bastionを介して接続」を選択
・ユーザー名と認証方法(SSH秘密鍵またはパスワード)を入力する
・「接続」ボタンをクリックすると、ブラウザ内でSSHターミナルが開く

ブラウザのみで接続が完結するため、Windows環境でも追加ソフトのインストールなしでSSHできます。

接続できない時のトラブルシュート

1. 「BastionSubnetNotFound」エラーが出る場合

AzureBastionSubnetの名前が間違っている場合に発生します。サブネット名は大文字・小文字を含めて完全一致が必要です。

# サブネット名を確認する az network vnet subnet list \ --resource-group rg-bastion-demo \ --vnet-name myVNet \ --query "[].name" \ -o table Result --------------------- AzureBastionSubnet default

AzureBastionSubnet という名前が正確に存在することを確認してください。

2. NSGがBastionサブネットをブロックしている場合

AzureBastionSubnetにNSGを付けている場合、以下のルールが必要です。

インバウンド(受信):ソース GatewayManager(サービスタグ)・ポート443 を許可
インバウンド(受信):ソース AzureLoadBalancer(サービスタグ)・ポート443 を許可
アウトバウンド(送信):宛先 VirtualNetwork(サービスタグ)・ポート22 を許可
アウトバウンド(送信):宛先 AzureCloud(サービスタグ)・ポート443 を許可

3. VMのNSGがポート22を拒否している場合

VM側のNSGで22番ポートへの受信が許可されていないと、Bastionからの接続も拒否されます。VMのNSGインバウンドルールで、ソースをVirtualNetworkに絞ってポート22を許可することで、インターネット公開せずに接続できます。

ポート22の状態確認については、Linux ポート確認の全コマンドも参考にしてください。

4. az network bastion sshが「not available」となる場合

Basicティアで az network bastion ssh を実行するとエラーになります。

(BastionOperationNotSupported) Bastion host 'myBastion' doesn't support native client.

Standardティアへのアップグレードか、PortalのBrowser SSHを使用してください。

本記事のまとめ

やりたいこと コマンド・手順
AzureBastionSubnetを作成する az network vnet subnet create --name AzureBastionSubnet --address-prefix 10.0.1.0/26
Bastionホストを作成する az network bastion create --name <名前> --vnet-name <VNet名> --public-ip-address <IP名>
BastionでSSH接続する(CLI) az network bastion ssh --name <Bastion名> --target-resource-id <VM_ID>
BastionでSSH接続する(Portal) VM「接続」>「Bastionを介して接続」から実行
Bastionの状態を確認する az network bastion show --resource-group <RG> --name <Bastion名> --query provisioningState
Azure Bastionを使えば、パブリックIPをVMに付けることなくSSH接続が実現し、攻撃面を最小化できます。特にStandardティアの az network bastion ssh はスクリプトへの組み込みもしやすく、運用自動化との親和性も高いです。Azure上でLinuxサーバーを構築・運用するための体系的なスキルを習得したい方は、下記のセミナーも参考にしてください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。