#016: 運用管理ユーザーにVMリモートログインを想定したAzureロールを付与

※本記事は、個人の意見および個人的活動を記したものであり、会社を代表するものではありません

以前の投稿で、「VMアカウント管理を単純にして、パスワード管理を簡略化したい」という思いからいくつかVMへのアクセス方式を検討してみた。

「S2P VPN with EntraID + RDP方式」と「Bastion with KeyVault方式」の２つを検討し、独断でメリットとデメリットを比較検討した結果、「Bastion with KeyVault方式」によるパスワード管理方式にすることとした。

どちらも結局はVMのOSローカルアカウント管理が必要なのだが、KeyVault方式の方が、手元でパスワードを管理する必要がなくなる。

:::note warn
アカウントのパスワードを複数人で共有するために「パスワードを、パスワード付きExcelファイルに保存して、共有フォルダーで管理」とか、それってどうなん？っていつも思うけど、厳密な管理の要件と利便性のトレードオフにいつも悩まされる。
せめてM365の機密度ラベルでファイルを保護するようにすべきだと思うのだが、そもそも早くパスワードレスな世界になってほしいと願うばかり。
:::

以前の記事はこちらを参照。

https://qiita.com/masafullversion/items/71047231d2e6e01c8fbf

今回は、検討結果に基づき、例えば運用担当者が最小限の権限でVMにログインできるようにしたい場合、どのようなロールを付与すれば良いのかを検討してみる。

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

# 1. Bastion with KeyVault方式の検討結果

ざっくり決めたVMへのアクセス制限方法は以下。

- VMへのアクセス制限
    - Bastion経由でリモートログイン
    - 特定のセキュリティグループ（例えば、運用管理担当グループ）のメンバーに限定
- VMのOSローカルアカウントのパスワード管理
    - KeyVaultのシークレットに保存
    - Azure Functionsで定期的にシークレット上のパスワードを自動更新
- KeyVaultへのアクセス制限
    - 管理用VNetにプライベートエンドポイントで閉域網を構成
    - 管理用VNetと個別システム用VNetをピアリングし、各VNetのプライベートIPに制限

この中で、今回は「VMへのアクセス：特定のセキュリティグループのメンバーに限定」というところに言及してみる。

:::note
KeyVaultへのアクセス制限、およびVMへのアクセス制限に関する対応のほとんどは、以前の記事で実施しているのでそちらを確認。

https://qiita.com/masafullversion/items/9d1333c1abf4b06febf3
https://qiita.com/masafullversion/items/87668ac28af6aaeff300

また、パスワードの変更をAzure Functionsで自動化するのは別の記事で掲載予定とする。
:::

# 2. VMへログインできるユーザーを特定セキュリティグループメンバーに限定する

Bastion経由でVMにログインするために必要なロールは以下の４つ。

- VMのReaderロール
- VM NICのReaderロール
- BastionのReaderロール
- VNetのReaderロール

これに加えて、パスワードをKeyVaultのシークレットで管理する場合は、以下２つのロールも追加で必要。

- KeyVaultのKey Vault Readerロール
- KeyVaultのKey Vault Secret Userロール

上記ロール以外にも、ユーザーが利用しているクライアントPCのパブリックIPを以下の２つのポイントでリソース作成時に許可しておく必要がある。

- KeyVaultのネットワーク設定
- BastionSubnetのNSGの受信許可リスト

:::note
KeyVaultのネットワーク設定に追加する場合、ネットワークの制限として特定のネットワークからのみアクセスを許可する設定を前提としている。KeyVaultをプライベートエンドポイントでVNetに接続している場合については別で検証する。
:::

## 2-1. セキュリティグループの作成

運用担当グループを作成する。

この後、このグループに対してVMにアクセスできる権限を付与していく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/5febb47c-8437-153b-3c51-4ebd45541ec7.png)

グループにユーザーを追加。

:::note
事前に運用想定ユーザーを作成。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/168816f1-1e75-e0ef-9b4e-47b2ee669bc0.png)

## 2-2. VMのReaderロールを付与

作成したグループにVMのReaderロールを付与する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/5e04206e-dd76-bab2-a35c-f1a68cbadb55.png)

これだけでは、グループメンバーはVMにはアクセスできるが、Bastionにアクセスできない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/23bf9f72-fa32-3b9b-26a8-709a6706ef4c.png)

## 2-3. VM NICのReaderロールを付与

作成したグループにVM NICのReaderロールを付与する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/40eb8292-3bac-e6e1-0662-5955c9471c07.png)

VNetへのReaderロールが必要というエラーが表示された。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/0e7dabec-4fbd-f855-573f-bbbc35d1b56d.png)

## 2-4. VNetのReaderロールを付与

作成したグループにVNetへのReaderロールを付与する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/64070853-d248-f9fa-ba8e-8fe4db426f9e.png)

エラーは発生しないものの、作成済みのBastionが参照されていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/4953ea73-b2ba-846b-3f5a-2c30c4aacae9.png)

## 2-5. Azure BastionのReaderロールを付与

作成したグループにAzure BastionのReaderロールを付与する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/fade6df4-e520-c245-1d7a-6351ce442856.png)

ようやくBastionにアクセスできたが、パスワードを管理しているKeyVaultが参照できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/b179c498-308b-3418-8692-f4f3d241c3bb.png)

## 2-6. KeyVaultのKeyVaultReaderロールを付与

作成したグループにAzureのKeyVaultReaderロールを付与する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/b3e52238-4776-8e9f-46a4-69d351b78b77.png)

KeyVaultにはアクセスできたが、シークレットにアクセスできない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/06c55ffd-1c55-8814-3b39-168c696c1654.png)

## 2-7. KeyVaultにクライアントPCのパブリックIPを付与

KeyVaultのネットワークに、クライアントPCのパブリックIPレンジを追加。（IPレンジを登録するスクリーンショットは割愛）

シークレットにはアクセスできたが、シークレット値にはアクセスできず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/ef9aba78-94b3-bf5b-8a28-033172ecb470.png)

## 2-8. KeyVaultのKeyVaultSecretUserロールを付与

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/43cb637f-abd9-6176-e229-360e26b18ea5.png)

ようやくアクセスできた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/05222db4-e18a-6bcc-df06-8a40ecd00ecf.png)

## 2-9. KeyVaultでパスワード管理をしたVMにBastion経由でアクセスための最小ロール検証結果

対象のセキュリティグループに付与したロールは以下。

- VMのReaderロール
- VM NICのReaderロール
- BastionのReaderロール
- VNetのReaderロール
- KeyVaultのKeyVaultReaderロール
- KeyVaultのKeyVaultSecretUserロール

上記に加えて、KeyVaultのネットワーク受信規則にクライアントPCのパブリックIPをAllow追加。

## 2-10. VMへのログインにはBastionSubnetへのIP登録も必要

Bastion経由でVMにログインするための情報にアクセスするための条件は揃ったが、実際にログインしようとすると、真っ白なままフリーズして先に進まず。（スクショは割愛）

これは、BastionSubnetのNSGの受信規則に対して、クライアントPCのパブリックIPレンジをAllowで追加する必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/1af634b6-86e6-b1d1-a353-78eb789ebe6e.png)

これでようやくBastion経由でVMのOSにログインできた。

次回はセキュリティグループの作成とロール付与をスクリプトで定義してみる。