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

警告

AzureRM PowerShell モジュールは、2024 年 2 月 29 日に正式に非推奨になりました。 引き続きサポートを受け、更新を受け取れるようにするために、AzureRM から Az PowerShell モジュールに移行することをお勧めします。

AzureRM モジュールは引き続き機能する可能性がありますが、メンテナンスやサポートは行われないため、引き続きの使用はユーザーの判断とリスクに委ねられます。 Az モジュールへの移行に関するガイダンスについては、移行リソースを参照してください。

Azure PowerShell を使ってアプリまたはサービスを管理する場合、その実行には、自分の資格情報ではなく、Microsoft Entra のサービス プリンシパルを使う必要があります。 この記事では、Azure PowerShell でセキュリティ プリンシパルを作成する手順を紹介します。

注意

Azure Portal からサービス プリンシパルを作成することもできます。 詳細については、「リソースにアクセスできる Azure Active Directory アプリケーションとサービス プリンシパルをポータルで作成する」を参照してください。

"サービス プリンシパル" とは

Azure サービス プリンシパルは、ユーザーによって作成されたアプリやサービス、オートメーション ツールが特定の Azure リソースにアクセスする際に使うセキュリティ ID です。 アクセス許可が厳しく管理された、特定のロールが与えられた "ユーザー ID" (ユーザー名とパスワードまたは証明書) と考えてください。 一般的なユーザー ID とは異なり、サービス プリンシパルで行うタスクは制限する必要があります。 管理タスクを実行するために必要な最小限のアクセス許可レベルだけを与えるようにすれば、セキュリティは向上します。

自分のアクセス許可レベルの確認

まず、Microsoft Entra ID と Azure サブスクリプションの両方で適切なアクセス許可を持っている必要があります。 Active Directory でアプリを作成し、サービス プリンシパルにロールを割り当てることができる必要があります。

自分のアカウントに適切なアクセス許可があるかどうかを確認する最も簡単な方法は、ポータルを使用することです。 ポータルでの必要なアクセス許可のチェックに関するページをご覧ください。

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

サービス プリンシパルは、Azure アカウントへのサインイン後に作成することができます。 デプロイされているアプリを識別する手段が必要です。次のいずれかの方法があります。

  • デプロイされているアプリの一意の名前 (次の例の "MyDemoWebApp" など)
  • アプリケーション ID (デプロイされているアプリやサービス、オブジェクトに関連付けられている一意の GUID)

アプリケーションに関する情報を取得する

アプリケーションに関する情報は、Get-AzureRmADApplication コマンドレットを使って取得できます。

