🐁

サービスプリンシパルとは何か(初心者向け)

に公開

はじめに

サービスプリンシパルって何?と聞かれることが多いので、初めてサービスプリンシパルを扱う人向けに書いてみます。

サービスプリンシパルってどんなもの?

ユーザーがアプリケーションにアクセスするとき

例えば私たち人間がアプリケーションにアクセスしたいとき、以下の図のようにユーザーIDとパスワードでアクセスしますよね。

ユーザーがログインする際の大まかな流れは以下です。

  1. まず、ユーザーが自分のIDとパスワードを入力します。
  2. IDプロバイダー(例:Entra ID)がユーザーの認証を行います。認証が成功すると、ユーザーがアクセスするためのアクセストークンが発行されます。
  3. 発行されたトークンを使って、アプリケーションにアクセスします。

ではPaaSやアプリケーションが、他のリソースにアクセスしたいときはどうなるのでしょうか。

アプリケーションが他のリソースにアクセスするとき

そこで登場するのがサービスプリンシパルです。
アプリケーションにも、人間と同じようにIDとパスワードを付与するイメージです。サービスプリンシパルは、ユーザーの代わりに他のリソースにアクセスしてくれます。

アプリケーションがログインする際の大まかな流れは以下です。

  1. アプリケーションがIDプロバイダー(Entra ID)に対して、アプリケーションIDとシークレット(ユーザー認証のパスワードのようなもの)を使用して認証をリクエストします。
  2. IDプロバイダーがサービスプリンシパル(アプリケーション用のID)を通じて認証を行います。認証が成功すると、アプリケーションがアクセスするためのアクセストークンが発行されます。
  3. アプリケーションがサービスプリンシパルを使用して、データベースなどのリソースにアクセスします。

サービスプリンシパルはユーザーの代わりにリソースにアクセスするため、リソースへのアクセス権限を持つ必要があります。RBACの権限付与を忘れないようにしましょう。

サービスプリンシパルの種類

サービスプリンシパルには3種類あります。現在よく使われるのはそのうちアプリケーション(少し名前がややこしいので、ここから下ではアプリケーション サービスプリンシパルと記載します)とマネージドIDの2種類なので、それらの概要について記載します。
詳細については以下Microsoft Learnをご参照ください。
https://learn.microsoft.com/ja-jp/entra/identity-platform/app-objects-and-service-principals?tabs=browser#service-principal-object

アプリケーション サービスプリンシパル

アプリケーション サービスプリンシパルは、Entra IDで手動で作成するIDです。このタイプはAPIやバッチ処理など、プログラムやスクリプトからリソースにアクセスする場合などで使用されます。これにより、アプリケーションがリソースへのアクセス権限を持ち、認証を通じてサービス間の通信が可能になります。
さらに、マネージドIDと比較して、アプリケーション サービスプリンシパルはより細やかなアクセス制御が可能です。

アプリケーション サービスプリンシパルは、ユーザーの代わりに他のAzureリソースへアクセスする場面でも利用されます。この場合、アクセスを許可するユーザーを指定し、誰でも通さないようにすることが重要です。

アクセス制御は、アプリケーション内で実装することも可能ですが、サービスプリンシパル(エンタープライズアプリの設定)を使用したグループベースのアクセス制御でも実現できます。要件に応じた方法でアクセス制御を行いましょう。

https://learn.microsoft.com/ja-jp/entra/identity/enterprise-apps/assign-user-or-group-access-portal?pivots=portal

マネージドID

マネージドIDは、Azureリソースに特化したIDで、リソースそのものに割り当てられます。この機能を使うことでサービス間認証のための秘密情報(シークレットなど)の管理が不要になるメリットがあります。そのため、PaaSから他AzureリソースへのアクセスにはマネージドIDの利用が推奨されています。
マネージドIDには以下の2種類があります。

  • システム割り当てマネージドID
    Azureリソース(例えば、AppService、Functionsなど)に簡単に割り当てることができ、IDのライフサイクルはリソースと同じになります。このIDは、リソース間で共有することはできません。
  • ユーザー割り当てマネージドID
    手動で作成するマネージドIDです。単一のIDを複数のリソースで共有できますが、ライフサイクルは独立しているため、管理が必要です。

これらの特徴については、Azure資格試験でもよく出題されるので、詳しく知りたい方は以下をご参照ください。

https://learn.microsoft.com/ja-jp/entra/identity/managed-identities-azure-resources/overview#managed-identity-types

以上です😊

Discussion