🥑

【踏み台】📝ネイティブクライアントによるAzure BastionでのVM接続方法パターン【備忘録】

2024/09/03に公開

はじめに

Azure Bastionは、Azure Virtual Network(VNet)内の仮想マシン(VM)への安全な接続を提供するサービスです。RDP(リモートデスクトッププロトコル)やSSH(セキュアシェル)を使用した接続をサポートしており、セキュアかつ効率的なリモートアクセスを実現します。本記事では、WindowsおよびLinuxのネイティブクライアントを使用してAzure Bastion経由でVMに接続する方法について詳しく説明します。また、Visual Studio Code(VS Code)を使ってローカルマシンからリモートVMにSSH接続し、Jupyter Notebookを実行する方法と、ポートフォワーディングの概念についても解説します。

Azure Bastionの概要

Azure Bastionは、Azureの管理サービスとして提供され、VNet内のVMに安全にアクセスするためのジャンプサーバーの役割を果たします。従来の直接的なRDPやSSH接続と比較して、Azure BastionはパブリックIPアドレスを必要とせず、インターネットに対してVMを公開する必要がありません。また、多要素認証やTLS暗号化、セッション監視とログ記録などのセキュリティ機能も提供しています。

引用:

https://learn.microsoft.com/ja-jp/azure/bastion/

ポートフォワーディングとは?

ネイティブクライアントによるAzure BastionでのVMへの接続の方法論を知るうえでは、まず、ポートフォワーディングの概要を頭に置いておきましょう。

ポートフォワーディングとは、ローカルマシンの特定のポートをリモートのVMの特定のポートにバインドする技術です。これにより、ローカルマシンのポートを通じてリモートのリソースにアクセスできるようになります。Azure Bastionでは、SSHやRDPなどのプロトコルを使用してリモートのVMに接続する際にポートフォワーディングが利用されます。

ポートフォワーディングの仕組み

  1. ローカルポートの指定: ローカルマシンで特定のポートを指定します(例:localhost:2222)。このポートが、リモートのVMへのアクセスの入り口となります。

  2. リモートポートへのマッピング: Azure Bastionを通じて、ローカルポートをリモートのVMの指定したポートにマッピングします(例:リモートVMのSSHポート22)。

  3. トラフィックの転送: ローカルマシンから指定したポートに送られるトラフィックは、Azure Bastionを介してリモートVMに転送されます。これにより、リモートVMに安全にアクセスすることができます。

ポートフォワーディングの利点

  • セキュリティの強化: パブリックIPを公開することなくリモートVMにアクセスできるため、セキュリティが向上します。
  • 利便性の向上: ローカルマシンからリモートリソースにアクセスする際に、複雑なネットワーク設定を変更する必要がありません。
  • 多様なプロトコルのサポート: SSHやRDPなど、さまざまなプロトコルで利用できます。

ネイティブクライアント接続の種類

つづいて、ポートフォワーディングにつづく重要概念であるネイティブクライアント接続についてです。
ネイティブクライアント接続は、ローカルのWindowsまたはLinuxコンピュータから直接AzureのVMに接続する方法で、Azure CLIを使用してBastion経由で接続します。これにより、SSHキーやMicrosoft Entra IDなどのサインインオプションを活用できます。以下では、具体的な接続方法とその使用シナリオについて詳しく説明します。

必要条件

Azure Bastionを使用してネイティブクライアントから接続する前に、以下の条件を確認してください:

  • Azure CLIのインストール: 最新バージョンのAzure CLIがインストールされていること。
  • Azure Bastionのデプロイ: Azure Bastionが仮想ネットワークにデプロイされ、設定されていることを確認します。
  • 仮想マシンの設定: 接続する仮想マシンが仮想ネットワーク内に存在し、必要なポートが開いていることを確認します。
  • Microsoft Entra ID認証: Entra IDを使用して接続する場合、VMがEntraに参加していることが必要です。

接続方法の比較と使い分け

Azure Bastionを使用した接続方法には、主にSSH接続とトンネルコマンドの2種類があります。これらの方法は、使用するプロトコルや接続の目的に応じて使い分けられます。

SSH接続とは?

