強制トンネリング構成時の Azure Bastion を利用したオンプレミスサーバの SSH アクセス方法
はじめに
Azure サービスの中で、Azure Bastion はセキュアに仮想マシンやオンプレミスサーバへのアクセスを提供しています。しかし、強制トンネリング構成でのオンプレミスサーバへのアクセスは注意が必要です。今回はその方法を具体的に説明します。
強制トンネリングとBastion の制約
通常、オンプレミスサーバへのアクセスの場合には Bastion の IP ベースの接続を使用するのですが、強制トンネリング構成の場合は使用できません。
裏側の仕様までは未確認ですが、おそらく IP ベースの接続を有効にした場合、Express Route Gateway や VPN Gateway から Bastion が BGP のルートを学習するため、強制トンネリング時はインターネット -> Bastionの戻り通信がオンプレミス側にルーティングされ、アクセス不可となると考えらえます。
Azure Linux VM を SSH Proxy として使用
強制トンネリングの場合でも Azure Linux VM を SSH Proxy として使用することで、直接オンプレサーバに SSH アクセスすることができます。まず Bastion の Azure CLI コマンドを用いてトンネルを確立します。なお、ネイティブ クライアント機能を使用するため、 Standard SKU が必要です。
az network bastion tunnel --name "<BastionName>" --resource-group "<ResourceGroupName>" --target-resource-id "<VMResourceId or VMSSInstanceResourceId>" --resource-port "<TargetVMPort>" --port "<LocalMachinePort>"
なお、<LocalMachinePort>
はトンネルを張った後に localhost 宛てに SSH するときに指定するポート番号なので、10022 などを指定すれば大丈夫です。
今回は SSH Proxy を使用するので、トンネル確立された後、127.0.0.1 に対して ProxyCommand のオプションを使用してアクセスします。この際、中継用 Azure Linux VM と最終接続先のサーバの 2 つの認証が行われます。(Azure VM が証明書認証の場合、パスワードを求められるのは最終接続先のサーバのみです)
ssh -o ProxyCommand='ssh -p <LocalMachinePort> -i <SshKeyFilePath> -W %h:%p <AzureVmUserName>@127.0.0.1' <OnpremServerUserName>@<OnpremServerIpAddress>
また、以下のように scp も可能です。
scp -o ProxyCommand='ssh -p <LocalMachinePort> -i <SshKeyFilePath> -W %h:%p <AzureVmUserName>@127.0.0.1' <SrcFilePath> <OnpremServerUserName>@<OnpremServerIpAddress>:<DstFilePath>
実際にアクセスしてみる
オンプレ環境が準備できなかったので、最終アクセス先も Azure VM になりますが、IP アドレスでアクセスしています。
トンネル接続
SSH Proxy 経由で ssh アクセス (別ウィンドウ)
SSH Proxy 経由で scp アクセス
サンプル コマンド
# トンネル接続
$bastionName = "Bastion-HubVnet"
$resourceGroup = "rg-network"
$targetResourceId = "/subscriptions/xxxxxxx/resourceGroups/rg-compute/providers/Microsoft.Compute/virtualMachines/vm-ubuntu-jpe-001"
$authType = "ssh-key"
$userName = "azureuser"
$sshKey = "<filepath>\sshkey.pem"
$targetPort = "22"
$localPort = "10022"
az login
az network bastion tunnel --name $bastionName --resource-group $resourceGroup --target-resource-id $targetResourceId --resource-port $targetPort --port $localPort
# SSH Proxy 経由のアクセス
$userName = "azureuser"
$sshKey = "C:\ssh\sshkey.pem"
$localPort = "10022"
$proxyCommand = "ssh -p " + $localPort + " -W %h:%p -i """ + $sshKey + """ " + $userName + "@127.0.0.1"
# SSH
ssh -o ProxyCommand=$proxyCommand azureuser@10.0.0.41
# SCP
scp -o ProxyCommand=$proxyCommand C:\tmp\test.txt azureuser@10.0.0.41:/home/azureuser/
まとめ
今回は強制トンネリング構成時の Bastion を使用したオンプレサーバへの SSH アクセスを紹介しました。しかしながら、制約をむりやり回避するためのイレギュラーなアクセス方法であるため、実際に運用で使用される場合には十分に検証されることをお勧めします。
Discussion