はじめての Azure Bastion

## はじめに

2019 年 11 月に **Azure Bastion** が正式に利用できるようになりました。
せっかくなので、Azure Bastion の設定手順などを紹介してみたいと思います。
この情報が、どなたかのお役に立つと幸いです！

## Azure Bastion って、何に使うの？

**仮想ネットワーク (VNet) に構築した仮想マシン (VM) に
“安全に” SSH やリモート デスクトップ接続するために使います。**

Azure の仮想ネットワーク (VNet) に IaaS (VM) を構築するというのは、よくあることです。
構築後は、SSH やリモート デスクトップを使用して VM に接続し、作業をするわけですが…
VNet 内に構築した VM は、外部のネットワークと通信することは基本的にできません。
なので、下記の方法などを使用し、VNet および VM へ接続できるようにする必要があります。

- 踏み台 VM を用意し、踏み台 VM にパブリック IP アドレスを設定する。
- VNet とオンプレミスの環境を VPN Gateway で接続する。
- ExpressRoute を使用する。

とはいえ、パブリック IP アドレスを設定して SSH やリモート デスクトップに必要なポートを公開するのはドキドキしてしまいます。
VPN Gateway と ExpressRoute は、企業の場合、一般的な方法だと思いますが、おそらく個人ではあまり使用しないのではないでしょうか。

そこで、**Azure Bastion** の登場です。
Azure ポータルでポチポチするだけで、安全に VM に接続できる環境ができあがります！

## Azure Bastion って、どうやって構築するの？

さっそく、Azure Bastion を構築していきたいと思います。  
この記事では、下図の構成を構築します。
また、赤枠の部分を構築するものとし、それ以外の部分は構築済みという前提とします。
![構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/8304277c-9032-d31f-009a-c774629d5016.png)
構築は下記の手順で行います。

1. サブネットの構築
2. Azure Bastion の構築
3. Network Security Group (NSG) の設定  
   ※ NSG の設定は、Azure Bastion の動作に必須ではありませんが、  
      &emsp;&nbsp;より安全に使用するために行っています。

### サブネットの構築

Azure Bastion には、専用のサブネットが必要です。
なので、まずはサブネットから作成します。
(Azure Bastion の作成画面で、ついでにサブネットを作成しても OK です。)

1. Azure ポータルのメニューから `すべてのサービス` を選択し、検索ボックスに `vnet` と入力し、検索します。
   すると、`仮想ネットワーク` というサービスが見つかるので、これをクリックしてください。
   ![subnet_create_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/799274ec-8e14-4bb2-a7fa-a95b4a9d896b.png "すべてのサービス > 仮想ネットワーク")

2. VNet の一覧に遷移するので、サブネットを追加したい VNet をクリックしてください。
   ![subnet_create_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/9e0d6f50-fafe-1d10-541f-9da443d42101.png "対象 VNet の選択")


3. VNet のメニューの `サブネット` をクリックし、表示されたサブネット一覧の上部にある `サブネット` をクリックしてください。
   ![subnet_create_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/0fd26172-da04-1b60-f41f-9b6688fe53fa.png "サブネットの作成へ遷移")


4. 下図のように入力し、サブネットを作成してください。
   ![subnet_create_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/24eb0938-5328-1fd9-120c-781fe9a842b2.png "サブネットの作成")
<table><thead><tr><th style="text-align:left">入力項目</th><th style="text-align:left">入力値</th><th style="text-align:left">備考</th></tr></thead><tbody><tr><td style="text-align:left">名前</td><td style="text-align:left">`AzureBastionSubnet`</td><td style="text-align:left">**Azure Bastion のサブネットは、<br/>必ずこの名前にしないといけません！**</td></tr><tr><td style="text-align:left">アドレス範囲</td><td style="text-align:left">【任意のアドレス範囲】</td><td style="text-align:left">`/27` または<br/>それより大きい範囲を指定してください。<br/>(`/26` など)</td></tr></tbody></table>

5. サブネットの構築完了です。
   ![subnet_create_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/d9474424-4faf-25b6-30b4-41af60a3367d.png "サブネットの完成")

### Azure Bastion の構築

「構築手順 (サブネット)」で構築したサブネットに、Azure Bastion を構築します。

1. Azure ポータルのメニューから `すべてのサービス` を選択し、検索ボックスに `bastion` と入力し、検索します。
   すると、`複数の要塞` というサービスが見つかります。
   これが Azure Bastion なので、クリックしてください。
   ![bastion_create_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/e7c6eaf6-3311-904f-f7d2-7e3891c0dc2e.png "すべてのサービス > 複数の要塞")