SSH接続は、セキュアシェルプロトコルを使用して、Azure Bastion経由で直接VMにアクセスする方法です。SSH接続は、主にLinux VMに対して使用されますが、Windows VMにも適用可能です。SSH接続は、コマンドラインを使用してリモートのVMを操作する際に便利です。

  • 利点:
    • 直接的なコマンドラインアクセス: SSHプロトコルを使用して、シェルアクセスやファイル転送が可能です。
    • シンプルな操作: Azure CLIコマンドを使用して簡単に接続できます。

トンネルコマンドとは?

トンネルコマンドaz network bastion tunnel)は、Azure Bastionを経由して特定のポートをローカルマシンに転送する方法です。これにより、ローカルマシンの特定のポートを通じてAzure VMにアクセスできるようになります。トンネルコマンドは、RDPやSSHを含む任意のプロトコルで使用でき、特に複数のVMへの同時接続やポートフォワーディングが必要なシナリオで有効です。

  • 利点:
    • ポートフォワーディング: ローカルマシンのポートをリモートVMの特定のポートにバインドすることで、あたかもローカルでサービスを利用しているかのようにアクセスできます。
    • ファイルのアップロード: SSHを使ったファイルのアップロードが可能です。
    • 複数接続の管理: 複数のVMに同時に接続する場合にも便利です。

主な違い

特徴 SSH接続 トンネルコマンド
接続方法 直接リモートVMにシェルアクセスを提供 ローカルポートを介してVMに接続
使用用途 コマンドライン操作、ファイル転送 特定のポートでのアクセス、RDP接続
サポートプロトコル SSH SSH、RDP、その他のカスタムプロトコル
セキュリティ SSHキーやEntra IDによる認証 Bastionのセキュリティ機能を利用

マルチ接続トンネルの使用方法

トンネルコマンドの中でも、マルチ接続トンネルは特に有用です。複数の接続を同時に管理するための方法で、例えば開発環境で複数のVMに同時に接続する必要がある場合に便利です。ここでは、マルチ接続トンネルを使用してAzure Bastionを介して複数のVMに接続する手順を説明します。

マルチ接続トンネルの設定手順

  1. SSH設定ファイルの編集: $HOME/.ssh/configに以下の設定を追加します。

    Host tunneltunnel
        HostName 127.0.0.1
        Port 2222
        User mylogin
        StrictHostKeyChecking=No
        UserKnownHostsFile=/dev/null
    
  2. トンネル接続の追加: Azure CLIを使用して、既存のトンネル接続に新しいトンネルを追加します。

    az network bastion tunnel --name "<BastionName>" --resource-group "<ResourceGroupName>" --target-resource-id "<VMResourceId>" --resource-port "22" --port "2222"
    
  3. SSHトンネルの作成: SSHコマンドを使用してBastionトンネルに対してSSHトンネルを作成します。

    ssh -L 2222:127.0.0.1:22 mylogin@127.0.0.1
    
  4. VS Codeでの接続: Visual Studio Codeを使用して、作成したトンネル接続に接続することも可能です。

Windowsネイティブクライアントからの接続方法

Windowsクライアントを使用してAzure Bastion経由でVMに接続する方法について説明します。

RDPでWindows VMに接続する

  1. Azure CLIを使用してサインイン:

    az login
    
  2. サブスクリプションの選択(複数サブスクリプションがある場合):

    az account set --subscription "<subscription ID>"
    
  3. RDP接続を開始:

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

    このコマンドを実行すると、認証情報の入力が求められます。

トンネルコマンドを使用して接続する

トンネルコマンドを使用すると、特定のポートを介してVMに接続できます。以下に手順を示します。

  1. トンネルの開設:

    az network bastion tunnel --name "<BastionName>" --resource-group "<ResourceGroupName>" --target-resource-id "<VMResourceId>" --resource-port "<TargetVMPort>" --port "<LocalMachinePort>"
    
  2. ローカルネイティブクライアントでの接続:
    例えば、SSHクライアントを使用して接続する場合は、以下のコマンドを使用します。

    ssh <username>@127.0.0.1 -p <LocalMachinePort>
    

Linuxネイティブクライアントからの接続方法

Linuxクライアントを使用してAzure Bastion経由でVMに接続する方法について説明します。

