カテゴリ: Azure 更新日: 2026/04/04

Azure Bastionの使い方を徹底解説!踏み台サーバー不要で安全にRDP/SSH接続

Azure Bastion経由のセキュア接続|踏み台不要のRDP/SSH接続設定
Azure Bastion経由のセキュア接続|踏み台不要のRDP/SSH接続設定

先生と生徒の会話形式で理解しよう

生徒

「Azure(アジュール)で作成した仮想マシンに接続したいのですが、セキュリティが心配です。インターネットに公開せずに接続する方法はありますか?」

先生

「それならAzure Bastion(アジュール・バスティオン)を使うのが最適ですよ。これを使えば、踏み台サーバーを用意しなくても、ブラウザから安全に接続できるんです。」

生徒

「踏み台サーバーがいらないんですか?設定は難しいのでしょうか?」

先生

「仕組みを理解すれば初心者の方でも大丈夫です。具体的な設定方法やメリットを一緒に学んでいきましょう!」

1. Azure Bastionとは?初心者向けに基礎知識を解説

1. Azure Bastionとは?初心者向けに基礎知識を解説
1. Azure Bastionとは?初心者向けに基礎知識を解説

Azure Bastion(アジュール・バスティオン)とは、Microsoftが提供するクラウドサービスの一つで、Azure Virtual Machines(アジュール・バーチャル・マシン)に対して、安全にリモートデスクトップ(RDP)やSSHで接続するためのフルマネージドなPaaS(パース)サービスです。Bastionはフランス語で「要塞(ようさい)」という意味があり、その名の通り外部からの攻撃を防ぎつつ、内部へのアクセスを許可する役割を持っています。

通常、クラウド上のサーバーに接続する場合、パブリックIPアドレスを割り当ててポートを開放する必要がありますが、これでは常にサイバー攻撃の危険にさらされてしまいます。Azure Bastionを使えば、仮想マシンにパブリックIPを持たせる必要がなくなり、プライベートIPアドレスだけで運用できるため、セキュリティの強度が格段に向上します。まさに、クラウド時代の標準的な接続方法と言えるでしょう。

2. 踏み台サーバー(ジャンプホスト)との違いとメリット

2. 踏み台サーバー(ジャンプホスト)との違いとメリット
2. 踏み台サーバー(ジャンプホスト)との違いとメリット

これまで、プライベートな環境にあるサーバーに接続するためには、中継地点となる「踏み台サーバー(Jump Host)」を構築するのが一般的でした。しかし、この方法にはいくつかのデメリットがありました。

  • 踏み台サーバー自体の管理(パッチ適用やOSアップデート)に手間がかかる。
  • 踏み台サーバーの維持費(仮想マシンの稼働コスト)が発生する。
  • 踏み台サーバーが攻撃の標的(シングルポイントオブフェイラー)になりやすい。

Azure Bastionはこれらの問題を解消します。PaaSとして提供されるため、OSの管理やメンテナンスはすべてMicrosoftが行います。ユーザーはインフラの管理から解放され、純粋に「接続する」という目的だけに集中できるのが大きな魅力です。

3. Azure Bastionの仕組みとSSLによる暗号化通信

3. Azure Bastionの仕組みとSSLによる暗号化通信
3. Azure Bastionの仕組みとSSLによる暗号化通信

Azure Bastionの仕組みは非常にスマートです。ユーザーはまず、Azure Portal(アジュール・ポータル)にログインし、そこからブラウザを通じて仮想マシンへの接続を要求します。このとき、通信はHTTPS(ポート443)で暗号化されます。Azure Bastionは内部でRDPやSSHのプロトコルをラップし、仮想ネットワーク内を移動して対象の仮想マシンへ接続します。

仮想マシン側では、自分自身のプライベートIPアドレス宛てにBastionからの通信を受け取るだけなので、インターネットからの直接的な接続を拒否する設定が可能になります。これにより、ポートスキャンやブルートフォース攻撃(総当たり攻撃)を未然に防ぐことができるのです。また、HTML5対応のブラウザさえあれば、専用のクライアントソフト(リモートデスクトップ接続アプリなど)をインストールする必要もありません。

4. Azure Bastionを導入するための事前準備と要件

4. Azure Bastionを導入するための事前準備と要件
4. Azure Bastionを導入するための事前準備と要件

Azure Bastionを設定する前に、いくつか準備しておくべき項目があります。特に重要なのが「サブネット」の作成です。Azure Bastion専用のサブネットを用意する必要があり、その名前は厳格に決められています。