Get-AzureRmADApplication -DisplayNameStartWith MyDemoWebApp
DisplayName             : MyDemoWebApp
ObjectId                : 775f64cd-0ec8-4b9b-b69a-8b8946022d9f
IdentifierUris          : {http://MyDemoWebApp}
HomePage                : http://www.contoso.com
Type                    : Application
ApplicationId           : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
AvailableToOtherTenants : False
AppPermissions          :
ReplyUrls               : {}

アプリケーションのサービス プリンシパルを作成する

サービス プリンシパルは、New-AzureRmADServicePrincipal コマンドレットを使って作成します。

$servicePrincipal = New-AzureRmADServicePrincipal -ApplicationId 00c01aaa-1603-49fc-b6df-b78c4e5138b4
Secret                : System.Security.SecureString
ServicePrincipalNames : {00c01aaa-1603-49fc-b6df-b78c4e5138b4, http://MyDemoWebApp}
ApplicationId         : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
DisplayName           : MyDemoWebApp
Id                    : 698138e7-d7b6-4738-a866-b4e3081a69e4
AdfsId                :
Type                  : ServicePrincipal

ここから、Connect-AzureRmAccount で $servicePrincipal.Secret プロパティを直接使用する (次の「サービス プリンシパルを使ってサインインする」を参照) か、後で使用できるようにこの SecureString をプレーンテキストに変換することができます。

$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($servicePrincipal.Secret)
$password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR)

サービス プリンシパルを使ってサインインする

指定した "アプリ ID" と自動生成された "パスワード" を使って、アプリの新しいサービス プリンシパルとしてサインインできるようになりました。 サービス プリンシパルのテナント ID も必要です。 テナント ID は、個人用の資格情報で Azure にサインインすると表示されます。 サービス プリンシパルを使用してサインインするには、次のコマンドを使用します。

$cred = New-Object System.Management.Automation.PSCredential ("00c01aaa-1603-49fc-b6df-b78c4e5138b4", $servicePrincipal.Secret)
Connect-AzureRmAccount -Credential $cred -ServicePrincipal -TenantId 00000000-0000-0000-0000-000000000000

サインインに成功すると、次のような出力が表示されます。

Environment           : AzureCloud
Account               : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
TenantId              : 00000000-0000-0000-0000-000000000000
SubscriptionId        :
SubscriptionName      :
CurrentStorageAccount :

お疲れさまでした。 これらの資格情報を使ってアプリを実行することができます。 次に、サービス プリンシパルのアクセス許可を調整する必要があります。

ロールの管理

注意

Azure のロールベースのアクセス制御 (RBAC) は、ユーザー プリンシパルとサービス プリンシパルのロールを定義して管理するためのモデルです。 ロールに関連付けられる一連のアクセス許可によって、プリンシパルが各種の操作 (読み取り、アクセス、書き込み、または管理) を実行できるリソースが決まります。 RBAC とロールについて詳しくは、RBAC のための組み込みロールに関するページをご覧ください。

Azure PowerShell には、ロールの割り当て管理を目的とした次のコマンドレットが用意されています。

サービス プリンシパルの既定のロールは共同作成者です。 このロールは、広範なアクセス許可が与えられていることから、Azure サービスに対するアプリの対話の範囲によっては最適とは言えない場合もあります。 読み取り専用のアプリであれば、より制限の厳しい閲覧者ロールの方が適しています。 Azure Portal でロールごとのアクセス許可について詳しい情報を確認したり、カスタム ロールを作成したりすることができます。

この例では、先ほどの例に閲覧者ロールを追加し、共同作成者ロールを削除しています。

New-AzureRmRoleAssignment -ResourceGroupName myRG -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4 -RoleDefinitionName Reader
RoleAssignmentId   : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG/providers/Microsoft.Authorization/roleAssignments/818892f2-d075-46a1-a3a2-3a4e1a12fcd5
Scope              : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG
DisplayName        : MyDemoWebApp
SignInName         :
RoleDefinitionName : Reader
RoleDefinitionId   : b24988ac-6180-42a0-ab88-20f7382dd24c
ObjectId           : 698138e7-d7b6-4738-a866-b4e3081a69e4
ObjectType         : ServicePrincipal
Remove-AzureRmRoleAssignment -ResourceGroupName myRG -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4 -RoleDefinitionName Contributor

現在割り当てられているロールを表示するには、次のコマンドレットを使用します。

Get-AzureRmRoleAssignment -ResourceGroupName myRG -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4
RoleAssignmentId   : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG/providers/Microsoft.Authorization/roleAssignments/0906bbd8-9982-4c03-8dae-aeaae8b13f9e
Scope              : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG
DisplayName        : MyDemoWebApp
SignInName         :
RoleDefinitionName : Reader
RoleDefinitionId   : acdd72a7-3385-48ef-bd42-f606fba81ae7
ObjectId           : 698138e7-d7b6-4738-a866-b4e3081a69e4
ObjectType         : ServicePrincipal

その他、ロールの管理を目的として次の Azure PowerShell コマンドレットが用意されています。

セキュリティ プリンシパルの資格情報を変更する

セキュリティ上、アクセス許可の確認とパスワードの更新を定期的に行うことが大切です。 必要に応じて、アプリの変更に合わせてセキュリティ資格情報を適宜更新することもできます。 たとえばサービス プリンシパルのパスワードは、新しいパスワードを作成して古いパスワードを削除することで変更できます。

サービス プリンシパルの新しいパスワードを追加する

New-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp
Secret    : System.Security.SecureString
StartDate : 11/16/2018 12:38:23 AM
EndDate   : 11/16/2019 12:38:23 AM
KeyId     : 6f801c3e-6fcd-42b9-be8e-320b17ba1d36
Type      : Password

サービス プリンシパルの一連の資格情報を取得する

Get-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp
StartDate           EndDate             KeyId                                Type
---------           -------             -----                                ----
3/8/2017 5:58:24 PM 3/8/2018 5:58:24 PM 6f801c3e-6fcd-42b9-be8e-320b17ba1d36 Password
5/5/2016 4:55:27 PM 5/5/2017 4:55:27 PM ca9d4846-4972-4c70-b6f5-a4effa60b9bc Password

サービス プリンシパルから古いパスワードを削除する

Remove-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp -KeyId ca9d4846-4972-4c70-b6f5-a4effa60b9bc
Confirm
Are you sure you want to remove credential with keyId '6f801c3e-6fcd-42b9-be8e-320b17ba1d36' for
service principal objectId '698138e7-d7b6-4738-a866-b4e3081a69e4'.
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

サービス プリンシパルの一連の資格情報を確認する

Get-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp
StartDate           EndDate             KeyId                                Type
---------           -------             -----                                ----
3/8/2017 5:58:24 PM 3/8/2018 5:58:24 PM 6f801c3e-6fcd-42b9-be8e-320b17ba1d36 Password

サービス プリンシパルに関する情報を取得する

$svcprincipal = Get-AzureRmADServicePrincipal -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4
$svcprincipal | Select-Object -Property *
ServicePrincipalNames : {http://MyDemoWebApp, 00c01aaa-1603-49fc-b6df-b78c4e5138b4}
ApplicationId         : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
DisplayName           : MyDemoWebApp
Id                    : 698138e7-d7b6-4738-a866-b4e3081a69e4
Type                  : ServicePrincipal