[Azure] Managed IdentityとWorkload Identity Feferationで別ディレクトリにあるリソースにアクセスする
azureAzureで、ディレクトリAにあるリソース(blob storageなど)をディレクトリBにあるアプリ(app serviceなど)から参照したいということがあります
この時、認証をどうするかが課題となりますが、 オーソドックスなやり方だと、下記のようになるかなと思います
- アクセスしたいリソースのあるテナントAにアプリ登録でアプリケーションを作る
- 作ったアプリケーションをアクセスしたいリソースにロール割り当てをする
- アプリケーションでクライアントシークレットを発行する
- そのクライアントシークレットを使って、ディレクトリBにあるサーバーから、リソースのAPIを呼び出す
この場合、2点の課題が存在します
- 長期間有効なシークレットを発行することになり、シークレットが漏洩する危険がある
- シークレットの有効期限の上限が2年間であり、2年ごとにシークレットを更新する作業が発生する
managed identityとworkload identity federation
近年のAzureは長期間有効なシークレットは使用せず、 短時間の間のみ有効な一時トークンを認証サーバーに発行してもらい、 それを使ってリソースにアクセスするというのがメジャーかと思います。
これをAzureディレクトリ内のリソース同士で容易に使用できるようにするために、 managed identityという仕組みが存在します。
さらに、クラウド間(別の認証サーバー間)で同じようなことを実現するために workload identity federationというものが存在します。
このように、managed identityとworkload identity federationを使用すれば、 長期間有効なシークレットを発行せずとも、サーバー間の認証が可能になります。
本稿では、managed identityとworkload identity federationを利用して 異なるAzureディレクトリ間で、2年ごとにローテーションする必要のない、 Entra IDベースの認証の検証結果を記載します
構築例
今回、例として下図のような構成を作ります
まず、説明をわかりやすくするために、APIを呼び出す側のサーバーが所属するディレクトリをDirectory Appと呼ぶことにします。 今回は、APIを呼び出す側のサーバーとして、Azure App Serviceを使用しますが、managed identityに対応していれば他の物でも大丈夫だと思います。
次に、APIを呼び出されるリソースが所属する側のディレクトリをDirectory Resourceと呼ぶことにします。 今回はStorage Accountとしましたが、大抵のAPIを呼び出せるAzureリソースなら大丈夫だと思います。
Directory Appにはユーザー割り当てのManaged IDを作り、App Serviceにアサインします。
システム割り当てのManaged IDではダメのか?
公式ドキュメントに下記の記載があるため、ユーザー割り当てのManaged IDでないと認証が通りません。 システム割り当てのManaged IDも試しましたが、エラーになりました。
Only user-assigned managed identities can be used as a federated credential for apps. system-assigned identities aren’t supported. https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation-config-app-trust-managed-identity?tabs=microsoft-entra-admin-center#important-considerations-and-restrictions
Read more...