サービスプリンシパルとは何か(初心者向け)
はじめに
サービスプリンシパルって何?と聞かれることが多いので、初めてサービスプリンシパルを扱う人向けに書いてみます。
サービスプリンシパルってどんなもの?
ユーザーがアプリケーションにアクセスするとき
例えば私たち人間がアプリケーションにアクセスしたいとき、以下の図のようにユーザーIDとパスワードでアクセスしますよね。
ユーザーがログインする際の大まかな流れは以下です。
- まず、ユーザーが自分のIDとパスワードを入力します。
- IDプロバイダー(例:Entra ID)がユーザーの認証を行います。認証が成功すると、ユーザーがアクセスするためのアクセストークンが発行されます。
- 発行されたトークンを使って、アプリケーションにアクセスします。
ではPaaSやアプリケーションが、他のリソースにアクセスしたいときはどうなるのでしょうか。
アプリケーションが他のリソースにアクセスするとき
そこで登場するのがサービスプリンシパルです。
アプリケーションにも、人間と同じようにIDとパスワードを付与するイメージです。サービスプリンシパルは、ユーザーの代わりに他のリソースにアクセスしてくれます。
アプリケーションがログインする際の大まかな流れは以下です。
- アプリケーションがIDプロバイダー(Entra ID)に対して、アプリケーションIDとシークレット(ユーザー認証のパスワードのようなもの)を使用して認証をリクエストします。
- IDプロバイダーがサービスプリンシパル(アプリケーション用のID)を通じて認証を行います。認証が成功すると、アプリケーションがアクセスするためのアクセストークンが発行されます。
- アプリケーションがサービスプリンシパルを使用して、データベースなどのリソースにアクセスします。
サービスプリンシパルはユーザーの代わりにリソースにアクセスするため、リソースへのアクセス権限を持つ必要があります。RBACの権限付与を忘れないようにしましょう。
サービスプリンシパルの種類
サービスプリンシパルには3種類あります。現在よく使われるのはそのうちアプリケーション(少し名前がややこしいので、ここから下ではアプリケーション サービスプリンシパルと記載します)とマネージドIDの2種類なので、それらの概要について記載します。
詳細については以下Microsoft Learnをご参照ください。
アプリケーション サービスプリンシパル
アプリケーション サービスプリンシパルは、Entra IDで手動で作成するIDです。このタイプはAPIやバッチ処理など、プログラムやスクリプトからリソースにアクセスする場合などで使用されます。これにより、アプリケーションがリソースへのアクセス権限を持ち、認証を通じてサービス間の通信が可能になります。
さらに、マネージドIDと比較して、アプリケーション サービスプリンシパルはより細やかなアクセス制御が可能です。
アプリケーション サービスプリンシパルは、ユーザーの代わりに他のAzureリソースへアクセスする場面でも利用されます。この場合、アクセスを許可するユーザーを指定し、誰でも通さないようにすることが重要です。
アクセス制御は、アプリケーション内で実装することも可能ですが、サービスプリンシパル(エンタープライズアプリの設定)を使用したグループベースのアクセス制御でも実現できます。要件に応じた方法でアクセス制御を行いましょう。
マネージドID
マネージドIDは、Azureリソースに特化したIDで、リソースそのものに割り当てられます。この機能を使うことでサービス間認証のための秘密情報(シークレットなど)の管理が不要になるメリットがあります。そのため、PaaSから他AzureリソースへのアクセスにはマネージドIDの利用が推奨されています。
マネージドIDには以下の2種類があります。
- システム割り当てマネージドID
Azureリソース(例えば、AppService、Functionsなど)に簡単に割り当てることができ、IDのライフサイクルはリソースと同じになります。このIDは、リソース間で共有することはできません。 - ユーザー割り当てマネージドID
手動で作成するマネージドIDです。単一のIDを複数のリソースで共有できますが、ライフサイクルは独立しているため、管理が必要です。
これらの特徴については、Azure資格試験でもよく出題されるので、詳しく知りたい方は以下をご参照ください。
以上です😊
Discussion