Azure サービスを使用する自動化ツールのアクセス許可は、常に制限されている必要があります。 完全な特権を持つユーザーとしてアプリケーションをサインインさせる代わりに、Azure にはサービス プリンシパルが用意されています。
Azure サービス プリンシパルは、Azure リソースにアクセスするアプリケーション、ホステッド サービス、および自動化ツールで使用するために作成される ID です。 このアクセスはサービス プリンシパルに割り当てられているロールによって制限されるため、どのリソースに、どのレベルでアクセスできるかを制御することができます。 セキュリティ上の理由から、自動化ツールにはユーザー ID でのログインを許可するのではなく、常にサービス プリンシパルを使用することを推奨します。
この記事では、Azure PowerShell を使用して、サービス プリンシパルの作成、情報取得、およびリセットを行うための手順について説明します。
注意事項
New-AzADServicePrincipal コマンドを使用してサービス プリンシパルを作成する場合、出力には保護する必要がある資格情報が含まれます。 別の方法として、資格情報を使用する必要がないように、マネージド ID を使用することを検討してください。
[前提条件]
- Azure PowerShell をローカルで使用する場合は、次のようにします。
- Az PowerShell モジュールをインストールします。
- Connect-AzAccount コマンドレットを使用して、Azure アカウントに接続します。
- Azure Cloud Shell を使用する場合は、次のようにします。
- 詳細については、Azure Cloud Shell の概要に関するページを参照してください。
サービス プリンシパルを作成する
New-AzADServicePrincipal コマンドレットを使用してサービス プリンシパルを作成します。 サービス プリンシパルを作成する際に、サービス プリンシパルが使用するサインイン認証の種類を選択します。
Von Bedeutung
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 種類があります。
パスワードベースの認証
Von Bedeutung
パスワードベースの認証サービス プリンシパルの既定ロールは共同作成者です。 このロールには、Azure アカウントの読み取りと書き込みを行うための完全なアクセス許可が付与されます。 ロールの割り当ての管理については、「サービス プリンシパル ロールを管理する」を参照してください。
パスワード ベースの認証では、他の認証パラメーターは使用せず、自動的に作成されるランダム パスワードを使用します。 パスワードベースの認証が必要な場合は、この方法をお勧めします。
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName
返されるオブジェクトには、生成されたパスワードを含む PasswordCredentials.SecretText
プロパティが含まれています。 サービス プリンシパルで認証するためには、この値を必ず安全な場所に保存してください。 その値 は コンソール出力に表示されません。 パスワードを紛失した場合は、サービス プリンシパルの資格情報をリセットします。
次のコードにより、シークレットをエクスポートできます。
$sp.PasswordCredentials.SecretText
New-AzADServicePrincipal
から返されるオブジェクトには Id
メンバーと DisplayName
メンバーが含まれ、そのどちらもサービス プリンシパルでのサインインに使用できます。
Von Bedeutung
サービス プリンシパルを使ってサインインするには、そのサービス プリンシパルが作成されたテナント ID が必要です。 サービス プリンシパルの作成時にアクティブなテナントを取得するには、サービス プリンシパルの作成 直後 に次のコマンドを実行します。
(Get-AzContext).Tenant.Id
証明書ベースの認証
Von Bedeutung
証明書ベースの認証サービス プリンシパルを作成するときに割り当てられる既定のロールはありません。 ロールの割り当ての管理については、「サービス プリンシパル ロールを管理する」を参照してください。
証明書ベースの認証を使用するサービス プリンシパルは、 CertValue
パラメーターを使用して作成されます。 このパラメーターは、公開証明書の Base64 でエンコードされた ASCII 文字列を受け取ります。 これは、PEM ファイル、あるいはテキスト エンコードされた CRT または CER で表されます。 公開証明書のバイナリ エンコーディングはサポートされていません。 これらの手順では、証明書が既に使用可能であることを前提としています。
$cert = <public certificate as base64-encoded string>
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName -CertValue $cert
New-AzADServicePrincipal
から返されるオブジェクトには Id
と DisplayName
プロパティが含まれ、そのどちらもサービス プリンシパルでのサインインに使用できます。 サービス プリンシパルを使用してサインインするクライアントには、証明書の秘密キーへのアクセス権も必要です。
Von Bedeutung
サービス プリンシパルを使ってサインインするには、そのサービス プリンシパルが作成されたテナント 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'
Von Bedeutung
ロールの割り当てコマンドレットは、サービス プリンシパル オブジェクト 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 を使用して新しい資格情報とランダムなパスワードを追加します。 このコマンドレットは、パスワードをリセットするときにユーザー定義の資格情報をサポートしていません。
Von Bedeutung
新しい資格情報を割り当てる前に、既存の資格情報を使用したサインインを防ぐために、既存の資格情報を削除する必要があります。 これを行うには、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
それ以外の場合は、作成しようとしている新しいサービス プリンシパルの代替名を選択します。
Azure PowerShell