Microsoft Entra PIMとサービス プリンシパルは連携できるのか?現状の制約と安全な代替パターン

Microsoft Entra の PIM(Privileged Identity Management)を触っていると、「サービス プリンシパルにも JIT で権限を付けられないか?」という疑問が必ず出てきます。本記事では、現時点の仕様で何ができて何ができないのか、そして代わりにどのようなアーキテクチャを取るべきかを、実運用に落とし込めるレベルで整理します。

目次

サービス プリンシパルに PIM は使えるのか?結論から整理

まず結論です。

  • サービス プリンシパル(アプリケーション ID)やマネージド IDに対して、PIM の「適格(Eligible)割り当て」を直接付けることはできません。
  • そのため、「必要なときだけサービス プリンシパルのロールを昇格させる JIT 運用」は現状の PIM では実現できません。

Microsoft の公式 Q&A でも、「PIM はサービス プリンシパルに対して PIM-eligible ロールを直接割り当てることはサポートしていない」と明言されています。

また、Azure RBAC と PIM の統合に関する解説では、Azure リソース ロールの PIM 対象はユーザー(および人がメンバーのグループ)であり、アプリケーション / サービス プリンシパル / マネージド ID は Eligible ロールの対象外であることが説明されています。

ここで混乱しやすいポイントをまとめると次のとおりです。

対象PIM の Eligible/JIT 対象?備考
ユーザー アカウント〇MFA・承認・理由入力などの JIT ワークフローが利用可能
PIM 対象グループ(ロール割り当て可能グループ)〇(グループ メンバーシップに対して)人がグループに JIT 参加することで間接的にロールを得る
サービス プリンシパル(アプリ登録)×Eligible ロール割り当てや JIT 昇格は不可。Active な恒久ロールのみ
マネージド ID(システム/ユーザー割り当て)×同じく PIM の JIT 対象外。RBAC の恒久ロールのみ
Agent ID(エージェント ID)一部のシナリオで可Entra Agent Platform 向けの新しい概念で、一般的なサービス プリンシパルとは別枠

PIM が設計上ターゲットにしているのは「人の特権」

PIM は、もともと 「人間の管理者に対して、時間制限付き・承認ベースで特権ロールを付ける」ためのサービスとして設計されています。Microsoft 公式ドキュメントでも、PIM は Microsoft Entra や Azure、Microsoft 365 などの重要なリソースに対して、時間ベース・承認ベースのロールアクティベーションを提供し、過剰な特権を抑制する目的であると説明されています。

そのため、PIM が前提としているのは次のようなフローです。

  1. 人がサインインする
  2. MFA や承認フローを通過する
  3. 一定時間だけロールをアクティブにする
  4. 有効期限切れ or 人が明示的にロールを解除する

一方、サービス プリンシパルやマネージド ID は「サインインしない / MFA できない / 承認画面に答えられない」タイプの ID です。この「インタラクティブ操作ができない」という根本的な性質により、PIM の JIT ワークフローに乗せることがそもそもできない、というのが仕様上の理由になります。

PIM で割り当てられるロールとプリンシパルの関係

Microsoft Entra ロールや Azure リソース ロールは、通常、ユーザー・グループ・一部のエージェント ID(agent identities)に割り当てることができます。PIM を有効にすると、これらのロール割り当てに対して、「Active(恒久)」「Eligible(適格)」といった属性を付与し、JIT でアクティブ化できるようになります。

しかし、Azure RBAC 側の PIM 統合の記事や Q&A に繰り返し記載されているように、Eligible ロールを作成できるのは「ユーザー(およびグループ)」のみであり、サービス プリンシパルやマネージド ID は対象外です。

つまり:

  • PIM = 「人間(+その人が入るグループ)」の特権コントロール
  • サービス プリンシパル・マネージド ID = ワークロード ID(アプリ向け ID) であり、PIM の JIT 対象ではない

という役割分担を理解しておく必要があります。

「PIM for Groups を経由すればアプリも JIT できるのでは?」という誤解

よくある誤解の 1 つが、PIM for Groups を使えば、グループ メンバーとしてのサービス プリンシパルも JIT で権限を得られるのでは?という考え方です。

しかし、PIM for Groups の JIT 対象はあくまで 「人がそのグループに一時的に参加する」 というメンバーシップ操作であり、サービス プリンシパルが「今から 1 時間だけこのグループに入りたい」と自分でリクエストする仕組みは存在しません。

  • サービス プリンシパルをグループ メンバーにしておけば、グループに割り当てたロールを恒久的に持つことはできます。
  • ただし、そのメンバーシップを JIT でオン・オフする API や UI は提供されていません。

