Azure Bastion経由でファイルをアップロード

本記事では、**Azure Bastionを経由して、直接仮想マシンにファイルをアップロードしてみた**という内容となります。

筆者自身へのAzure Bastionへの理解を深める目的での記事でもありますので、まずはBastionの簡単な解説からします。

# Azure Bastionとは
Azure Bastionとは、仮想マシン(VM)への安全な接続確立を実現するサービスとなっています。いわゆる、**踏み台サーバー**としての役割を持ち、RDPやSSHで接続可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/d088d58e-28c8-c9e1-835b-7e6bd8df40bf.png)
踏み台サーバーとしての役割を持つことから、Azure Bastionを用いることで、システム上にある多くのサーバーへの接続経路を一元化できるため、クラウド上のサーバーに対する不正な接続を遮断し、漏れなくアクセス監査が可能となります。

これにより、「いつ、誰が、どこからアクセスしたか」を定期的にチェックできるので、不正アクセスのリスクを減らせるメリットなどがあります。

### 従量課金制で、2種類のSKU（Basic・Standard）が存在する
Azure Bastionには、BasicとStandardという2種類のSKUが存在し、Bastionのインスタンス数がBasicは1つ、Standardは2～50個と異なります。
なお、インスタンス数は、同時接続数の考慮や性能監視の観点で、増やすケースがあります。
また、SKU別に機能面では以下表のような違いがあります。

|  | Basic SKU | Standard SKU |
|:-:|:-:|:-:|
| ピアリングされた仮想ネットワーク内のターゲット VM に接続する  | 利用可能 | 利用可能 |
| Azure Key Vault (AKV) で Linux VM のプライベート キーにアクセスする | 利用可能 | 利用可能 |
| ホストのスケーリング | 該当なし | 利用可能 |
| カスタム受信ポートの指定 | 該当なし | 利用可能 |
| RDPを使用したLinux VMへの接続 | 該当なし | 利用可能 |
| SSHを使用したWindows VMへの接続 | 該当なし | 利用可能 |

参照：https://github.com/MicrosoftDocs/azure-docs.ja-jp/blob/master/includes/bastion-sku.md

さらに、Azure Bastionは従量課金制で、本記事執筆時点では以下の価格となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/137a113c-3209-6659-fc9c-895cfb9f3f66.png)
参照：[Azure Bastionの価格](https://azure.microsoft.com/ja-jp/pricing/details/azure-bastion/)

Standardの方が値段が高いのは機能的にももちろんそうなのですが、Standardのインスタンス数は2台からなので、数を増やしたい場合はStanadardで増やした方が安上がりになりますね。
ちなみに、Azure Bastionは設定する際に、NSGの設定方法など厄介な箇所がありますが、以下の記事などがとてもよくまとまっていて参考になります。

:::note info
Bastion のサブネットに 適用する NSG の設定例
https://jpaztech.github.io/blog/network/bastion-nsg/
:::

# Azure Bastion経由でターゲットVMにファイルをアップロードする
では、今回の本題です。
2021年11月より、Azure Bastionのネイティブクライアントに関するアップデートが頻繁に報告されており、2022年の3月より**Azure BastionのStandard SKUにてWindowsのRDP、SSHクライアントによる接続**がGAになりました。

簡単に図で表すと、Azure Files等他サービスを使用する必要なく、以下経路にてファイル共有が可能になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/5745ffe5-8be5-b8a1-48f3-637893517581.png)
ということで、さっそく試してみます。手順は以下となります。

1. ファイルアップ対象VM構築
2. Azure Bastionを作成
3. ターゲットVMへの接続・ファイルアップ・ダウンロード

では、1つずつ解説します。
## 1. ファイルアップ対象VM構築
VM構築については、特に指定もないので、[こちらの記事](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/quick-create-portal)あたりを参考に構築してください。
## 2. Azure Bastionを作成
こちらは[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/bastion/vm-upload-download-native)に則って、設定を進めます。
まずは、Azure Bastionページの`作成`より必要情報を入力してBastionの作成を進めます。
設定時の注意点としては、以下2点です。
#### ① インスタンスレベルは「Standard」を選択
`基本`タグより、インスタンスのレベルは`Standard`を選んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/5ebd7bb4-bccc-fd93-7a6c-275f8d0f3321.png)
#### ② Bastionの機能として、「コピー/貼り付け」「ネイティブ クライアント サポート」を選択
`詳細設定`タグより、Bastionの機能として`コピー/貼り付け`と`ネイティブ クライアント サポート`を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/4637b4a2-99c9-24f9-65cf-686084106ac9.png)

他には、パラメータやネットワークの設定等が必要になりますが、[こちら](https://docs.microsoft.com/ja-jp/azure/bastion/tutorial-create-host-portal)の記事等を参考にして作成してください。およそ5分ぐらい待つと、デプロイも完了して、Bastionが起動します。
## 3. ターゲットVMへの接続・ファイルアップ・ダウンロード
次に、ネイティブクライアントからVMへの接続を試していきます。
:::note warn
事前にAzure CLIは使えるように準備が必要です）
:::
以下コマンドより、正しく設定が出来ていれば、パスワードを入力すればターゲットVMへ接続ができるはずです！
```powershell
# RDP
az network bastion rdp --name "<BastionName>" --resource-group "<ResourceGroupName>" --target-resource-id "<VMResourceId>"
# SSH
az network bastion ssh --name "<BastionName>" --resource-group "<ResourceGroupName>" --target-resource-id "<VMResourceId>"
```
これで、接続はできるはずです！

続いて、ファイルアップを試してみます。RDPの場合は、上記の`az network bastion rdp`コマンドを使用してVMに接続した後、右クリックからコピー＆ペーストでアップロードおよびダウンロードが可能です。
一方で、SSHの場合は、`az network bastion tunnel`コマンドを使用して、VMへのトンネルを開く必要があります。
```powershell
az network bastion tunnel --name "<BastionName>" --resource-group "<ResourceGroupName>" --target-resource-id "<VMResourceId>" --resource-port "<TargetVMPort>" --port "<LocalMachinePort>"
```
次に、上記で使用したコマンドとは別コマンドより、トンネル経由でファイルのアップロードを実施します。下記コマンドを実行することで、ローカルPCに保存されているファイルを簡単にターゲットVMにアップロードできます。
```powershell
scp -P <LocalMachinePort> <local machine file path> <username>@127.0.0.1:<target VM file path>
```
これで、ファイルのアップロードが実施できます。

しかし、残念ながら、[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/bastion/vm-upload-download-native#tunnel-command)に以下の記載がありました。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/c0429685-5ee8-bb79-2fe8-57bb81051d00.png)
現状、RDPではコピペでファイルのアップロードもダウンロードも可能なようですが、SSHではまだダウンロードはサポートされていないようです。
今後のアップデートに期待ですね。

# まとめ
今回、Azure Bastionからネイティブクライアントでファイル転送できるか試してみました。
RDPとSSHで機能にズレ（SSHではダウンロードがサポートされていない）があるのは少々気になりますが、Bastion作成時の設定さえ気を付ければ、比較的簡単にファイルアップ可能な環境を作れるようになったのは魅力的ですね。

一方で、Bastion経由では簡単にローカルPCからアップロード・ダウンロードが可能になったため、ファイル管理が厳重なプロジェクトなどでは、**インスタンスレベルやBastionでの設定変更可能な権限の確認等の注意**が必要ですね。