2. Azure Bastion の一覧に遷移するので、`追加` をクリックしてください。
   ![bastion_create_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/956ec2bf-918d-54b3-f22a-6683a316116a.png "Azure Bastion 一覧の追加ボタン")

3. 下図のように入力し、Azure Bastion を作成してください。
   (このときは、デプロイ開始から完了まで 5 分くらいでした。)
   ![bastion_create_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/8da08d02-fb28-2db6-125a-3f581a7fdb54.png "Azure Bastion の作成")
<table><thead><tr><th style="text-align:left">入力項目</th><th style="text-align:left">入力値</th><th style="text-align:left">備考</th></tr></thead><tbody><tr><td style="text-align:left">プロジェクトの詳細</td><td style="text-align:left"></td><td style="text-align:left"></td></tr><tr><td style="text-align:left">&emsp;サブスクリプション</td><td style="text-align:left">【任意のサブスクリプション】</td><td style="text-align:left"></td></tr><tr><td style="text-align:left">&emsp;リソース グループ</td><td style="text-align:left">【任意のリソース グループ】</td><td style="text-align:left"></td></tr><tr><td style="text-align:left">インスタンスの詳細</td><td style="text-align:left"></td><td style="text-align:left"></td></tr><tr><td style="text-align:left">&emsp;名前</td><td style="text-align:left">【(Azure Bastion の)<br/>&emsp;任意のリソース名】</td><td style="text-align:left"></td></tr><tr><td style="text-align:left">&emsp;地域</td><td style="text-align:left">【任意のリージョン】</td><td style="text-align:left">利用可能なリージョン<br/>(2019/12 時点)<br/>&emsp;&#8226; 米国西部<br/>&emsp;&#8226; 米国東部<br/>&emsp;&#8226; 西ヨーロッパ<br/>&emsp;&#8226; 米国中南部<br/>&emsp;&#8226; オーストラリア東部<br/>&emsp;&#8226; **東日本**</td></tr><tr><td style="text-align:left">仮想ネットワークを構成します</td><td style="text-align:left"></td><td style="text-align:left"></td></tr><tr><td style="text-align:left">&emsp;仮想ネットワーク</td><td style="text-align:left">【Azure Bastion の<br/>&emsp;サブネットを作成した VNet】</td><td style="text-align:left"></td></tr><tr><td style="text-align:left">&emsp;サブネット</td><td style="text-align:left"><code>AzureBastionSubnet</code></td><td style="text-align:left"></td></tr><tr><td style="text-align:left">パブリック IP アドレス</td><td style="text-align:left"></td><td style="text-align:left"></td></tr><tr><td style="text-align:left">&emsp;パブリック IP アドレス</td><td style="text-align:left">新規作成</td><td style="text-align:left">既存のものを<br/>流用してもいいと思います。</td></tr><tr><td style="text-align:left">&emsp;パブリック IP アドレス名</td><td style="text-align:left">【任意のリソース名】</td><td style="text-align:left"></td></tr></tbody></table>

4. Azure Bastion の構築完了です。
   ![bastion_create_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/401c0422-b2ef-caa1-85a4-388e9bf36154.png "Azure Bastion の完成")

### Network Security Group (NSG) の設定

より安全に Azure Bastion を使用するため、NSG を作成し、サブネットに設定します。

#### AzureBastion のサブネットの NSG

Azure Bastion のサブネット (AzureBastionSubnet) に NSG を設定します。

1. Azure ポータルのメニューから `すべてのサービス` を選択し、検索ボックスに `nsg` と入力し、検索します。
   すると、`ネットワーク セキュリティ グループ` というが見つかるので、これをクリックしてください。
   ![nsg_create_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/a86c630f-c3b4-a39b-0c92-4837cf19b064.png "すべてのサービス > NSG")

2. NSG の一覧に遷移するので、`追加` をクリックしてください。
   ![nsg_create_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/527fd4e0-af4a-7c9d-60cf-498d9f6b64f1.png "NSG の作成へ遷移")

3. 下図のように入力し、NSG を作成してください。
   ![nsg_create_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/27808566-ace0-2329-cc4c-71402c7d4674.png "NSG の作成")
<table><thead><tr><th style="text-align:left">入力項目</th><th style="text-align:left">入力値</th></tr></thead><tbody><tr><td style="text-align:left">プロジェクトの詳細</td><td style="text-align:left"></td></tr><tr><td style="text-align:left">&emsp;サブスクリプション</td><td style="text-align:left">【任意のサブスクリプション】</td></tr><tr><td style="text-align:left">&emsp;リソース グループ</td><td style="text-align:left">【任意のリソース グループ】</td></tr><tr><td style="text-align:left">インスタンスの詳細</td><td style="text-align:left"></td></tr><tr><td style="text-align:left">&emsp;名前</td><td style="text-align:left">【任意のリソース名】</td></tr><tr><td style="text-align:left">&emsp;地域</td><td style="text-align:left">【VNet と同じリージョン】</td></tr></tbody></table>

