次の方法で共有


Azure PowerShell を使用して Azure サービス プリンシパルを作成する

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

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

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

注意

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

前提 条件

  • Azure PowerShell をローカルで使用する場合:
  • Azure Cloud Shell を使用する場合:
    • 詳細については、「Azure Cloud Shell の概要」を参照してください。

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

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

重要

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

手記

アカウントにサービス プリンシパルを作成するアクセス許可がない場合、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 から返されるオブジェクトには、Id プロパティと DisplayName プロパティが含まれています。どちらのプロパティも、サービス プリンシパルでのサインインに使用できます。 サービス プリンシパルでサインインするクライアントも、証明書の秘密キーにアクセスする必要があります。

重要

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

(Get-AzContext).Tenant.Id

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

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

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

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

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

Role-Based アクセス制御 (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: another object with the same value for property identifierUris already exists." (New-AzADServicePrincipal: property identifierUris に同じ値を持つ別のオブジェクトが既に存在します) というエラーが 表示された場合は、、同じ名前のサービス プリンシパルがまだ存在していないことを確認します。

Get-AzAdServicePrincipal -DisplayName ServicePrincipalName

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

Remove-AzAdServicePrincipal -DisplayName ServicePrincipalName

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

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

Get-AzADApplication -DisplayName ServicePrincipalName

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

Remove-AzADApplication -DisplayName ServicePrincipalName

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