※本記事は、個人の意見および個人的活動を記したものであり、会社を代表するものではありません
以前の投稿で、「VMアカウント管理を単純にして、パスワード管理を簡略化したい」という思いからいくつかVMへのアクセス方式を検討してみた。
「S2P VPN with EntraID + RDP方式」と「Bastion with KeyVault方式」の2つを検討し、独断でメリットとデメリットを比較検討した結果、「Bastion with KeyVault方式」によるパスワード管理方式にすることとした。
どちらも結局はVMのOSローカルアカウント管理が必要なのだが、KeyVault方式の方が、手元でパスワードを管理する必要がなくなる。
アカウントのパスワードを複数人で共有するために「パスワードを、パスワード付きExcelファイルに保存して、共有フォルダーで管理」とか、それってどうなん?っていつも思うけど、厳密な管理の要件と利便性のトレードオフにいつも悩まされる。
せめてM365の機密度ラベルでファイルを保護するようにすべきだと思うのだが、そもそも早くパスワードレスな世界になってほしいと願うばかり。
以前の記事はこちらを参照。
今回は、検討結果に基づき、例えば運用担当者が最小限の権限でVMにログインできるようにしたい場合、どのようなロールを付与すれば良いのかを検討してみる。
1. Bastion with KeyVault方式の検討結果
ざっくり決めたVMへのアクセス制限方法は以下。
- VMへのアクセス制限
- Bastion経由でリモートログイン
- 特定のセキュリティグループ(例えば、運用管理担当グループ)のメンバーに限定
- VMのOSローカルアカウントのパスワード管理
- KeyVaultのシークレットに保存
- Azure Functionsで定期的にシークレット上のパスワードを自動更新
- KeyVaultへのアクセス制限
- 管理用VNetにプライベートエンドポイントで閉域網を構成
- 管理用VNetと個別システム用VNetをピアリングし、各VNetのプライベートIPに制限
この中で、今回は「VMへのアクセス:特定のセキュリティグループのメンバーに限定」というところに言及してみる。
KeyVaultへのアクセス制限、およびVMへのアクセス制限に関する対応のほとんどは、以前の記事で実施しているのでそちらを確認。
https://qiita.com/masafullversion/items/9d1333c1abf4b06febf3
https://qiita.com/masafullversion/items/87668ac28af6aaeff300
また、パスワードの変更をAzure Functionsで自動化するのは別の記事で掲載予定とする。
2. VMへログインできるユーザーを特定セキュリティグループメンバーに限定する
Bastion経由でVMにログインするために必要なロールは以下の4つ。
- VMのReaderロール
- VM NICのReaderロール
- BastionのReaderロール
- VNetのReaderロール
これに加えて、パスワードをKeyVaultのシークレットで管理する場合は、以下2つのロールも追加で必要。
- KeyVaultのKey Vault Readerロール
- KeyVaultのKey Vault Secret Userロール
上記ロール以外にも、ユーザーが利用しているクライアントPCのパブリックIPを以下の2つのポイントでリソース作成時に許可しておく必要がある。
- KeyVaultのネットワーク設定
- BastionSubnetのNSGの受信許可リスト
KeyVaultのネットワーク設定に追加する場合、ネットワークの制限として特定のネットワークからのみアクセスを許可する設定を前提としている。KeyVaultをプライベートエンドポイントでVNetに接続している場合については別で検証する。
2-1. セキュリティグループの作成
運用担当グループを作成する。
この後、このグループに対してVMにアクセスできる権限を付与していく。
グループにユーザーを追加。
事前に運用想定ユーザーを作成。
2-2. VMのReaderロールを付与
作成したグループにVMのReaderロールを付与する。
これだけでは、グループメンバーはVMにはアクセスできるが、Bastionにアクセスできない。
2-3. VM NICのReaderロールを付与
作成したグループにVM NICのReaderロールを付与する。
VNetへのReaderロールが必要というエラーが表示された。
2-4. VNetのReaderロールを付与
作成したグループにVNetへのReaderロールを付与する。
エラーは発生しないものの、作成済みのBastionが参照されていない。
2-5. Azure BastionのReaderロールを付与
作成したグループにAzure BastionのReaderロールを付与する。
ようやくBastionにアクセスできたが、パスワードを管理しているKeyVaultが参照できない。
2-6. KeyVaultのKeyVaultReaderロールを付与
作成したグループにAzureのKeyVaultReaderロールを付与する。
KeyVaultにはアクセスできたが、シークレットにアクセスできない。
2-7. KeyVaultにクライアントPCのパブリックIPを付与
KeyVaultのネットワークに、クライアントPCのパブリックIPレンジを追加。(IPレンジを登録するスクリーンショットは割愛)
シークレットにはアクセスできたが、シークレット値にはアクセスできず。
2-8. KeyVaultのKeyVaultSecretUserロールを付与
ようやくアクセスできた。
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で追加する必要がある。
これでようやくBastion経由でVMのOSにログインできた。
次回はセキュリティグループの作成とロール付与をスクリプトで定義してみる。