4. NSG の作成が完了したら、`リソースに移動` をクリックしてください。
   ![nsg_create_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/314a062d-c55c-9947-8bfb-1b749f3dcf18.png "リソースに移動")

5. VNet のメニューの `受信セキュリティ規則` をクリックし、表示された受信セキュリティ規則一覧の上部にある `追加` をクリックしてください。
   ![nsg_create_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/4744744f-afa8-1ac1-d1cf-a4c1cfb5afe8.png "受信セキュリティ規則の追加に遷移")

6. 下図のように入力し、受信セキュリティ規則を 3 つ追加してください。
   ![nsg_i_1001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/fe262d43-ef0a-1959-b70a-5f1862460402.png "1001 : Allow-HTTPS-InBound")
   ![nsg_i_1002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/334f3f6b-377d-0f47-ed58-cec9312470b0.png "1002 : Allow-GatewayManager-InBound")
   ![nsg_i_4096.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/f0d3b825-f9f4-7e0f-2617-f34a1f60226f.png "4096 : Deny-All-InBound")

7. 受信セキュリティ規則が、下図のようになっていれば OK です。
   ![nsg_i_list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/793e5c5e-9a16-a1f2-53df-216891572cd3.png "受信セキュリティ規則の完成")
   - 1001 : Allow-HTTPS-InBound
     - Internet からの接続を HTTPS (ポート : 443) のみ許可する設定です。
   - 1002 : Allow-GatewayManager-InBound
     - コントロール プレーン (GatewayManager) からの接続を HTTPS (ポート : 443) のみ許可する設定です。
   - 4096 : Deny-All-InBound
     - すべての接続を拒否する設定です。

8. VNet のメニューの `送信セキュリティ規則` をクリックし、表示された送信セキュリティ規則一覧の上部にある `追加` をクリックしてください。
   ![nsg_create_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/fc00ba24-0c13-e9cd-9b8c-2672157bcdd9.png "送信セキュリティ規則の追加に遷移")

9. 下図のように入力し、送信セキュリティ規則を 3 つ追加してください。
   ![nsg_o_1001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/0a9866a2-804c-ada7-7b6f-b685d1d8883a.png "1001 : Allow-SSH-RDP-OutBound")
   ![nsg_o_1002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/776c08c5-da0d-3d04-1ce4-191601556406.png "1002 : Allow-AzureCloud-OutBound")
   ![nsg_o_4096.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/ec3bdefe-682c-04b8-c921-2390d381b275.png "4096 : Deny-All-OutBound")

10. 送信セキュリティ規則が、下図のようになっていれば OK です。
    ![nsg_o_list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/67f3867a-7d8d-dc58-3688-9034b9d71f49.png)
   - 1001 : Allow-SSH-RDP-OutBound
     - VNet 内への接続を SSH (ポート : 22) とリモート デスクトップ (ポート:3389) のみ許可する
設定です。
   - 1002 : Allow-AzureCloud-OutBound
     - Azure 内のパブリック エンドポイントへの接続を HTTPS (ポート : 443) のみ許可する設定です。
   - 4096 : Deny-All-OutBound
     - すべての接続を拒否する設定です。

11. VNet のメニューの `サブネット` をクリックし、表示されたサブネット一覧の上部にある `関連付け` をクリックしてください。
    ![nsg_create_011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/f316a918-10e9-a23d-2504-1a27d8db2dd5.png "サブネットの関連付けに遷移")

12. 下図のように入力し、NSG とサブネットを関連付けしてください。
    ![nsg_create_012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/bab7d270-cb06-e8e5-cff5-45389dc1ed32.png  "サブネットの関連付け")

13. サブネットの関連付けができました。
    ![nsg_create_013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/9639bc9f-37aa-eba3-d8a3-11a298beaa04.png "サブネットの関連付けが完了")

#### VM のサブネットの NSG

VM のサブネット (IaaS-subnet) に NSG を設定します。

1. NSG の作成は、同じ手順なので省略します。

2. 下図のように入力し、受信セキュリティ規則を 2 つ追加してください。
  - ⇩ `ソース IP アドレス/CIDR 範囲` には、Azure Bastion を構築したサブネットの IP アドレス範囲を指定してください。  
   ![nsg_v_i_1001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/bf6d7b6c-6876-3cd5-1316-815c972765c6.png "1001 : Allow-Bastion-InBound")
   ![nsg_v_i_4096.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/cd207da3-12b3-b4fd-3a7c-537ad2e84991.png "4096 : Deny-All-InBound")

