サービスプリンシパルって何?Azureの認証エンティティについて
はじめに
Azureの利用方法を調べていると、唐突に「サービスプリンシパルで認証を行ってください」などの記述にぶつかり「さーびす...ぷりんしぱる...って何?」となることはありませんでしょうか?
そしてAzureのポータルを探し回ってもどこにもサービスプリンシパルを作成できなさそうなメニューが見当たらず、ドキュメントを読んでも結局何をどうすればサービスプリンシパルができたことになるのかよく分からず困ったりしていませんでしょうか。
この記事では
- サービスプリンシパルとは何か
- Azureの認証におけるサービスプリンシパルの位置づけ
- サービスプリンシパルなどの作成方法
などを簡潔にまとめ、「サービスプリンシパル」やAzureの認証で困っている人の助けになればと思っています。
サービスプリンシパルとは何か
- サービスプリンシパルとは: 「Azureでシステムが認証に使うためのID」です。一般のユーザーと同じようにAzureのロール(サブスクリプションの所有権とかVMの閲覧権とか)を持つことができ、サービスプリンシパルとして認証することでAzureのリソースの管理を行うことできます。(ポータルにはログインできません)
ただ、システムの認証を行う手段についてはサービスプリンシパル以外にもマネージドIDがあります。
以下の表でどちらが必要かをご判断ください。
Azureの認証におけるサービスプリンシパルの位置づけ
認証主体 | 想定される利用方法 | ポータルへのログイン可否 | 作成方法 |
---|---|---|---|
ユーザー | Azureを操作する人間 | 可能 | AzureAD(Entra ID)※1でユーザーとして追加 |
マネージドID | Azureサービス | 不可能 | Azureリソースの詳細画面 > 設定 > IDから有効化 |
サービスプリンシパル | Azureと連携するシステム | 不可能 | AzureAD(Entra ID)の「アプリの登録」から登録 |
おおむね以下のような考えに則って利用する認証主体を選択すればよいかと思います。
マネージドIDはAzureによってよしなに(※2)管理される認証主体です。Azureを操作させたい対象がAzure上のサービス(例えば、VMにデータベースアクセスさせたい、AppServiceからBlobストレージに書き込みたいなど)である場合にはサービスプリンシパルではなくマネージドIDを使うのがおすすめです。
逆に、Azure外部のシステム(例えばオンプレミスやローカル、他クラウド上で動くWebサーバー)に権限を与えたい場合にはサービスプリンシパルをご利用ください。
※正確に言うとマネージドIDもサービスプリンシパルの一種なのですが、ここでは簡単のため割愛します
各認証主体の作成方法
ユーザーの作成
Azure AD (EntraID)で「管理」 > 「ユーザー」 > 「新しいユーザー」から追加します。
マネージドIDの作成
権限を付与したいAzureサービスのリソース詳細の設定 > IDから追加します。
大抵の場合、「システム割り当て済み」(※3)をオン>保存でよいかと思われます。
サービスプリンシパルの作成
AzureADの管理 > 「アプリの登録」>新規登録から追加 します。
大変に分かりづらいポイントなのですが「サービスプリンシパル」≒「AzureADに登録されたアプリ」です(正確にはアプリに対応する形でサービスプリンシパルが払い出されるのですが操作としては一体化しています)。アプリ新規登録ではURL等の入力を求められますが、URLを持たないサービスであれば指定せず単に登録だけで問題ありません。URLはOAuth等のユーザー認証を行う場合にのみ必要になります
その後、使う用途に合わせて「証明書とシークレット」からクライアントシークレットや証明書を作成します。Azure CLIの場合にはシークレット、Azure SDKの場合には証明書が必要になります。
ロールの付与方法
3主体ともほぼ同じ手順となります。
これからアクセスしたい対象リソースの「アクセス制御(IAM)」から追加 > ロール割り当ての追加から追加します。
- 付与したいロール > 2. 付与したいメンバーの順に指定してロールを付与します。
付与したいロールでは「ひとまず大きめの権限を与えてアクセスできるかだけ確認したい」場合には特権管理者ロールタブから共同作成者を選択してください。(のちに適宜必要最小限のロールへの変更を推奨します)
付与したいメンバーの選択では
ユーザー・サービスプリンシパル・マネージドIDの選択をラジオボタン行った後に
メンバーの選択を行ってください。
認証方法
様々な認証方法がありますが、例えばAzure CLIでの認証(ログイン)方法は以下となります。
ユーザーによるCLIログイン
マネージドIDによるCLIログイン
サービスプリンシパルによるCLIログイン
ただし、マネージドIDについては対象リソース内でコマンドを打てば(ロールが適切に付与されていれば)明示的にログインしなくてもCLIが動作するはずです(リソースの外側で勝手にリクエストに認証子が付与されます)
最後に
分からなかったことがあればコメント欄にどんどんご記載ください
※1: Azure ADは2023/4にEntra IDに改称されました。しかし、現時点では多くのドキュメントでAzure ADに呼称が残っているため併記しました。同じものとお考え下さい。
※2: 「よしなに」具体的には鍵のローテーション更新をAzureが自動的にやってくれるなどが挙げられます。また、Azureリソースが別のAzureリソースにアクセスする際の認証プロセス自体もユーザーから見えないところで透過的に行ってくれます
Discussion