クラウドエンジニアブログ

Azure リソースのマネージド ID を使ったセキュアなパスワード管理

椎熊 裕一

椎熊 裕一

1. はじめに

みなさん、こんにちは。Key Vault 大好き椎熊です。
前回 Key Vault をご紹介した記事の最後に少し触れさせていただきましたが、Azure リソースのマネージド ID についてご存知でしょうか。(以前は、マネージド サービス ID(MSI)という名称でした。)
Virtual Machine(以下、VM)などのリソースにある、あの 「ID」 という機能です。
一度は目にしたことがあるのではないでしょうか。

システム割り当てマネージド ID

今回は、Azure リソースのマネージド ID と Azure Key Vault(以下、Key Vault)を組み合わせた、セキュアなパスワード管理方法についてご紹介します。

2. マネージド ID とは

マネージド ID とは、VM などのリソース割り振られた、 Azure Active Directory(以下、Azure AD)上の ID です。
マネージド ID の機能を有効化すると、リソースが所属しているテナントの Azure AD 上に ID が自動的に作成されます。

IDの自動生成

Azure AD に ID があるということは、Azure AD で認証できるということです。
Azure AD で認証できるということは、Azure AD によって保護されているリソースにアクセスするためのアクセス許可を付与(認可)できるということになります。
例えば、この VM からこの Key Vault へのアクセスを許可するといったことができます。

Key Vault へのアクセス許可

マネージド ID を使った Azure AD への認証はパスワードを必要としません。
Azure VM のインスタンスには、自身の VM からしかアクセスできない REST API のエンドポイントが存在します。
このエンドポイント経由で Azure AD へ認証します。
そのため、パスワードというものは必要ありません。
他サービスでも同じようなエンドポイントが用意されており、VM と同様にエンドポイント経由で認証します。

エンドポイント経由での認証

下記の図は Key Vault でシークレット情報を取得する際の利用イメージです。
マネージド ID が有効になっている VM 上のプログラムから API を呼び出し、認証をします。
認証後、トークンを使用して、Key Vault へアクセスします。
Key Vault のデータプレーンのアクセス制御には、アクセスポリシーを使用します。

アクセスポリシーの使用

最新の情報は以下を参照いただければと思います。

  • 「Azure リソースのマネージド ID とは」
https://docs.microsoft.com/ja-jp/azure/active-directory/managed-identities-azure-resources/overview

3. 実際に試してみた

実際にやってみようということで、先ほどご説明した 「Key Vault からシークレット情報を取得する」 を試します。
手順は以下のとおりです。

前提条件)VM が作成されていること、Key Vault が作成されていること(こちらの記事を参照ください)
3 - 1. VM のマネージド ID を有効化する
3 - 2. Key Vault のアクセスポリシーを設定する
3 - 3. VM から Key Vault へアクセスする

3 - 1. VM のマネージド ID を有効化する

[すべてのサービス] - [Virtual Machines]を選択します。

Virtual Machines

マネージド ID 有効化させたい仮想マシンを選択します。

仮想マシンの選択

[ID] を選択後、状態を [オン] にし、[保存] を選択します。

[ID] を選択後、状態を [オン] にし、[保存] を選択

[はい] を選択します。

[はい] を選択

Azure AD に作成されたか確認します。
[すべてのサービス] – [Azure Active Directory] を選択します。

[すべてのサービス] – [Azure Active Directory] を選択

[エンタープライズアプリケーション] – [すべてのアプリケーション] を選択します。
アプリケーションの種類のプルダウンを選択し、 [すべてのアプリケーション] を選択します。
先ほど作成した VM と同名のアプリケーションが存在していることが確認できます。

アプリケーションの確認

3 - 2. Key Vault のアクセスポリシーを設定する

[すべてのサービス] – [キーコンテナー] を選択します。

[すべてのサービス] – [キーコンテナー] を選択

キーコンテナーの画面より、[<任意のキーコンテナー>] – [アクセス ポリシー] – [新規追加] を選択します。

[<任意のキーコンテナー>] – [アクセス ポリシー] – [新規追加] を選択

[プリンシパルの選択] を選択します。
対象のリソースを検索し、選択します。
[選択] を選択します。

プリンシパルの選択

シークレットのアクセス許可のプルダウンを選択し、[シークレットの管理操作 – 取得] を選択します。

[シークレットの管理操作 – 取得]

選択し終えたら、[OK] を選択します。

[OK]

[保存] を選択します。

[保存]

3 - 3. VM から Key Vault へアクセスする

対象の 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/?api-version=2016-10-01 -Method GET -Headers @{Authorization="Bearer $KeyVaultToken"}).content

<your-key-vault-URL>:キーコンテナーの概要ページにある [DNS 名]を指定します。
<secret-name>:シークレットの名前を指定します。

DNS名を指定

DNS名を指定 class=

value に格納されているのがシークレット情報となります。

4. さいごに

マネージド 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 は利用料がかかりませんので、ぜひ利用してみてください。




次回予告
  • ちょっと深掘り「Enable-AzVMPSRemoting」



【総合】お問い合わせ

ソリューションに関する全般的なお問い合わせはお気軽にご相談ください。

ピックアップ

セミナー情報
クラウドエンジニアブログ
clouXion
メールマガジン登録