みなさん、こんにちは。Key Vault 大好き椎熊です。
前回 Key Vault をご紹介した記事の最後に少し触れさせていただきましたが、Azure リソースのマネージド ID についてご存知でしょうか。(以前は、マネージド サービス ID(MSI)という名称でした。)
Virtual Machine(以下、VM)などのリソースにある、あの 「ID」 という機能です。
一度は目にしたことがあるのではないでしょうか。
今回は、Azure リソースのマネージド ID と Azure Key Vault(以下、Key Vault)を組み合わせた、セキュアなパスワード管理方法についてご紹介します。
マネージド ID とは、VM などのリソース割り振られた、 Azure Active Directory(以下、Azure AD)上の ID です。
マネージド ID の機能を有効化すると、リソースが所属しているテナントの Azure AD 上に ID が自動的に作成されます。
Azure AD に ID があるということは、Azure AD で認証できるということです。
Azure AD で認証できるということは、Azure AD によって保護されているリソースにアクセスするためのアクセス許可を付与(認可)できるということになります。
例えば、この VM からこの Key Vault へのアクセスを許可するといったことができます。
マネージド ID を使った Azure AD への認証はパスワードを必要としません。
Azure VM のインスタンスには、自身の VM からしかアクセスできない REST API のエンドポイントが存在します。
このエンドポイント経由で Azure AD へ認証します。
そのため、パスワードというものは必要ありません。
他サービスでも同じようなエンドポイントが用意されており、VM と同様にエンドポイント経由で認証します。
下記の図は Key Vault でシークレット情報を取得する際の利用イメージです。
マネージド ID が有効になっている VM 上のプログラムから API を呼び出し、認証をします。
認証後、トークンを使用して、Key Vault へアクセスします。
Key Vault のデータプレーンのアクセス制御には、アクセスポリシーを使用します。
最新の情報は以下を参照いただければと思います。
実際にやってみようということで、先ほどご説明した 「Key Vault からシークレット情報を取得する」 を試します。
手順は以下のとおりです。
前提条件)VM が作成されていること、Key Vault が作成されていること(こちらの記事を参照ください)
3 - 1. VM のマネージド ID を有効化する
3 - 2. Key Vault のアクセスポリシーを設定する
3 - 3. VM から Key Vault へアクセスする
[すべてのサービス] - [Virtual Machines]を選択します。
マネージド ID 有効化させたい仮想マシンを選択します。
[ID] を選択後、状態を [オン] にし、[保存] を選択します。
[はい] を選択します。
Azure AD に作成されたか確認します。
[すべてのサービス] – [Azure Active Directory] を選択します。
[エンタープライズアプリケーション] – [すべてのアプリケーション] を選択します。
アプリケーションの種類のプルダウンを選択し、 [すべてのアプリケーション] を選択します。
先ほど作成した VM と同名のアプリケーションが存在していることが確認できます。
[すべてのサービス] – [キーコンテナー] を選択します。
キーコンテナーの画面より、[<任意のキーコンテナー>] – [アクセス ポリシー] – [新規追加] を選択します。
[プリンシパルの選択] を選択します。
対象のリソースを検索し、選択します。
[選択] を選択します。
シークレットのアクセス許可のプルダウンを選択し、[シークレットの管理操作 – 取得] を選択します。
選択し終えたら、[OK] を選択します。
[保存] を選択します。
対象の VM にログインし、PowerShell を起動します。
Azure AD よりトークンを取得します。
> $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -Method GET -Headers @{Metadata="true"}
上記手順で Azure AD への認証が完了しました。
取得結果を Json 形式に変換します。
> $content = $response.Content | ConvertFrom-Json
Json 形式に変換後、中身を確認すると、access_token にトークンが格納されていることが確認できます。
> $content
トークンのみを抽出し、変数に格納します。
> $KeyVaultToken = $content.access_token
Key Vault からシークレットを取得します。
(Invoke-WebRequest -Uri https://<your-key-vault-URL>/secrets/
<your-key-vault-URL>:キーコンテナーの概要ページにある [DNS 名]を指定します。
<secret-name>:シークレットの名前を指定します。
value に格納されているのがシークレット情報となります。
マネージド ID を使用しないでプログラム上で Azure AD 認証をするためには、Azure AD 上でアプリケーション登録を手動でして、ID/パスワードを取得する必要があります。
そして、リソースにアクセスするためには、その ID/パスワードをプログラムにハードコードしなくてはなりませんでした。
そういった課題もマネージド ID を使えば、パスワードは不要となり、パスワードをハードコードしなくてもよいので、パスワードが漏えいするなどといったリスクを低減することが可能です。
今回は VM から Key Vault へのアクセスをご紹介しましたが、対応しているサービスは他にもあります。
詳しくは、下記 URL を参考にしてください。
https://docs.microsoft.com/ja-jp/azure/active-directory/managed-identities-azure-resources/services-support-msi
そして、マネージド ID は利用料がかかりませんので、ぜひ利用してみてください。