Azure Bastion と Key Vault の連携手順

Azure Bastion は Azure VM への安全な接続を提供するマネージドサービスで、TLS 通信で VM に RDP/SSH 接続を行うことができます。Bastion 経由の接続は様々な方法、パターンがありますが、本記事ではパスワードや SSH Key を Key Vault と連携して利用する方法を中心に記載します。

## Azure Bastion のアーキテクチャ

Bastion は以下のようなアーキテクチャで Web ブラウザや RDP/SSH のネイティブクライアントから TLS 経由で Azure VM に接続することができます。
AzureBastionSubnet に NSG を適用することで、Azure Bastion へ接続する送信元アドレスを制限することもできます。NSG を設定する際は GatewayManager や Bastion コンポーネント間の通信が適切に行えるように NSG を設定してください。NSG の要件は[こちら参照。](https://learn.microsoft.com/ja-jp/azure/bastion/bastion-nsg#apply)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/0e12fccf-a039-e620-068d-fd5e5a9dd7b4.png)


## Azure Bastion への接続方法と認証パターン

| 接続方法 | 認証方法|
|-|-|
| Web ブラウザ (RDP) | 1. ユーザー/パスワード手入力 <br> 2. パスワードを Key Vault から読み込む |
| Web ブラウザ (Linux) | 1. ユーザー/パスワード手入力 <br> 2. パスワードを Key Vault から読み込む <br> 3. SSH Key をローカルから読み込む <br> 4. SSH Key を Key Vault から読み込む|
| ネイティブクライアント (RDP) | 1. ユーザー/パスワード手入力 <br> 2. Entra ID 認証 |
| ネイティブクライアント (Linux) | 1. ユーザー/パスワード手入力 <br> 2. Entra ID 認証 <br> 3. SSH Key をローカルから読み込む|
| ネイティブクライアント (tunnel) | 1. ユーザー/パスワード手入力 <br> 2. SSH Key をローカルから読み込む|
|共有可能リンク (RDP)|1. ユーザー/パスワード手入力|
|共有可能リンク (Linux)|1. ユーザー/パスワード手入力 <br> 2. SSH Key をローカルから読み込む|

上記からわかるように **Key Vault を連携して利用する場合、Azure Portal (Web ブラウザ) からの接続でしかサポートされておりません。**

## Key Vault 側の準備

### パスワードをシークレットとして登録
Key Vault のシークレットの画面から "生成/インポート" をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/d8dc28c9-9cc5-0464-5976-99027b0c67c0.png)

シークレットの名前とシークレット値 (パスワードの文字列) を入力し、作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/cff477f2-9dae-415d-d39c-0496ab93f66d.png)

### SSH キーを作成し Key Vault シークレットとして登録
Azure Portal で SSH キーの組み合わせ (公開鍵、秘密鍵) を作成し、Azure 基盤上に公開鍵を保存して鍵を管理、再利用することができます。Azure VM 作成時に "新しいキーの組の生成" を選んだ際も同様です。

#### SSH Key をポータルから作成
Azure Portal の検索バーに SSH と入力すると "SSH キー" が出てきますのでクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/df2349ed-f001-4e3f-0fb7-1127ba8bdbb7.png)

"作成" をクリックし、リソースグループ、リージョン、SSH キーの組の名前を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/3cb46698-b962-b067-52de-e31d74e9470b.png)

"秘密キーのダウンロードとリソースの作成" をクリックします。ブラウザにて秘密鍵 (PEM ファイル) ダウンロードされるので保管しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/51f542f4-8939-d924-17ab-0b49600fdc6a.png)

#### 秘密鍵を Key Vault へ登録

<font color="Red">現状、Azure ポータルでは SSH の公開鍵のように改行が入っており、値が複数行になっている形式はサポートされておりません。Azure CLI まはた Powershell にてファイルから登録する必要があります。</front>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/27e95192-148d-2358-cf88-af1cf014f6ee.png)


そのため、az コマンドにて前の手順でダウンロードした秘密鍵のファイル名を指定して、Key Vault のシークレットとして登録します。

```
az keyvault secret set --vault-name "<KeyVault Name>" --name "<Secret Name>" --file "<SSH KeyName>.pem"
```

https://learn.microsoft.com/ja-jp/azure/key-vault/secrets/multiline-secrets

:::note warn
複数行のシークレットを Azure CLI の az keyvault secret set コマンドや Azure PowerShell の Set-AzKeyVaultSecret コマンドレットにコマンドラインを介して渡すことはできません。 代わりに、まず複数行のシークレットをテキスト ファイルとして格納する必要があります。
:::

### ネットワーク設定
Azure Key Vault でネットワーク制限をしたいという要件はあると思いますが、Bastion と組み合わせて利用する際はクライアント端末から Key Vault へのアクセスが発生するため、<font color="Red">クライアント端末の IP アドレスを許可する必要があります。</front>

**以下の様に Azure Bastion からのサービスエンドポイントを許可して利用するといったことはできませんでした。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/792115d3-92cb-5d71-3119-924fd8de2ae2.png)

理由として、Key Vault のネットワーク設定ででクライアント端末からのアクセスが許可されていないと Key Vault 内のシークレット (パスワード、SSH Key) を参照することができないためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/f575b403-53af-3c07-798a-f715d9b3ec68.png)

### 権限設定
現在、Key Vault には 2 つの認可方式 (RBAC/アクセスポリシー) がサポートされております。どちらでも Bastion は動作可能でしたので、Bastion でログインさせるユーザーには最低限、必要となるロールを設定しておきます。

| 認可方式 | 認証方法|
|-|-|
| アクセスポリシー | 一覧 (List) <br> 取得 (Get) |
| RBAC | キー コンテナー閲覧者 <br> キー コンテナー シークレット ユーザー |

どちらの認可方式でも、前者は Key Vault 内で利用可能なシークレットを参照するための権限で、後者はシークレットの値を取得するために必要となります。

## 動作確認
### Azure VM 作成

Linux VM を作成して動作確認をします。先ほど作成した SSH の公開鍵を指定して Azure VM (Linux) を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/cc9ad5c9-da6d-8942-e58f-2d038cde1694.png)

### Key Vault (SSH Key) の利用

VM が作成できたら、Key Vualt にアップグレードした秘密鍵を指定して、SSH ができるかを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/90d9075d-259e-087a-c848-0cf95fabfa59.png)

SSH キーの組み合わせ、Key Vault の権限、Key Vault のネットワーク設定のそれぞれが正しく設定できていれば以下の様に接続できるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/81f8f4eb-2128-1336-fd1b-f6f7e9c6b906.png)