Azure PowerShell で Azure サービス プリンシパルを作成する

Azure サービスを使用する自動化ツールのアクセス許可は、常に制限されている必要があります。 完全な特権を持つユーザーとしてアプリケーションをサインインさせる代わりに、Azure にはサービス プリンシパルが用意されています。

Azure サービス プリンシパルは、Azure リソースにアクセスするアプリケーション、ホステッド サービス、および自動化ツールで使用するために作成される ID です。 このアクセスはサービス プリンシパルに割り当てられているロールによって制限されるため、どのリソースに、どのレベルでアクセスできるかを制御することができます。 セキュリティ上の理由から、自動化ツールにはユーザー ID でのログインを許可するのではなく、常にサービス プリンシパルを使用することを推奨します。

この記事では、Azure PowerShell を使用して、サービス プリンシパルの作成、情報取得、およびリセットを行うための手順について説明します。

注意事項

New-AzADServicePrincipal コマンドを使用してサービス プリンシパルを作成する場合、出力には保護する必要がある資格情報が含まれます。 別の方法として、資格情報を使用する必要がないように、マネージド ID を使用することを検討してください。

前提条件

サービス プリンシパルの作成

New-AzADServicePrincipal コマンドレットを使用してサービス プリンシパルを作成します。 サービス プリンシパルを作成する際に、サービス プリンシパルが使用するサインイン認証の種類を選択します。

重要

Az PowerShell モジュール バージョン 7.x 以降、New-AzADServicePrincipal は既定で共同作成者ロールをサービス プリンシパルに割り当てなくなりました。 サービス プリンシパルに特定のロールを割り当てるには、ロールの割り当てを追加する手順に関するページを参照してください。

Note

ご利用のアカウントにサービス プリンシパルを作成するためのアクセス許可がない場合は、New-AzADServicePrincipal から "この操作を完了するのに十分な特権がありません" というエラー メッセージが返されます。 サービス プリンシパルを作成するには、Microsoft Entra 管理者に問い合わせてください。

ユーザー設定 [ユーザーはアプリケーションを登録できる][いいえ] に設定されている Microsoft Entra ID ディレクトリでは、次に示す Microsoft Entra ID 組み込みロール (アクション microsoft.directory/applications/createAsOwner または microsoft.directory/applications/create を含むもの) のいずれかのメンバーである必要があります。

Microsoft Entra ID ユーザー設定の詳細については、「アプリケーションを作成できるユーザーを制限する」を参照してください。

サービス プリンシパルで使用できる認証には、パスワードベースの認証と証明書ベースの認証の 2 種類があります。

パスワードベースの認証

重要

パスワードベースの認証サービス プリンシパルの既定ロールは共同作成者です。 このロールには、Azure アカウントの読み取りと書き込みを行うための完全なアクセス許可が付与されます。 ロールの割り当ての管理については、「サービス プリンシパル ロールを管理する」を参照してください。

パスワード ベースの認証では、他の認証パラメーターは使用せず、自動的に作成されるランダム パスワードを使用します。 パスワード ベースの認証を使用する場合は、次の方法をお勧めします。

$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName

返されるオブジェクトには、生成されたパスワードが格納された PasswordCredentials.SecretText プロパティが含まれています。 サービス プリンシパルで認証するためには、この値を必ず安全な場所に保存してください。 この値は、コンソール出力には表示されません。 パスワードを紛失した場合は、サービス プリンシパルの資格情報をリセットします。

次のコードにより、シークレットをエクスポートできます。

$sp.PasswordCredentials.SecretText

New-AzADServicePrincipal から返されるオブジェクトには Id メンバーと DisplayName メンバーが含まれ、そのどちらもサービス プリンシパルでのサインインに使用できます。

重要

サービス プリンシパルを使用してサインインするには、サービス プリンシパルを作成したテナントの ID が必要です。 サービス プリンシパルの作成時にアクティブなテナントを取得するには、サービス プリンシパルの作成直後に、次のコマンドを実行します。

(Get-AzContext).Tenant.Id

証明書ベースの認証

重要

証明書ベースの認証サービス プリンシパルを作成するときに割り当てられる既定のロールはありません。 ロールの割り当ての管理については、「サービス プリンシパル ロールを管理する」を参照してください。

証明書ベースの認証を使用するサービス プリンシパルは、CertValue パラメーターを使用して作成します。 このパラメーターは、公開証明書の Base64 でエンコードされた ASCII 文字列を受け取ります。 これは、PEM ファイル、あるいはテキスト エンコードされた CRT または CER で表されます。 公開証明書のバイナリ エンコーディングはサポートされていません。 この手順では、既に証明書を使用できるようになっていることを前提としています。

$cert = <public certificate as base64-encoded string>
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName -CertValue $cert

New-AzADServicePrincipal から返されるオブジェクトには IdDisplayName プロパティが含まれ、そのどちらもサービス プリンシパルでのサインインに使用できます。 サービス プリンシパルを使用してサインインするクライアントには、証明書の秘密キーへのアクセス権も必要です。

重要

サービス プリンシパルを使用してサインインするには、サービス プリンシパルを作成したテナントの ID が必要です。 サービス プリンシパルの作成時にアクティブなテナントを取得するには、サービス プリンシパルの作成直後に、次のコマンドを実行します。