したがって、PIM for Groups を経由してもサービス プリンシパルの JIT 昇格は実現できない、という整理になります。

現実的な代替パターン:4 つのアプローチ

「PIM でサービス プリンシパルを JIT できないなら、どう守ればよいのか?」という問いに対する、現実的なパターンを 4 つに分けて整理します。

1. 人に PIM を適用し、サービス プリンシパルのロール付与/剥奪を人がトリガーする

もっとも素直なパターンは、「権限操作をする人」だけを PIM で JIT 化し、その人が必要に応じてサービス プリンシパルへのロール割り当てをオン・オフするやり方です。

運用フロー例

  1. 管理者 A は、PIM で「Privileged Role Administrator」や「User Access Administrator」などに Eligible として登録されている。
  2. 作業の直前に、管理者 A が PIM でロールを Activate(MFA や承認付き)。
  3. 有効な権限を使って、サービス プリンシパルに対して最小スコープのロール(例:特定リソース グループの Contributor)を付与する。
  4. 作業が終わり次第、管理者 A(もしくは自動化スクリプト)がサービス プリンシパルからロールを削除する。
  5. PIM の有効時間が切れたら、管理者 A も特権を失う。

このとき、「手作業だと漏れそう」という懸念が出るため、スクリプトや IaC(Bicep/ARM/Terraform)でロール付与~削除までを一括実行するのがおすすめです。

# 例: Azure CLI によるロール付与・削除(擬似コード)
# 事前に PIM で昇格済みの人間アカウントでログインしている前提

# 一時的にロールを付与
az role assignment create \
  --assignee <SERVICE_PRINCIPAL_ID> \
  --role "Contributor" \
  --scope "/subscriptions/<SUB_ID>/resourceGroups/<RG_NAME>"

# (ここで自動化ジョブを実行)

# 作業完了後すぐにロールを剥奪
az role assignment delete \
  --assignee <SERVICE_PRINCIPAL_ID> \
  --role "Contributor" \
  --scope "/subscriptions/<SUB_ID>/resourceGroups/<RG_NAME>"

このようなスクリプトを、「PIM で昇格した人だけが実行できるパイプライン」に載せると、人的ミスもかなり軽減できます。

観点メリットデメリット / 注意点
セキュリティ人の特権は JIT。サービス プリンシパルのロールも作業時間中だけ有効にできるスクリプトの運用をちゃんと標準化しないと「消し忘れ」が発生しうる
実装難易度単純。既存のロール割り当てスクリプトを流用可能PIM 昇格 → スクリプト実行という二段階のオペレーションが必要
可監査性PIM のアクティビティ ログ + ロール割り当ての監査ログでトレーサビリティが高いロール付与・削除の自動化パイプラインにもログ保存を仕込むとベター

2. Azure 上のワークロードなら「マネージド ID」を最優先で使う

Azure VM / App Service / Functions / AKS など、Azure 上で動くワークロードであれば、サービス プリンシパルではなくマネージド ID を使うのが、Microsoft 公式でも推奨されているベストプラクティスです。

  • マネージド ID は Azure リソースに紐づく ID で、資格情報(シークレットや証明書)の発行・ローテーションを Azure 側が完全に管理します。
  • コードや設定にクライアント シークレットを書き込む必要がなく、漏えいリスクを大幅に低減できます。

もちろん、マネージド ID 自体に対しても PIM JIT はできませんが、そもそもシークレット管理リスクをほぼゼロにできるため、「長期シークレットを持つサービス プリンシパルに PIM をかけたい」という動機の大部分を解消できます。

項目サービス プリンシパルマネージド ID
資格情報の管理シークレット/証明書を自分で発行・保管・ローテーションする必要Azure が自動管理。アプリ側はトークン取得 API を呼ぶだけ
漏えいリスクコード/設定ファイル/Git リポジトリ等に埋め込みがち資格情報を持たないため、漏えい面積が小さい
スコープ設計任意のリソースに対してロール割り当て可能基本的にはマネージド ID を持つリソースからのアクセス用途で利用
PIM との関係PIM Eligible は不可。人に PIM をかけてロール割り当てを管理する同上。ただしシークレット管理が不要な分、運用がシンプル

