Azure サービスを使用する自動ツールには、常にアクセス許可が制限されている必要があります。 Azureは、完全な権限を持つユーザーとしてアプリケーションにサインインさせる代わりに、サービス プリンシパルを提供します。
Azure サービス プリンシパルは、アプリケーション、ホステッド サービス、および Azure リソースにアクセスするための自動化ツールで使用するために作成された ID です。 このアクセスは、サービス プリンシパルに割り当てられたロールによって制限されるため、アクセスできるリソースとレベルを制御できます。 セキュリティ上の理由から、ユーザー ID でのログインを許可するのではなく、自動ツールでサービス プリンシパルを使用することをお勧めします。
この記事では、Azure PowerShell を使用してサービス プリンシパルの作成、情報の取得、リセットを行う手順について説明します。
サービス プリンシパルを作成する
警告
New-AzADServicePrincipal コマンドを使用してサービス プリンシパルを作成する場合、出力には保護する必要がある資格情報が含まれます。 別の方法として、資格情報を使用する必要がないように、マネージド ID を使用することを検討してください。
既定では、New-AzADServicePrincipal によって、共同作成者ロールがサブスクリプション スコープでサービス プリンシパルに割り当てられます。 サービス プリンシパルが侵害されるリスクを軽減するには、より具体的なロールを割り当て、そのスコープをリソースまたはリソース グループに絞り込みます。 詳細については、ロールの割り当てを追加する手順を参照してください。
New-AzADServicePrincipal コマンドレットを使用してサービス プリンシパルを作成します。 サービス プリンシパルを作成する際に、サービス プリンシパルが使用するサインイン認証の種類を選択します。
注
アカウントにサービス プリンシパルを作成するアクセス許可がない場合、 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
、およびパブリック証明書の base64 でエンコードされた ASCII 文字列に CertValue
メンバーが設定されている必要があります。
$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 アカウントの読み取りと書き込みを行う完全なアクセス許可があります。 閲覧者ロールは、読み取り専用アクセス権を持つ、より制限が厳しくなっています。 Role-Based アクセス制御 (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
を使用します。
注
アカウントにロールを割り当てるアクセス許可がない場合は、アカウントに "アクション '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 からアクセスできる資格情報ストアに証明書をインポートする手順については、「Azure PowerShell を使用したサインイン」を参照してください。
資格情報をリセットする
サービス プリンシパルの資格情報を忘れた場合は、 New-AzADSpCredential を使用して新しい資格情報を追加します。 このコマンドレットは、 New-AzADServicePrincipal
と同じ資格情報の引数と型を受け取ります。 資格情報引数を指定しないと、ランダムなパスワードを持つ新しい PasswordCredential
が作成されます。
重要
新しい資格情報を割り当てる前に、既存の資格情報を削除してサインインできないようにすることができます。 これを行うには、 Remove-AzADSpCredential コマンドレットを使用します。
Remove-AzADSpCredential -DisplayName ServicePrincipalName
$newCredential = New-AzADSpCredential -ServicePrincipalName ServicePrincipalName