Azure PowerShell で Azure サービス プリンシパルを作成する
Azure サービスを使用する自動化ツールのアクセス許可は、常に制限されている必要があります。 完全な特権を持つユーザーとしてアプリケーションをサインインさせる代わりに、Azure にはサービス プリンシパルが用意されています。
Azure サービス プリンシパルは、Azure リソースにアクセスするアプリケーション、ホステッド サービス、および自動化ツールで使用するために作成される ID です。 このアクセスはサービス プリンシパルに割り当てられているロールによって制限されるため、どのリソースに、どのレベルでアクセスできるかを制御することができます。 セキュリティ上の理由から、自動化ツールにはユーザー ID でのログインを許可するのではなく、常にサービス プリンシパルを使用することを推奨します。
この記事では、Azure PowerShell を使用して、サービス プリンシパルの作成、情報取得、およびリセットを行うための手順について説明します。
サービス プリンシパルの作成
警告
New-AzADServicePrincipal コマンドを使用してサービス プリンシパルを作成する場合、出力には保護する必要がある資格情報が含まれます。 別の方法として、資格情報を使用する必要がないように、マネージド ID を使用することを検討してください。
既定では、New-AzADServicePrincipal によって、共同作成者ロールがサブスクリプション スコープでサービス プリンシパルに割り当てられます。 サービス プリンシパルが侵害されるリスクを軽減するには、より具体的なロールを割り当て、そのスコープをリソースまたはリソース グループに絞り込みます。 詳細については、「ロールの割り当てを追加する手順」を参照してください。
New-AzADServicePrincipal コマンドレットを使用してサービス プリンシパルを作成します。 サービス プリンシパルを作成する際に、サービス プリンシパルが使用するサインイン認証の種類を選択します。
Note
ご利用のアカウントにサービス プリンシパルを作成するためのアクセス許可がない場合は、New-AzADServicePrincipal
から "この操作を完了するのに十分な特権がありません" というエラー メッセージが返されます。サービス プリンシパルを作成するには、Microsoft Entra 管理者にお問い合わせください。
サービス プリンシパルで使用できる認証には、パスワードベースの認証と証明書ベースの認証の 2 種類があります。
パスワードベースの認証
パスワード ベースの認証では、他の認証パラメーターは使用せず、自動的に作成されるランダム パスワードを使用します。 パスワード ベースの認証を使用する場合は、次の方法をお勧めします。
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName
返されるオブジェクトには、Secret
メンバーが含まれています。これは生成されたパスワードを格納している SecureString
です。 サービス プリンシパルで認証するためには、この値を必ず安全な場所に保存してください。 この値は、コンソール出力には表示されません。 パスワードを紛失した場合は、サービス プリンシパルの資格情報をリセットします。
次のコードにより、シークレットをエクスポートできます。
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret)
$UnsecureSecret = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
ユーザー指定のパスワードの場合、-PasswordCredential
引数は Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential
オブジェクトを受け取ります。 これらのオブジェクトは有効な StartDate
とEndDate
を持ち、プレーンテキストの Password
を受け取ります。 パスワードを作成する際は、必ず Microsoft Entra のパスワードの規則と制約事項に従ってください。 脆弱なパスワードを使用したり、パスワードを再利用したりしないでください。
Import-Module Az.Resources # Imports the PSADPasswordCredential object
$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential -Property @{ StartDate=Get-Date; EndDate=Get-Date -Year 2024; Password=<Choose a strong password>}
$sp = New-AzAdServicePrincipal -DisplayName ServicePrincipalName -PasswordCredential $credentials
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
また、-KeyCredential
パラメーターを使用することもできます。これは PSADKeyCredential
オブジェクトを受け取ります。 これらのオブジェクトは、有効な StartDate
と EndDate
を持ち、CertValue
メンバーが公開証明書の Base64 でエンコードされた ASCII 文字列に設定されている必要があります。
$cert = <public certificate as base64-encoded string>
$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADKeyCredential -Property @{ StartDate=Get-Date; EndDate=Get-Date -Year 2024; KeyId=New-Guid; CertValue=$cert}
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName -KeyCredential $credentials
New-AzADServicePrincipal
から返されるオブジェクトには Id
メンバーと DisplayName
メンバーが含まれ、そのどちらもサービス プリンシパルでのサインインに使用できます。 サービス プリンシパルを使用してサインインするクライアントには、証明書の秘密キーへのアクセス権も必要です。
重要
サービス プリンシパルを使用してサインインするには、サービス プリンシパルを作成したテナントの ID が必要です。 サービス プリンシパルの作成時にアクティブなテナントを取得するには、サービス プリンシパルの作成直後に、次のコマンドを実行します。
(Get-AzContext).Tenant.Id
既存のサービス プリンシパルの取得
Get AzADServicePrincipal を使用すると、現在アクティブなテナントのサービス プリンシパル一覧を取得できます。 既定では、このコマンドによってテナント内のすべてのサービス プリンシパルが返されるため、大規模な組織の場合は、結果が返されるまでに長時間を要することがあります。 代わりに、オプションのサーバー側フィルター処理引数のいずれかを使用することをお勧めします。
-DisplayNameBeginsWith
は、指定した値に一致する "プレフィックス" を持つサービス プリンシパルを要求します。 サービス プリンシパルの表示名は、作成時に-DisplayName
で設定した値です。-DisplayName
は、サービス プリンシパル名に "正確に一致するもの" を要求します。
サービス プリンシパル ロールを管理する
Azure PowerShell には、ロールの割り当てを管理するための、次のコマンドレットが用意されています。
サービス プリンシパルの既定のロールは共同作成者です。 このロールには、Azure アカウントの読み取りと書き込みを行うための完全なアクセス許可が付与されます。 閲覧者ロールは制限がより厳しく、読み取り専用アクセスが提供されます。 ロールベースのアクセス制御 (RBAC) とロールの詳細については、RBAC の組み込みのロールに関するページをご覧ください。
この例では、閲覧者ロールを追加し、共同作成者ロールを削除します。
New-AzRoleAssignment -ApplicationId <service principal application ID> -RoleDefinitionName "Reader"
Remove-AzRoleAssignment -ApplicationId <service principal application ID> -RoleDefinitionName "Contributor"
重要
ロールの割り当てコマンドレットは、サービス プリンシパル オブジェクト ID を受け取りません。 これらは、作成時に生成され、関連付けられているアプリケーション ID を受け取ります。 サービス プリンシパルのアプリケーション ID を取得するには、Get-AzADServicePrincipal
を使用します。
Note
ロールを割り当てるためのアクセス許可がアカウントにない場合は、アカウントに "'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 <tenant ID> -CertificateThumbprint <thumbprint>
PowerShell がアクセスできる資格情報ストアに証明書をインポートする手順については、「Sign in with Azure PowerShell (Azure PowerShell を使用してサインインする)」を参照してください
資格情報をリセットする
サービス プリンシパルの資格情報を忘れた場合は、New-AzADSpCredential を使用して新しい資格情報を追加します。 このコマンドレットは、New-AzADServicePrincipal
と同じ資格情報の引数と型を受け取ります。 資格情報の引数を指定しない場合、ランダムなパスワードを持つ新しい PasswordCredential
が作成されます。
重要
新しい資格情報を割り当てる前に、既存の資格情報を使用したサインインを防ぐために、既存の資格情報を削除する必要があります。 これを行うには、Remove-AzADSpCredential コマンドレットを使用します。
Remove-AzADSpCredential -DisplayName ServicePrincipalName
$newCredential = New-AzADSpCredential -ServicePrincipalName ServicePrincipalName