マネージド ID を使う場合も、どのリソースにどのロールを付けるかは人間が決める必要があります。ここに PIM を組み合わせて、

  • 「マネージド ID に新しいロールを付けられるのは、PIM で昇格した管理者だけ」
  • 「そのロールは定期的にアクセス レビューの対象にする」

といったガバナンスを効かせると、よりセキュアな運用になります。

3. ワークロード ID フェデレーション(OIDC)で CI/CD を「シークレットレス」化

GitHub Actions や Azure DevOps、その他の CI/CD プラットフォームから Azure にデプロイする場合は、ワークロード ID フェデレーション(OIDC)を使うことで「GitHub にシークレットを置かない運用」が可能です。

概要は次のとおりです。

  1. Microsoft Entra ID で、ユーザー割り当てマネージド IDもしくはアプリ登録を作成する。
  2. その ID に対して、外部 IdP(例:GitHub OIDC)との「フェデレーテッド資格情報」を設定する。
  3. GitHub Actions のワークフローで azure/login などのアクションを用い、OIDC トークンを使って Entra ID からアクセストークンを取得する。
  4. 取得したトークンを用いて、Azure リソースへデプロイを実行する。

この方式では、CI/CD 側にクライアント シークレットを保存する必要がなく、フェデレーテッド資格情報に記載した条件(対象リポジトリ・ブランチ・環境など)を満たすトークンだけを信頼するため、「どのリポジトリからでも同じクレデンシャルが使える」といったリスクを避けられます。

ここでも PIM は直接ワークロード ID を JIT にはできませんが、

  • ワークロード ID(アプリ / マネージド ID)にどの RBAC ロールを付けるかを決める管理者に PIM を適用
  • フェデレーテッド資格情報の設定変更権限を PIM 管理下に置く

といった形で、「ワークロード ID を管理する人」を PIM で守るのが現実的なパターンです。

4. どうしても恒久権限が必要なサービス プリンシパルのベストプラクティス

レガシーなアプリケーションや、どうしても Azure 外のシステムから接続しなければならないなど、サービス プリンシパルに恒久的な権限を持たせざるを得ないケースもあります。その場合は、以下のようなベストプラクティスを徹底することで、リスクを一定レベルまで抑え込むことができます。

① 最小権限・最小スコープ

  • サブスクリプション全体に Owner を付けるのではなく、可能な限りリソース グループや個別リソース単位で必要最小のロール(例:Storage Blob Data Contributor)を付与。
  • 「読み取り専用」と「書き込み」のロールを分離し、アプリが本当に必要な方だけを付ける。

② 短命な資格情報 + Key Vault での保護

  • クライアント シークレットではなく、短期間有効な証明書ベース認証を優先する。
  • 証明書の秘密鍵は Azure Key Vault などに格納し、アプリからは Key Vault 経由で参照(この際の認証はマネージド ID などを利用)。
  • 証明書の有効期限は 1 年以上に伸ばさず、自動ローテーションの仕組みを用意する。

③ Workload ID ライセンスと条件付きアクセスの活用

Microsoft Entra には、「Microsoft Entra Workload ID」ライセンスが追加されており、アプリケーション ID やサービス プリンシパルに対する高度な保護・監査機能を提供します。

  • ワークロード ID 単位でライセンスを割り当て、異常なサインインやリスク検知を行う。
  • 条件付きアクセスをワークロード ID にも適用し、許可された場所・ネットワークからのアクセスだけを認めるといった制御を行う。

④ 監査ログとアクセス レビュー

  • サービス プリンシパルのロール割り当て変更は必ず監査ログを確認し、誰が・いつ・どの権限を付けたかが追跡できるようにする。
  • Privileged Identity Management や Entra ID Governance のアクセス レビュー機能を使って、サービス プリンシパルに付いているロールが本当に必要かを定期的に棚卸しする。
対策目的ポイント
最小スコープの RBAC 設計侵害時の被害範囲を狭める「サブスクリプション全体の Owner」は最後の最後の手段
短命な証明書 + Key Vault資格情報の漏えいリスクを低減自動ローテーションと失効テストを忘れない
Workload ID ライセンス + CAワークロード ID 自体の保護高リスク検知やサインイン制限を有効化
アクセス レビュー不要な権限の除去レビュー対象にサービス プリンシパルも含める

具体的な設計例でイメージする

例1:GitHub Actions から Terraform で Azure を操作する