(Get-AzContext).Tenant.Id

既存のサービス プリンシパルの取得

Get AzADServicePrincipal を使用すると、アクティブなテナントのサービス プリンシパル一覧を取得できます。 既定では、このコマンドによって、テナント内の "すべて" のサービス プリンシパルが返されます。 大規模な組織では、結果が返されるまでに長い時間がかかることがあります。 代わりに、オプションのサーバー側フィルター処理引数のいずれかを使用することをお勧めします。

  • DisplayNameBeginsWith は、指定した値に一致する "プレフィックス" を持つサービス プリンシパルを要求します。 サービス プリンシパルの表示名は、作成時に DisplayName で設定した値です。
  • DisplayName は、サービス プリンシパル名に "正確に一致するもの" を要求します。

サービス プリンシパル ロールを管理する

Azure PowerShell には、ロールの割り当てを管理するための、次のコマンドレットが用意されています。

ロールベースのアクセス制御 (RBAC) とロールの詳細については、RBAC の組み込みのロールに関するページをご覧ください。

次の例では、閲覧者ロールを追加し、共同作成者ロールを削除します。

New-AzRoleAssignment -ApplicationId <service principal application ID> -RoleDefinitionName 'Reader'
Remove-AzRoleAssignment -ObjectId <service principal object ID> -RoleDefinitionName 'Contributor'

重要

ロールの割り当てコマンドレットは、サービス プリンシパル オブジェクト ID を受け取りません。 これらは、作成時に生成され、関連付けられているアプリケーション ID を受け取ります。 サービス プリンシパルのアプリケーション ID を取得するには、Get-AzADServicePrincipal を使用します。

注意

ロールを割り当てるためのアクセス許可がアカウントにない場合は、アカウントに "'Microsoft.Authorization/roleAssignments/write' のアクションを実行するためのアクセス権限がありません" というエラー メッセージが表示されます。 ロールを管理するには、Microsoft Entra 管理者に問い合わせてください。

ロールを追加しても、以前に割り当てられたアクセス許可は制限され "ません"。 サービス プリンシパルのアクセス許可を制限するときは、共同作成者ロールを削除する必要があります。

変更を確認するには、割り当てられているロールの一覧を表示します。

Get-AzRoleAssignment -ServicePrincipalName ServicePrincipalName

サービス プリンシパルを使用したサインイン

サインインして、新しいサービス プリンシパルの資格情報とアクセス許可をテストします。 サービス プリンシパルでサインインするには、それに関連付けられている applicationId 値、およびそれが作成されたテナントが必要です。

パスワードを使用してサービス プリンシパルでサインインするには、次のコマンドを使用します。

# Use the application ID as the username, and the secret as password
$credentials = Get-Credential
Connect-AzAccount -ServicePrincipal -Credential $credentials -Tenant <tenant ID>

証明書ベースの認証では、Azure PowerShell で、証明書の拇印に基づいてローカル証明書ストアから情報を取得できる必要があります。

Connect-AzAccount -ServicePrincipal -Tenant <TenantId> -CertificateThumbprint <Thumbprint> -ApplicationId <ApplicationId>

PowerShell でアクセスできる資格情報ストアに証明書をインポートする手順については、「証明書ベースの認証」をご覧ください

資格情報をリセットする

サービス プリンシパルの資格情報を忘れた場合は、New-AzADSpCredential を使用して新しい資格情報とランダムなパスワードを追加します。 このコマンドレットでは、パスワードをリセットするときにユーザー定義の資格情報はサポートされません。

重要

新しい資格情報を割り当てる前に、既存の資格情報を使用したサインインを防ぐために、既存の資格情報を削除する必要があります。 これを行うには、Remove-AzADSpCredential コマンドレットを使用します。

Remove-AzADSpCredential -DisplayName ServicePrincipalName
$newCredential = New-AzADSpCredential -ServicePrincipalName ServicePrincipalName

トラブルシューティング

エラー "New-AzADServicePrincipal: プロパティ identifierUris に対して同じ値を持つ別のオブジェクトが既に存在します" を受け取った場合は、同じ名前のサービス プリンシパルがまだ存在していないことを確認してください。

Get-AzAdServicePrincipal -DisplayName ServicePrincipalName

既存のサービス プリンシパルがもう不要である場合は、次の例を使用して削除できます。

Remove-AzAdServicePrincipal -DisplayName ServicePrincipalName

このエラーは、以前に Azure Active Directory アプリケーションのサービス プリンシパルを作成した場合にも発生する可能性があります。 サービス プリンシパルを削除しても、アプリケーションは引き続き利用できます。 このアプリケーションでは、同じ名前で別のサービス プリンシパルを作成することはできません。

次の例を使うと、同じ名前の Microsoft Entra アプリケーションが存在しないことを確認できます。

Get-AzADApplication -DisplayName ServicePrincipalName

同じ名前のアプリケーションが存在するが、もう必要ない場合は、次の例を使用して削除できます。

Remove-AzADApplication -DisplayName ServicePrincipalName

それ以外の場合は、作成しようとしている新しいサービス プリンシパルの代替名を選択します。