SSHでLinux VMに接続する

  1. Azure CLIのサインイン:

    az login
    
  2. SSH接続の開始:

    az network bastion ssh --name "<BastionName>" --resource-group "<ResourceGroupName>" --target-resource-id "<VMResourceId>" --auth-type "ssh-key" --username "<Username>" --ssh-key "<Filepath>"
    

トンネルコマンドを使用して接続する

  1. トンネルの開設:

    az network bastion tunnel --name "<BastionName>" --resource-group "<ResourceGroupName>" --target-resource-id "<VMResourceId>" --resource-port "<TargetVMPort>" --port "<LocalMachinePort>"
    
  2. ローカルネイティブクライアントでの接続:
    OpenSSHクライアントを使用して接続する場合、以下のコマンドを使用します。

    ssh <username>@127.0.0.1 -p <LocalMachinePort>
    

Visual Studio Codeを使用したSSH接続とJupyter Notebookの実行

VS Codeを使用してリモートVMにSSH接続し、Jupyter Notebookを実行する手順を以下に示します。

VS Codeの準備

  1. VS Codeのインストール: ローカルマシンにVisual Studio Codeがインストールされていることを確認してください。

  2. Remote - SSH拡張機能のインストール: VS Codeの拡張機能から「Remote - SSH」をインストールします。

リモートVMへのSSH接続

  1. SSH設定の追加: VS Codeのコマンドパレット(Ctrl + Shift + P)を開き、「Remote-SSH: Open SSH Configuration File」を選択し、SSH設定ファイルに接続先の情報を追加します。

    Host <MyAzureVM>
        HostName 127.0.0.1
        User <username>
        Port <LocalMachinePort>
    
  2. トンネルコマンドの実行: トンネルコマンドを実行し、ローカルポートをリモートVMにバインドします。

  3. VS Codeからの接続: VS Codeの「Remote Explorer」から設定したSSH接続を選び、「Connect to Host in Current/New Window」をクリックします。

Jupyter Notebookの実行

  1. Jupyter Notebookのインストール: リモートVMにログインした後、以下のコマンドでインストールします。

    sudo apt update
    sudo apt install python3-pip
    pip3 install jupyter
    
  2. Jupyter Notebookの起動: 以下のコマンドでJupyter Notebookを起動します。

    jupyter notebook --no-browser --port=8888
    
  3. ローカルマシンからのアクセス: トンネルコマンドを使用して、ローカルマシンのポート8888をリモートVMのポート8888にフォワーディングします。

    ssh -L 8888:localhost:8888 <username>@127.0.0.1 -p <LocalMachinePort>
    
  4. ブラウザでのアクセス: ローカルマシンのブラウザでhttp://localhost:8888にアクセスすると、リモートVM上のJupyter Notebookにアクセスできます。

まとめ

Azure Bastionは、クラウド環境での安全なリモートアクセスを実現する強力なツールです。この記事で紹介した接続方法、活用シナリオ、マルチ接続トンネルの使用方法を参考に、自身の環境に最適な方法でAzure Bastionを導入し、活用してください。

また、Azure Bastionは、セキュリティ、使いやすさ、管理の容易さのバランスが取れたリモートアクセスソリューションです。新機能や改善点が定期的にリリースされるため、Azureの公式ドキュメントや最新のベストプラクティスを定期的にチェックすることをお勧めします。


この記事を通じて、Azure Bastionのネイティブクライアント接続、トンネルコマンド、VS Codeを使ったJupyter Notebookの実行、およびマルチ接続トンネルの使用方法など、さまざまな機能とその利点について理解を深めていただけたでしょうか。ぜひ、Azure Bastionを使って、安全で効率的なクラウド環境を構築してください。


参考文献

https://learn.microsoft.com/ja-jp/azure/bastion/connect-vm-native-client-windows

https://learn.microsoft.com/ja-jp/azure/bastion/connect-vm-native-client-linux

https://zenn.dev/microsoft/articles/20240823-bastion-portfwd

https://zenn.dev/microsoft/articles/20240914-bastion-agent-forward

https://qiita.com/Isato-Hiyama/items/106504a2ed49a74d990f

Discussion