3. 受信セキュリティ規則が、下図のようになっていれば OK です。
   ![nsg_v_i_list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/2ebcdfaa-be90-6beb-7e94-1b530cf32282.png "受信セキュリティ規則の完成")
   - 1001 : Allow-HTTPS-InBound
     - Azure Bastion を構築したサブネットからの接続を SSH (ポート : 22) とリモート デスクトップ (ポート:3389) のみ許可する設定です。
   - 4096 : Deny-All-InBound
     - すべての接続を拒否する設定です。
   - **⚠ Azure Bastion を試すのに必要なポートしか開けていないので、他に必要なポートがある場合は、適宜開けてください。**

4. 送信セキュリティ規則の設定は、今回は ~~面倒なので~~ 省略します。
   ここまでの NSG 設定と同じように、必要最小限な範囲で許可するのがいいと思います。

5. 下図のように入力し、NSG とサブネットを関連付けしてください。
   ![nsg_v_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/773ff6ee-9d7f-0832-b1ba-a03e070f0120.png "サブネットの関連付け")

6. サブネットの関連付けができました。
   ![nsg_v_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/02ac1ade-9d8e-2bdb-ca20-9d519f7d9629.png "サブネットの関連付けが完了")

## Azure Bastion って、どうやって使うの？

Azure Bastion が構築できたので、使ってみたいと思います。

1. 接続したい VM の `概要` の上部にある `接続` をクリックしてください。
   ![use_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/98b07b84-86ab-610b-efa7-0e88ea8b0176.png "概要 > 接続")

2. `仮想マシンに接続する` が表示されたら、`要塞` のタブを選択してください。
   VM のログイン情報を入力し、`接続` をクリックすると、Azure Bastion 経由で VM に接続されます。
   **⚠ ポップアップ ブロックに注意！**
   ![use_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/3abf4aa3-4bd3-efd5-b88d-ec31af4b8f4d.png "仮想マシンに接続する")

3. ログインできました。
   ![use_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/bfe2950a-b601-e70a-a63e-079a87ae9482.png "VM にログイン")

### 文字列のコピー＆ペースト

1. Azure Bastion でログインすると、画面左側の中央あたりに `>>` のようなアイコンがあります。
   これ (Clipboard) を使用して、文字列のコピー＆ペーストが行えます。 
   ![use_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/608d417e-d4cc-3501-62cb-20caf9bad8bf.png "Clipboard Icon")

2. 画面上のコピーしたい文字列を選択状態にして、`>>` をクリックすると、選択した文字列が Clipboard に入っています。
   ![use_copy_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/e66d1d8a-dfd6-732a-b367-7daa36d0db11.png "コピーしたい文字列を選択")
   ![use_copy_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/8bb32f23-a508-97d9-615e-73a56aa8ea41.png "Clipboard に入っている")

3. ペーストしたい文字列を Clipboard に入力して `<<` をクリックして閉じてから、(Linux の場合) 画面上で右クリックすると、Clipboard に入力した文字列がペーストされます。
   ![use_paste_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/05026780-3136-3f8b-5da9-64c5db12092a.png "ペーストしたい文字列を入力")
   ![use_paste_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324889/6c9decfe-5f79-7684-a021-5f18e7247cfc.png "右クリックでペースト")

## Azure Bastion って、どう安全なの？

**『VM 自体でのユーザー制御機能』＋『Azure のユーザー・権限制御機能』で、
より安全に SSH 、リモート デスクトップが利用できます！**

Azure Bastion による接続は、Azure ポータルを経由する必要があります。
つまり、Azure Active Directory のユーザー管理機能が使用できます。(ユーザーのサインインのブロックなど…)
また、Azure の IAM などのアクセス管理機能も使用できるので、Azure Bastion を利用するだけのユーザーを用意し、そのユーザーにしか Azure Bastion を利用させないといったことも可能です。

## Azure Bastion って、高いの？安いの？

『¥ 10.64 (ユニット/時間ごと)』なので、1 ヶ月で『¥ 7,767.20』になります。(2019/12 時点)
上記の金額が基本料金で、これにデータ転送量が追加されます。
Azure の安い VM と同じくらいの金額だと思うので、VM の OS アップデートなどの管理の手間がないことを考えれば、妥当ではないかと思います。

## おわりに

外部のネットワークから VM を管理したいと思ったとき、踏み台 VM など、今までの手法の他に **Azure Bastion** という方法もあるということを、頭の片隅に置いておいていただけると幸いです！

## 参考情報

- [Azure Bastion ホストを作成する](https://docs.microsoft.com/ja-jp/azure/bastion/bastion-create-host-portal)