NEXTSCAPE blog

株式会社ネクストスケープの社員による会社公式ブログです。ネスケラボでは、社員が日頃どのようなことに興味をもっているのか、仕事を通してどのような面白いことに取り組んでいるのかなど、会社や技術に関する情報をマイペースに紹介しています。

MENU

サービスプリンシパル(Service Principal)が作れない!

こんにちは、上坂(@takashiuesaka)です。

先日、Azureでサービスプリンシパルが作れないんだけど!という問い合わせをいただきました。
原因はわかってしまえば簡単だったのですが意外と知られていない気がするので公開します。
原因追及を頑張ってくれた弊社AzureチームのKさんありがとう!

さて、そもそもサービスプリンシパルとはなんでしょうか。別名実行アカウントです。
どちらかというと実行アカウントの方がまだわかりやすいと思います。
要するに、アカウントのことですから。
このサービスプリンシパル、RBAC(Role-based Access Control)の全面導入に伴った重要な存在となっています。
わかりやすい説明を探したのですが見当たりませんでした。私なりに説明すると、登場人物は3つです。

 

  1. AzureADに登録されたアプリ
  2. サービスプリンシパル
  3. ロール

3つの関係性はこんな感じです。

f:id:nextscape_blog:20210910145622p:plain

アプリを実行するためのアカウントがサービスプリンシパルで、そのサービスプリンシパルに、読み取りだけ、とか起動・停止などのロールを割り当てる感じです。
アプリとサービスプリンシパルは1:1ではありません。
サービスプリンシパルはアプリに対していくつでも作れます。割り当てたいロールごとにサービスプリンシパルを作れるわけです。
まぁ当たり前ですよね。

さて、サービスプリンシパルはどういった時に必要となるかなんですが、Azureサブスクリプション内部のリソースにアクセスする場合です。
例えば、VMを停止したいとか。こういった場合はVMを停止する命令を出すアプリケーションがVMの起動・停止するための権限を持つ必要があります。
ARM版のAutomationではサービスプリンシパルを用いたRBACが必須となっています。

・・・というわけで、ARM版のAutomationでアカウントを作ろうとすると、こんな画面に出くわすことがあります。

 

f:id:nextscape_blog:20210910145648p:plain

 

これは一体なんでしょうか。

「Azure Active Directory に Azure実行アカウント(サービスプリンシパル)を作成するためのアクセス許可がありません。」

と書かれています。リンク先に飛ぶと、次のように原因らしきもの書かれています。

「[作成] ボタンのクリック後にアクセスが拒否されたことを示すエラー メッセージが表示された場合、使用しているアカウントが、サブスクリプション管理ロールに属していないことが原因です。」

サブスクリプション管理ロールってなんですかね?あちこちに聞いて確認したところ、どうもこれはAzureのアカウント管理者のことのようです。サブスクリプションのサービス管理者のさらに上の権限です。
そんなに上に権限がないとサービスプリンシパルを作成できないって困りますよ。変じゃないですか?

というわけで原因と解決方法です。
原因は、MSアカウントでAutomationアカウントを作成しようとしたから、です。
・・・という回答だと正確な原因ではありません。正確に言うと、ユーザータイプがGuestのアカウントでAutomationアカウントを作成しようとしたから、です。

サービスプリンシパルを作る処理はAzureADのディレクトリにアクセスできる権限が必要です。ユーザーを作るわけですから。この権限はユーザータイプがGuestのアカウントにはデフォルトで付与されていないのです。
Azureを扱う正式なユーザーは組織ユーザーです。組織ユーザーであれば問題なくディレクトリにアクセスできますが、MSアカウントはAzureADのディレクトリにとってはあくまでゲスト扱いのため、ディレクトリへのアクセス権限がないのです。
(ちなみにAzureADB2Bで投入したユーザーもGuestになります)

これを回避する策ですが、一番簡単なのはGuestユーザーにもディレクトリへのアクセス権限を与えてしまうことです。
既定のディレクトリの管理者権限でログインします。(AzureEAの場合でディレクトリを変更していなければアカウント管理者ログイン)
AzureADの既定のディレクトリを開き、上のメニューの「構成」をクリックします。

f:id:nextscape_blog:20210910145719p:plain

「ユーザーアクセス」までスクロールし、「ゲスト ユーザーによるアクセスを制限する」をいいえにして保存します。

f:id:nextscape_blog:20210910145739p:plain

 

15分ほど待ってから、再度Automationアカウントの作成を試みてください。MSアカウントであってもサービスプリンシパルを作成することができます。
ちなみに15分待つ理由ですが、どうもAzureADへの変更は時間がかかるようなんです。だからAzureADに対してなんらかの変更を行った後は少し時間を開けてから試しましょう。隠れTipsです。

全Guestユーザーに対してディレクトリのアクセス許可を出すのはいやだ!という方はPowerShellでユーザータイプを変更です。
やり方はこちらです。

解説はないのか!という声が聞こえるような・・・。すいません、力尽きました~