AzureBastionSubnet という名前のサブネットを、対象の仮想ネットワーク内に作成してください。このサブネットのサイズは、推奨として /26 以上の範囲(例:10.0.1.0/26)を確保することが望ましいです。小規模な環境であっても、将来的なスケーリング(拡張性)を考慮して余裕を持った設計にしておきましょう。

また、NSG(ネットワーク・セキュリティ・グループ)の設定も重要です。Bastionサブネットには、特定のポート(443番など)のインバウンド通信を許可する規則が必要になります。最初は少し複雑に感じるかもしれませんが、Azureの管理画面からウィザード形式で設定を進めることも可能です。

5. LinuxサーバーへのSSH接続コマンド例

5. LinuxサーバーへのSSH接続コマンド例
5. LinuxサーバーへのSSH接続コマンド例

Azure Bastionはブラウザからの接続が基本ですが、より高度な使い方としてローカルPCの端末から接続する方法もあります。ここでは、Linux(リナックス)サーバーへ接続する際のイメージをコマンド形式で見てみましょう。az network bastionコマンドを使用することで、ローカルのSSHクライアントを利用可能です。


az network bastion ssh --name "MyBastionName" --resource-group "MyResourceGroup" --target-resource-id "/subscriptions/..." --auth-type "ssh-key" --username "azureuser" --ssh-key "~/.ssh/id_rsa"
Opening native ssh tunnel...
Connected!
azureuser@my-linux-vm:~$

このように、コマンドラインインターフェース(CLI)を活用することで、普段使い慣れたターミナル環境からもBastion経由で安全に操作ができるようになります。これは開発者にとって非常に便利な機能です。

6. ネットワーク制御(NSG)の設定イメージ

6. ネットワーク制御(NSG)の設定イメージ
6. ネットワーク制御(NSG)の設定イメージ

セキュリティをより強固にするために、ネットワークセキュリティグループ(NSG)のルールを適切に設定することが推奨されます。仮想マシン側のNSGで、Bastionサブネットからの通信のみを許可する設定をSQLのように論理的に整理して考えてみましょう。


/* NSGのルール構成をイメージしたクエリ */
SELECT rule_id, priority, direction, access, port, source_address
FROM network_security_group_rules
WHERE source_address = 'AzureBastionSubnet'
AND access = 'Allow'
AND direction = 'Inbound';

実際の管理画面での設定状況をテーブル形式で表すと、以下のようになります。優先度を高く設定し、Bastion以外からのRDP/SSH(3389/22)を遮断するのが鉄則です。


Priority | Name           | Port | Protocol | Source              | Action
---------+----------------+------+----------+---------------------+-------
100      | AllowBastionIn | 3389 | TCP      | AzureBastionSubnet  | Allow
110      | AllowSSHIn    | 22   | TCP      | AzureBastionSubnet  | Allow
65000    | DenyAllInBound | Any  | Any      | Internet            | Deny

これにより、万が一仮想マシンのパスワードが漏洩しても、Bastionを経由しない限り外部からアクセスされることはありません。

7. Pythonを利用した自動化スクリプトの例

7. Pythonを利用した自動化スクリプトの例
7. Pythonを利用した自動化スクリプトの例

大規模な環境では、多数の仮想マシンに対して接続を確認したり、管理したりすることがあります。Python(パイソン)を使用して、仮想マシンの状態を確認するような簡単なスクリプトを紹介します。Bastionが有効な環境下で、エージェントが正常に動作しているかチェックする際などの参考にしてください。


import json

# 仮想マシンのリスト情報をシミュレーション
vm_data = [
    {"name": "Web-Server-01", "status": "running", "bastion_enabled": True},
    {"name": "DB-Server-01", "status": "running", "bastion_enabled": True},
    {"name": "Test-VM-03", "status": "deallocated", "bastion_enabled": False}
]

def check_bastion_status(vms):
    for vm in vms:
        if vm["bastion_enabled"]:
            print(f"{vm['name']}: Bastion経由で接続可能です。")
        else:
            print(f"{vm['name']}: Bastionの設定を確認してください。")

check_bastion_status(vm_data)

実行結果は以下のようになります。


Web-Server-01: Bastion経由で接続可能です。
DB-Server-01: Bastion経由で接続可能です。
Test-VM-03: Bastionの設定を確認してください。

プログラミングを少し覚えると、こうしたインフラ管理の自動化もスムーズに行えるようになりますね。

8. Azure Bastionのコストとプランの選び方

8. Azure Bastionのコストとプランの選び方
8. Azure Bastionのコストとプランの選び方

最後に気になるのが費用(コスト)面です。Azure Bastionには、主に「Basic(基本)」と「Standard(標準)」という2つのプラン(SKU)があります。初心者の学習用途であればBasicプランで十分ですが、業務利用で「ホストのスケーリング(同時接続数の増加)」や「IPベースの接続」が必要な場合はStandardプランを選択する必要があります。

