Key Vault

Key VaultのシークレットをマネージドIDを利用して取得してみた

以前、Key Vaultを作成しKey Vaultのシークレットを取得するサンプルプログラムについて記載したが、今回は、App ServiceとAzure Functionsそれぞれについて、システム割り当てマネージドIDを利用してKey Vaultのシークレットを取得してみたので、そのサンプルプログラムを共有する。

なお、マネージドID とは、Azureリソース自身で認証を行うことのできる、Azure ADで管理されるIDのことをいう。マネージドIDを利用すると、サービスプリンシパルの利用は不要になり、application.propertiesからサービスプリンシパルのクライアントID・テナントID・パスワードを削除することができる。

前提条件

下記記事の実装が完了していること。

Azure Key Vaultを作成しKey Vaultのシークレットを取得してみた(ソースコード編)今回も引き続き、Key Vaultを作成しKey Vaultのシークレットを取得する処理の実装について述べる。ここでは、具体的なサンプル...

やってみたこと

  1. システムマネージドID割り当て(App Service)
  2. システムマネージドID割り当て(Azure Functions)
  3. キーコンテナーのアクセスポリシーの変更
  4. サンプルプログラムの作成
  5. サンプルプログラムの実行結果

システムマネージドID割り当て(App Service)

App ServiceのシステムマネージドIDは、Azure Portal上で割り当てられる。その手順は以下の通り。

1) Azure Portalにログインし、App Service「azureAppDemoService」を開き、「ID」メニューを選択する。
マネージドID割り当て_AppService_1

2) 以下のように、システム割り当て済みのマネージドIDが割り振られていないことが確認できる。
マネージドID割り当て_AppService_2

3) 状態を「オン」にし、「保存」ボタンを押下する。
マネージドID割り当て_AppService_3

4) 以下のように確認ダイアログが表示されるため、「はい」ボタンを押下する。
マネージドID割り当て_AppService_4

5) 以下のように、システム割り当てマネージド ID(下図のオブジェクトID)が付与されることが確認できる。
マネージドID割り当て_AppService_5

システムマネージドID割り当て(Azure Functions)

Azure FunctionsのシステムマネージドIDも、Azure Portal上で割り当てられる。その手順は以下の通り。

1) Azure Portalにログインし、Azure Functions「azureFuncDemoApp」を開き、「ID」メニューを選択する。
マネージドID割り当て_AzureFunctions_1

2) 以下のように、システム割り当て済みのマネージドIDが割り振られていないことが確認できる。
マネージドID割り当て_AzureFunctions_2

3) 状態を「オン」にし、「保存」ボタンを押下する。
マネージドID割り当て_AzureFunctions_3

4) 以下のように確認ダイアログが表示されるため、「はい」ボタンを押下する。
マネージドID割り当て_AzureFunctions_4

5) 以下のように、システム割り当てマネージド ID(下図のオブジェクトID)が付与されることが確認できる。
マネージドID割り当て_AzureFunctions_5



キーコンテナーのアクセスポリシーの変更

キーコンテナから先ほど作成したサービスプリンシパルにアクセスできるようにするために、キーコンテナーのアクセスポリシーを変更する。その手順は以下の通り。

1) キーコンテナーの概要を表示し、「アクセスポリシー」メニューを選択する。
アクセスポリシーの変更_1

2)「アクセスポリシーの追加」リンクを押下する。
アクセスポリシーの変更_2

3) アクセスポリシーの追加画面が表示されるため、プリンシパルの選択の「選択されていません」リンクを押下する。
アクセスポリシーの変更_3

4) App Service「azureAppDemoService」を選択し、「選択」ボタンを押下する。
アクセスポリシーの変更_4

5)「シークレットのアクセス許可」で、「取得」「一覧」を選択する。
アクセスポリシーの変更_5

6) 下記内容が指定されていることを確認し、「追加」ボタンを押下する。
アクセスポリシーの変更_6

7) 以下のように、アクセスポリシーの一覧にApp Service「azureAppDemoService」が表示されることが確認できる。
アクセスポリシーの変更_7

