自動化シナリオのために非対話形式で Azure PowerShell にサインインする
Azure のサービス プリンシパルは、アプリケーション、サービス、自動化ツールが特定の Azure リソースにアクセスするために使用する ID を提供する非対話型アカウントです。 セキュリティで保護されたスクリプトは、実行できるアクションとアクセスできるリソースを制御するアクセス許可が割り当てられたセキュリティ ID として機能するため、サービス プリンシパルを使用した認証が最適な方法です。 サービス プリンシパルは、個人のユーザー アカウントを使用せずに管理タスクを安全に自動化し、Azure リソースへのより安全で管理しやすいアクセスを促進するのに役立ちます。 他のユーザー アカウントと同様に、Microsoft Entra を使用してアクセス許可を管理します。 サービス プリンシパルに必要なアクセス許可のみを付与することで、自動化スクリプトのセキュリティが維持されます。
前提 条件
- Az PowerShell モジュールの最新バージョンをインストールします。
マネージド ID を使用してログインする
マネージド ID は、Azure サービスに自動的にマネージド ID を提供する特殊な種類のサービス プリンシパルです。 この種類の ID を使用する場合、マネージド ID をサポートする Azure サービスに対して認証するために、構成またはコードに資格情報を格納する必要はありません。
マネージド ID には、次の 2 種類があります。
- システム割り当てマネージド ID
- ユーザー割り当ての管理対象 ID
マネージド ID を使用すると、開発者が資格情報を管理しなくても、他の Azure サービスと安全に通信できます。 また、資格情報漏洩のリスクを軽減するのにも役立ちます。
実際のシナリオでのマネージド ID のしくみを次に示します。
- マネージド ID によって使用される資格情報の作成と削除は、Azure によって自動的に管理されます。
- マネージド ID で有効になっている Azure サービスは、Microsoft Entra トークンを使用して、Azure Key Vault、Azure SQL Database、Azure Blob Storage などの他のサービスに安全にアクセスできます。
- この ID は、追加のプロビジョニングを必要とせずに、Azure 内で直接管理されます。
マネージド ID は、資格情報の格納と管理の必要性を回避することでセキュリティ モデルを簡素化し、シークレットの処理に関連するリスクを軽減することで、セキュリティで保護されたクラウド運用において重要な役割を果たします。
システムに割り当てられたマネージド ID
Azure では、Azure サービス インスタンス (Azure VM、App Service、Azure Functions など) のシステム割り当てマネージド ID が自動的に作成されます。 サービス インスタンスが削除されると、Azure によって、サービスに関連付けられている資格情報と ID が自動的にクリーンアップされます。
次の例では、ホスト環境のシステム割り当てマネージド ID を使用して接続します。 割り当てられたマネージド ID を持つ仮想マシンで実行された場合、割り当てられた ID を使用してコードをサインインできます。
Connect-AzAccount -Identity
ユーザー割り当てマネージド ID
ユーザー割り当てマネージド ID は、Microsoft Entra で作成および管理する ID です。 1 つ以上の Azure サービス インスタンスに割り当てることができます。 ユーザー割り当てマネージド ID のライフサイクルは、割り当てられているサービス インスタンスとは別に管理されます。
ユーザー割り当てマネージド ID を使用する場合は、次の例に示すように、AccountId パラメーターと Identity パラメーターを指定する必要があります。
Connect-AzAccount -Identity -AccountId <user-assigned-identity-clientId-or-resourceId>
次のコマンドは、myUserAssignedIdentity
のマネージド ID を使用して接続します。 仮想マシンにユーザー割り当て ID を追加し、ユーザー割り当て ID の ClientId を使用して接続します。
$identity = Get-AzUserAssignedIdentity -ResourceGroupName myResourceGroup -Name myUserAssignedIdentity
Get-AzVM -ResourceGroupName contoso -Name testvm | Update-AzVM -IdentityType UserAssigned -IdentityId $identity.Id
Connect-AzAccount -Identity -AccountId $identity.ClientId # Run on the virtual machine
Account SubscriptionName TenantId Environment
------- ---------------- -------- -----------
00000000-0000-0000-0000-000000000000 My Subscription 00000000-0000-0000-0000-000000000000 AzureCloud
詳細については、「Azure VMで Azure リソースのマネージド ID を構成する」を参照してください。
サービス プリンシパルによるログイン
サービス プリンシパルを使用してサインインするには、Connect-AzAccount
コマンドレットの ServicePrincipal パラメーターを使用します。 また、サービス プリンシパルに関する次の情報も必要です。
- AppId
- サービス プリンシパルの作成に使用するサインイン資格情報または証明書へのアクセス
- テナント ID
サービス プリンシパルを使用してサインインする方法は、証明書ベースの認証とパスワードベースのどちらの認証用に構成されているかによって異なります。
証明書ベースの認証
Azure PowerShell のサービス プリンシパルを作成する方法については、「Azure PowerShellを使用して Azure サービス プリンシパルを作成する」を参照してください。
証明書ベースの認証では、Azure PowerShell が証明書の拇印に基づいてローカル証明書ストアから情報を取得する必要があります。
Connect-AzAccount -ApplicationId $appId -Tenant $tenantId -CertificateThumbprint <thumbprint>
登録済みアプリケーションではなくサービス プリンシパルを使用する場合は、ServicePrincipal パラメーターを指定し、ApplicationId パラメーターの値としてサービス プリンシパルの AppId を指定します。
Connect-AzAccount -ServicePrincipal -ApplicationId $servicePrincipalId -Tenant $tenantId -CertificateThumbprint <thumbprint>
Windows PowerShell 5.1 では、PKI モジュールを使用して証明書ストアを管理および検査できます。 PowerShell 7.x 以降の場合、プロセスは異なります。 次のスクリプトは、PowerShell からアクセスできる証明書ストアに既存の証明書をインポートする方法を示しています。
PowerShell 7.x 以降で証明書をインポートする
# Import a PFX
$storeName = [System.Security.Cryptography.X509Certificates.StoreName]::My
$storeLocation = [System.Security.Cryptography.X509Certificates.StoreLocation]::CurrentUser
$store = [System.Security.Cryptography.X509Certificates.X509Store]::new($storeName, $storeLocation)
$certPath = <path to certificate>
$credentials = Get-Credential -Message "Provide PFX private key password"
$flag = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable
$certificate = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($certPath, $credentials.Password, $flag)
$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
$store.Add($Certificate)
$store.Close()
Windows PowerShell 5.1 で証明書をインポートする
# Import a PFX
$credentials = Get-Credential -Message 'Provide PFX private key password'
Import-PfxCertificate -FilePath <path to certificate> -Password $credentials.Password -CertStoreLocation cert:\CurrentUser\My
パスワードベースの認証
このセクションの例で使用するサービス プリンシパルを作成します。 サービス プリンシパルの作成の詳細については、「Azure PowerShellを使用した Azure サービス プリンシパルの作成」を参照してください。
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName
注意
指定されたサービス プリンシパル シークレットは、ユーザー プロファイル ($env:USERPROFILE\.Azure
) の AzureRmContext.json
ファイルに格納されます。 このディレクトリに適切な保護があることを確認します。
サービス プリンシパルの資格情報をオブジェクトとして取得するには、Get-Credential
コマンドレットを使用します。 このコマンドレットでは、ユーザー名とパスワードの入力を求められます。 ユーザー名にサービス プリンシパルの AppId
を使用し、その secret
をパスワードのプレーン テキストに変換します。
# Retrieve the plain text password for use with Get-Credential in the next command.
$sp.PasswordCredentials.SecretText
$pscredential = Get-Credential -UserName $sp.AppId
Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId
自動化シナリオでは、サービス プリンシパルの AppId
と SecretText
から資格情報を作成する必要があります。
$SecureStringPwd = $sp.PasswordCredentials.SecretText | ConvertTo-SecureString -AsPlainText -Force
$pscredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $sp.AppId, $SecureStringPwd
Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId
サービス プリンシパル接続を自動化するときは、適切なパスワード ストレージプラクティスを使用します。
関連項目
- Azure PowerShell を使用して Azure サービス プリンシパルを作成する
- Azure リソースのマネージド ID とは
- PowerShell を使用してリソースにマネージド ID アクセスを割り当てる
- PowerShell を使用してマネージド ID のサービス プリンシパルを表示する
- Connect-AzAccount
- New-AzADServicePrincipal
- Get-Credential
Azure PowerShell