Bastionはプロビジョニング(作成)されている時間に対して課金が発生するため、使わない時は削除しておくといった工夫もコスト削減には有効です。ただし、削除すると設定をやり直す必要があるため、頻繁に使う環境ではそのまま維持するのが一般的です。自分自身のプロジェクトの規模や予算に合わせて、最適なプランを選んでみてください。

まとめ

まとめ
まとめ

アジュール・バスティオン(Azure Bastion)の導入は、クラウド環境におけるセキュリティ対策の要(かなめ)となります。これまでの解説を振り返ると、最も大きな利点は「インターネットから仮想マシンを完全に隠蔽できる」という点にあります。従来のように、パブリックIPアドレスを仮想マシンに付与して直接リモートデスクトップ接続(RDP)やセキュアシェル(SSH)を行う方法は、常に悪意のある第三者によるポートスキャンのリスクに晒されていました。しかし、バスティオンを利用することで、全ての接続要求がアジュール・ポータルを経由した安全な通信経路に一本化されます。これにより、企業の重要なデータ資産を守るための「要塞」としての機能が十分に発揮されるのです。

アジュール・バスティオン導入による具体的な成果

バスティオンを導入することで得られるメリットは多岐にわたります。第一に、運用管理コストの削減です。従来の踏み台サーバー方式では、そのサーバー自体のオペレーティングシステム(OS)のアップデートやセキュリティパッチの適用、ウイルス対策ソフトの管理など、付随する作業が膨大でした。バスティオンはフルマネージドサービス(PaaS)であるため、これらの煩雑なメンテナンス作業はすべてマイクロソフト側が担当します。利用者はインフラの維持管理にリソースを割くことなく、本来の業務であるアプリケーション開発やシステム運用に集中できるようになります。

第二に、ブラウザベースの簡便な接続性です。HTML5に対応した最新のブラウザさえあれば、どこからでも安全に仮想マシンへアクセス可能です。特定のソフトウェアをクライアント端末にインストールする必要がないため、テレワークや急なトラブル対応時にも、端末を選ばずに迅速な対応が可能となります。これはビジネスの継続性を高める上でも非常に重要な要素です。

ネットワーク構成とNSG(ネットワークセキュリティグループ)の重要性

バスティオンを正しく機能させるためには、ネットワークの設計が極めて重要です。特に「AzureBastionSubnet」という専用のサブネット作成は必須条件であり、そのサイズやアドレス範囲の設計には注意が必要です。また、ネットワークセキュリティグループ(NSG)の設定において、仮想マシン側の受信規則を「バスティオンサブネットからの通信のみ許可」に制限することで、セキュリティ強度は最大化されます。

ここでは、NSGの設定状態を管理するためのSQLイメージと、実際の適用結果をシミュレーションしてみましょう。


/* 現在のNSG設定からセキュリティの脆弱性を確認するイメージ */
SELECT 
    rule_name, 
    priority, 
    source_address_prefix, 
    destination_port_range, 
    access_type
FROM 
    network_security_rules
WHERE 
    destination_port_range IN ('3389', '22')
    AND access_type = 'Allow'
ORDER BY 
    priority ASC;

実行結果として得られる設定情報は、以下の通りです。


rule_name      | priority | source_address_prefix | destination_port_range | access_type
---------------+----------+-----------------------+------------------------+------------
AllowBastion   | 100      | AzureBastionSubnet    | 3389                   | Allow
AllowSSH       | 110      | AzureBastionSubnet    | 22                     | Allow
BlockInternet  | 200      | Internet              | Any                    | Deny

このように、インターネット(Internet)からの直接アクセスを拒否(Deny)しつつ、バスティオンサブネット(AzureBastionSubnet)からの通信だけを許可(Allow)する構成が理想的です。

運用自動化に向けたC#による状態監視の例

バスティオンを利用した環境では、インフラの健全性をプログラムでチェックすることも可能です。例えば、C#(シーシャープ)を用いて、指定した仮想ネットワーク内にバスティオンが正しく配置されているかを確認するロジックを考えてみましょう。


using System;
using System.Collections.Generic;

public class BastionMonitor
{
    public static void Main()
    {
        var vms = new List<VirtualMachine>
        {
            new VirtualMachine { Name = "WebSrv01", IsBastionActive = true },
            new VirtualMachine { Name = "DBSrv01", IsBastionActive = true },
            new VirtualMachine { Name = "AppSrv01", IsBastionActive = false }
        };

        Console.WriteLine("--- Azure Bastion 接続ステータス確認 ---");
        foreach (var vm in vms)
        {
            if (vm.IsBastionActive)
            {
                Console.WriteLine($"{vm.Name}: セキュリティ保護された接続が利用可能です。");
            }
            else
            {
                Console.WriteLine($"{vm.Name}: 【警告】Bastionの設定が未完了、または無効です。");
            }
        }
    }
}

