Azure API Management のサブスクリプションキーを Logic Apps で自動ローテーションしてみる

2022.08.13

いわさです。

Azure API Mangement では API ゲートウェイとして提供する際に独自で API Management 内でサブスクリプションを作成・管理することが出来ます。
そして API 利用者にサブスクリプションキーを提供することで、キーを所有しているユーザー/アプリケーションへのみアクセスを許可することが出来ます。

このサブスクリプションキーですが、プライマリとセカンダリの2つが提供されているので、キーローテーションのために利用することが出来ます。
そして、Azure 公式ドキュメント上でも定期的なキー再生成が一般的なセキュリティ対策とされています。

定期的なキーの再生成は、一般的なセキュリティ対策です。 サブスクリプション キーを必要とする Azure サービスと同様に、API Management でもキーをペアで生成します。 サービスを利用する各アプリケーションは、キー A からキー B に切り替え、最小限の中断で鍵 A を再生成できます。その逆も同様です。

Azure API Management のサブスクリプション | Microsoft Docs より

ただしこのサブスクリプションキー、Azure ポータル上から手動でキーを再生成する機能はあるのですが、自動で再生成することはマネージドなものは本日時点では提供されていないようです。
そのため、例えば 30 日ごとにキーをローテーションさせたい際などは 30 日ごとに自前で再生成を行うための API を使う自動化の仕組みを考える必要があります。

Azure Automation や Azure Functions による定期実行を行うことなどが考えられますが、今回は Logic Apps からタイマートリガーでの再生成を行ってみました。

手動での再生成

まずは、API Management に対して手動でキーを再生成する流れを確認してみます。
以下は既に API に対して「ほげ」というサブスクリプションを作成した状態です。

主キーと2次キーというものが確認出来ますね。

対象サブスクリプションのコンテキストメニューから「プライマリキーの再生成」あるいは「セカンダリキーの再生成」を選択します。
ここではプライマリキーの再生成を行ってみます。

そうすると以下のようにするにキーが更新されます。

この流れを自動化したいですね。

Logic Apps で REST API を呼び出す

実現するために Logic Apps からは以下のサブスクリプションキー再生成用の REST API を呼び出ししてみたいと思います。
プライマリキーとセカンダリキーでそれぞれ別になっているので、実際に利用する際にはどのタイミングでどちらのキーを再生成するべきか組み込みを行う必要があります。

本日は PoC 的なことをとりあえずやりたかったので Logic Apps 上での細かい分岐は考えずに一定間隔で特定サブスクリプションのプライマリキーを更新だけしたいと思います。
実際にはセカンダリキーの更新に加えて、対象 API の全サブスクリプションに対して繰り返したりと様々な考慮すべき点があるかと思います。

単純にタイマートリガーで一定間隔で HTTP リクエストを送信します。
リソースパラメータはここでは Logic Apps のパラメータで以下のように設定しましたが、実際には動的になる部分も多そうなので、この点は適宜変更が必要そうだなと思ってます。

REST API は保護されているのでこのまま実行しても失敗します。
以下の認証部分をどうにかする必要があります。

どうやら Logic Apps ではマネージド ID が利用出来るようです。
資格情報を外部で管理しなくて良くなるので便利そうです。本日はこちらを使ってみましょう。

マネージド ID で認証

フローデザイナーからポータルの Logic Apps 管理画面に戻り、「ID」メニューからマネージド ID を有効化します。

そして、API Management の対象 API にてアクセス制御を行います。
API Mangement ではいくつか組み込みのロールが用意されていますが、キーの更新だけで言うとカスタムロールを作成して最小権限のベストプラクティスに従っておいたほうが良いでしょう。

Azure API Management でロールベースのアクセス制御を使用する方法 | Microsoft Docs

マネージド ID の設定が完了したら、ワークフロー上でも以下のように認証部分の構成を行います。

実行

さて、最低限の準備が整ったので実行してみましょう。
変更前のプライマリキーは以下です。

エラーなく成功しました。
プライマリキーを再び確認してみます。

期待どおり更新されていますね。

さいごに

本日は、Azure API Management のサブスクリプションキーを Logic Apps で自動ローテーションさせるために、プライマリキー再生成の API を使ってみました。

Logic Apps から定期的にキー再生成処理を呼び出すことはとても簡単に実現出来ました。
実は最初 Azure Functions で定期処理を行うのが良いかなと思ったのですが、Azure SDK for .NET の Azure API Management クライアントライブラリがまだプレビューのようだったので Logic Apps で HTTP 呼び出しを行う方向に切り替えました。
結果として、保守性が高そうなので Logic Apps 有りだなぁと思いました。

もし、Azure SDK for .NET で試してみたい方は以下を使ってみてください。

このあたりのApiManagementSubscriptionResourceを使う流れになるかなーと思っています。