よくあるケースとして、「GitHub Actions から Terraform を使って Azure の構成管理を行う」パターンを考えてみます。

悪い例(やりがちなパターン)

  • Entra ID にアプリ登録を作成し、サービス プリンシパルにサブスクリプション全体の Owner を付与。
  • クライアント シークレットを発行し、GitHub のシークレットに保存。
  • 全ての Terraform 実行でこのクレデンシャルを使い回す。

この場合、シークレットが漏えいすれば サブスクリプション全体を破壊できる万能鍵 を外部にばらまいているのと同じです。

推奨パターン

  1. Terraform 用のユーザー割り当てマネージド ID もしくはアプリ登録を作成。
  2. その ID に対して、ワークロード ID フェデレーション(GitHub OIDC)を設定。
  3. ロールは、対象のリソース グループ単位に Contributor など必要最小限を付与。
  4. ロールの付与・変更を行う管理者は PIM で JIT 昇格させる。

こうすることで、

  • GitHub には一切シークレットを保存しなくてよい
  • 使える権限は特定のリポジトリ/ブランチのみに限定
  • ロール設計を変更できるのは PIM によって守られた管理者のみ

という構成になり、「サービス プリンシパルに PIM をかけたい」と考えなくても、十分にリスクを抑えた運用が実現できます。

例2:運用担当者が一時的に自動化バッチ用サービス プリンシパルの権限を引き上げる

もう少しレガシーな例として、オンプレ サーバー上のバッチから Azure に対してメンテナンス操作を行う、というシナリオを考えます。

  1. 平常時、サービス プリンシパルには 読み取り専用のロールのみが付与されている。
  2. メンテナンス日だけ、運用担当者が PIM で昇格し、特定 RG に対して Contributor を一時的に付与。
  3. メンテナンス バッチを実行し、完了後にロールを削除。
  4. この一連の操作を PowerShell / CLI スクリプト化し、PIM 昇格した担当者のみが実行できるようにする。

ここでも PIM はあくまで 「人間の権限」に対して働きますが、人をハブにしてサービス プリンシパルの権限をオン・オフすることで、実質的に「JIT っぽい運用」を実現できます。

将来的な仕様変更の可能性について

Entra の世界では、近年 Workload ID や Agent ID など、ワークロード向けの ID 管理・保護機能が急速に拡充しています。

今後、サービス プリンシパルやマネージド ID 自体に対して、よりきめ細かい JIT や承認フローが提供される可能性はゼロではありませんが、2025 年 12 月時点の公式ドキュメントと Q&A では、「サービス プリンシパルに PIM の Eligible ロールを直接割り当てることはできない」と明確に示され続けています。

そのため、今設計するシステムでは、

  • PIM は「人」に対する JITのために使う
  • ワークロード ID には、マネージド ID・ワークロード ID フェデレーション・最小権限・短命資格情報・監査とレビューの組み合わせで防御を張る

という前提でアーキテクチャを考えておくのが現実的です。

まとめ:サービス プリンシパルに PIM は使えないが、守る方法はある

最後に、本記事のポイントを整理します。

  • サービス プリンシパルやマネージド ID には、PIM の「Eligible」割り当てや JIT 昇格は現状サポートされていない。
  • PIM はあくまで 「人の特権ロール」を時間制限・承認・MFA 付きで管理するためのサービスである。
  • 代わりにとるべきアプローチは次の 4 つ:
    • 人に PIM をかけ、サービス プリンシパルへのロール付与・剥奪を人(+自動化)で制御する。
    • Azure 上のワークロードにはマネージド ID を優先し、そもそもシークレットを持たない構成にする。
    • ワークロード ID フェデレーション(OIDC)で CI/CD をシークレットレスにし、信頼できるリポジトリ・ブランチからだけアクセスさせる。
    • どうしても恒久権限が必要なサービス プリンシパルには、最小権限・短命な証明書・Key Vault 保管・Workload ID ライセンス・アクセス レビューを組み合わせる。
  • 「アプリに直接 PIM をかける」のではなく、「アプリを管理する人とプロセス」を PIM で固めるのが、現行仕様におけるベストプラクティス。

サービス プリンシパルに PIM をそのまま適用できないことは制約に見えますが、その分、人・プロセス・ワークロード ID の三つ巴で防御線を重ねる設計が求められているとも言えます。この記事をベースに、自社の運用に合った組み合わせを検討してみてください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次