次の方法で共有


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

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

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

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

注意事項

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

[前提条件]

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

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

Important

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 種類があります。

パスワードベースの認証

Important

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

他の認証パラメーターがない場合は、パスワード ベースの認証が使用され、ランダムなパスワードが自動的に作成されます。 パスワードベースの認証が必要な場合は、この方法をお勧めします。

$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName

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

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

$sp.PasswordCredentials.SecretText

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

Important

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

(Get-AzContext).Tenant.Id

証明書ベースの認証

Important

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

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

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

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

Important

サービス プリンシパルを使用してサインインするには、サービス プリンシパルが作成されたテナント 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'

Important

ロールの割り当てコマンドレットは、サービス プリンシパル オブジェクト 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 を使用して、ランダムなパスワードで新しい資格情報を追加します。 このコマンドレットは、パスワードをリセットするときにユーザー定義の資格情報をサポートしていません。

Important

新しい資格情報を割り当てる前に、既存の資格情報を削除してサインインできないようにすることができます。 これを行うには、 Remove-AzADSpCredential コマンドレットを使用します。

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

トラブルシューティング

"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

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