public class VirtualMachine
{
    public string Name { get; set; }
    public bool IsBastionActive { get; set; }
}

このプログラムを実行すると、以下のような結果が得られます。


--- Azure Bastion 接続ステータス確認 ---
WebSrv01: セキュリティ保護された接続が利用可能です。
DBSrv01: セキュリティ保護された接続が利用可能です。
AppSrv01: 【警告】Bastionの設定が未完了、または無効です。

こうした監視を自動化することで、ヒューマンエラーによる設定漏れを防ぎ、常に高いセキュリティレベルを維持することができます。

将来的な展望とコスト管理

アジュール・バスティオンは、今後ますます進化していくことが予想されます。例えば、オンプレミス環境からエクスプレスルート(ExpressRoute)を経由した接続や、プライベートエンドポイントとの連携など、より複雑なネットワーク構成への対応が強化されています。一方で、利用料金はプロビジョニングされている時間に応じて発生するため、プロジェクトの初期段階や検証環境においては、Basicプランを選択してコストを抑える工夫も必要です。

セキュリティと利便性はしばしばトレードオフの関係にありますが、アジュール・バスティオンはその両立を見事に成し遂げたサービスです。クラウドネイティブなアプローチで、安全かつ効率的なリモートアクセス環境を構築し、ビジネスの成長を加速させましょう。

先生と生徒の振り返り会話

生徒

「先生、まとめを読んでアジュール・バスティオンの凄さがよく分かりました!つまり、自分で踏み台サーバーの面倒を見なくていい、というのが最大のポイントなんですね?」

先生

「その通りです。パッチ当てやOSのセキュリティ管理をマイクロソフトにお任せできるのは、運用者にとって本当に大きな助けになります。生徒さんは、もし自分で踏み台サーバーを立てるとしたら、どんな作業が一番大変だと思いますか?」

生徒

「うーん、やっぱり24時間365日、ハッカーからの攻撃に備えて最新の状態を保ち続けることでしょうか。少しでも油断すると、そこが侵入口になってしまいますもんね。」

先生

「素晴らしい着眼点ですね!バスティオンはその『侵入口』を最小限に絞り込み、さらにHTTPSで通信を保護してくれるんです。ちなみに、設定で一番気を付けるべき場所はどこでしたか?」

生徒

「はい、専用のサブネット名である『AzureBastionSubnet』を間違えないように作ることですね!あと、NSGで他の入り口をしっかり閉じておくことも忘れないようにします。」

先生

「満点の回答です。SQLやC#の例で見たように、論理的に整理して自動化を考える癖をつけておくと、エンジニアとしてのスキルもぐっと上がりますよ。これからも安全なクラウド構築を目指して頑張りましょうね!」

生徒

「ありがとうございます!まずは自分の検証環境で、実際にバスティオンを立ち上げてブラウザから接続してみます!」

カテゴリの一覧へ
新着記事
New1
C#
C#のRegex.Split完全攻略!正規表現で文字列を自由自在に分割する方法
New2
Azure
Azure Bastionの使い方を徹底解説!踏み台サーバー不要で安全にRDP/SSH接続
New3
COBOL
COBOLの文字列操作と数値処理を総合的に理解しよう!初心者向けサンプルプログラム付き
New4
C#
C#の抽象クラスと抽象メソッドとは?実装例を交えてやさしく解説
人気記事
No.1
Java&Spring記事人気No1
C#
C#のasyncとawaitの基本的な使い方をマスターしよう!非同期処理をやさしく解説
No.2
Java&Spring記事人気No2
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
C#
C#のActionとFuncを使いこなそう!初心者でもわかるメソッド活用テクニック
No.4
Java&Spring記事人気No4
Azure
Azure VM(仮想マシン)とは?商用サーバー構築の基本と選定基準を解説
No.5
Java&Spring記事人気No5
COBOL
COBOLバッチ処理の並列ジョブ実行とは?メリット・デメリットを徹底解説
No.6
Java&Spring記事人気No6
C#
C#のCancellationTokenを使ったキャンセル処理を完全ガイド!非同期処理を安全に止める方法
No.7
Java&Spring記事人気No7
C#
C#の日付型(DateTime)と基本的な使い方を解説|初心者向け入門ガイド
No.8
Java&Spring記事人気No8
C#
C#のトランザクション処理を完全ガイド!初心者でもわかるCommit・Rollbackの使い方