8) 同様に、Azure Functions「azureFuncDemoApp」のアクセスポリシーも追加する。
アクセスポリシーの変更_8

9) サービスプリンシパルのアクセスポリシーを削除するため、一覧の「削除」ボタンを押下する。
アクセスポリシーの変更_9

10) 下記状態になったことを確認し、「保存」ボタンを押下する。
アクセスポリシーの変更_10

11) アクセスポリシー削除の確認メッセージが表示されるため、「OK」ボタンを押下する。
アクセスポリシーの変更_11

12) 保存すると、以下のように、保存ボタンが非活性になる。
アクセスポリシーの変更_12



サンプルプログラムの作成

作成したサンプルプログラム(App Service側)の構成は以下の通り。
サンプルプログラムの構成(AppService)
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。

application.propertiesの内容は以下の通りで、サービスプリンシパルのクライアントID・テナントID・パスワードを削除している。

また、コントローラクラスの内容は以下の通りで、AppServiceMSICredentialsクラスを利用し認証情報を指定しないように変更している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/azure/tree/master/azure-key-vault-3/demoAzureApp

さらに、作成したサンプルプログラム(Azure Functions側)の構成は以下の通り。
サンプルプログラムの構成(AzureFunctions)
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。

<2021年4月13日 追記>
spring-cloud-function-dependenciesのバージョンは、2021年3月16日にリリースしたバージョン3.1.2を利用すると、1つのAzure Functions内に複数のファンクションを含む場合の不具合が解消できている。


その場合、Handlerクラスの継承するクラスを「AzureSpringBootRequestHandler」クラスから「FunctionInvoker」クラスに変更する。


spring-cloud-function-dependenciesの3.1.2を利用した実装サンプルは、以下の記事を参照のこと。

spring-cloud-function-dependenciesのバージョンを最新(3.1.2)にしてみたこれまでこのブログで取り上げてきたAzure Functionsのサンプルプログラムでは、spring-cloud-function-d...

application.propertiesの内容は以下の通りで、App Service側と同様に、サービスプリンシパルのクライアントID・テナントID・パスワードを削除している。

また、サービスクラスの内容は以下の通りで、App Service側と同様に、AppServiceMSICredentialsクラスを利用し認証情報を指定しないように変更している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/azure/tree/master/azure-key-vault-3/demoAzureFunc



サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1)「mvn azure-functions:deploy」コマンドによって、Azure Functions上にサンプルプログラムをデプロイする。
サンプルプログラムの実行結果_1

なお、Azure Functionsにデプロイする過程は、以下の記事の「Azure FunctionsへのSpring Bootを利用したJavaアプリケーションのデプロイ」を参照のこと。

Azure Functions上でSpring Bootを利用したJavaアプリケーションを作成してみた前回は、Azure Potal上でAzure Functionsを作成してみたが、今回は、前回作成したAzure FunctionsにS...

2)「mvn azure-webapp:deploy」コマンドによって、Azure App Service上にサンプルプログラムをデプロイする。
サンプルプログラムの実行結果_2

なお、Azure App Serviceにデプロイする過程は、以下の記事の「App ServiceへのSpring Bootを利用したJavaアプリケーションのデプロイ」を参照のこと。

Azure App Service上でSpring Bootを利用したJavaアプリケーションを作成してみた前回は、Azure Potal上でApp Serviceを作成してみたが、今回は、前回作成したApp ServiceにSpring Bo...

3) Azure App ServiceのURL「https://azureappdemoservice.azurewebsites.net/」とアクセスした場合の実行結果は、以下の通りで、シークレットの値が表示される。ただし、ローカル環境では実行できない。
サンプルプログラムの実行結果_3_1

なお、上記URLは、下記Azure App ServiceのURLから確認できる。
サンプルプログラムの実行結果_3_2

要点まとめ

  • Key Vaultのシークレットを取得する際にマネージドIDを利用すると、サービスプリンシパルの利用は不要になり、application.propertiesからサービスプリンシパルのクライアントID・テナントID・パスワードを削除することができる。