自動化シナリオ向けに非対話型で Azure PowerShell にサインインする

Azure のサービス プリンシパルは、アプリケーション、サービス、および自動化ツールが特定の Azure リソースにアクセスするために使用する ID が提供される非対話型アカウントです。 サービス プリンシパルを使用した認証は、どのようなアクションを実行し、どのようなリソースにアクセスできるかを管理するアクセス許可を割り当てられたセキュリティ ID として機能するため、セキュリティで保護されたスクリプトを記述するための最良の方法です。 サービス プリンシパルは、個人用ユーザー アカウントを使用せずに管理タスクを安全に自動化し、Azure リソースへのアクセスをより安全かつ管理しやすくします。 他のユーザー アカウントと同様、そのアクセス許可は Microsoft Entra ID で管理されます。 サービス プリンシパルに、必要なアクセス許可のみを付与することで、自動化スクリプトのセキュリティが維持されます。

前提条件

マネージド ID を使用してログインする

マネージド ID は、自動的に管理される ID を Azure サービスに提供する特別な種類のサービス プリンシパルです。 この種類の ID を使用すると、マネージド ID をサポートする Azure サービスに対して認証するための構成やコードに資格情報を保存する必要がありません。

マネージド ID には、次の 2 種類があります。

  • システム割り当てマネージド ID
  • ユーザー割り当てマネージド ID

マネージド ID では、開発者が資格情報を管理する必要はなく、他の Azure サービスと安全に通信する方法が提供されます。 また、資格情報流出のリスク軽減にも役立ちます。

ここでは、マネージド ID が実際のシナリオでどのように機能するかを説明します。

  • Azure は、マネージド ID で使用される資格情報の作成と削除を自動的に管理します。
  • マネージド 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 を使用して VirtualMachine で実行した場合、コードはその割り当てられた ID を使用してサインインできます。

 Connect-AzAccount -Identity

ユーザー割り当てマネージド ID

ユーザー割り当てマネージド ID は、Microsoft Entra で作成および管理する ID です。 1 つ以上の Azure サービス インスタンスに割り当てることができます。 ユーザー割り当てマネージド ID のライフサイクルは、その ID が割り当てられているサービス インスタンスとは個別に管理されます。

ユーザー割り当てマネージド ID を使用する場合は、次の例に示すように、Identity パラメーターと AccountId パラメーターを指定する必要があります。

 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 パラメーターの値としてサービス プリンシパルのアプリケーション ID を指定します。

Connect-AzAccount -ServicePrincipal -ApplicationId $servicePrincipalId -Tenant $tenantId -CertificateThumbprint <thumbprint>

Windows PowerShell 5.1 では、PKI モジュールを使用して、証明書ストアを管理および検査できます。 PowerShell 7.x 以降の場合は、プロセスが異なります。 次のスクリプトでは、PowerShell からアクセスできる証明書ストアに、既存の証明書をインポートする方法を示します。

PowerShell Core 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

自動化のシナリオでは、サービス プリンシパルの AppIdSecretText から資格情報を作成する必要があります。

$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

サービス プリンシパルへの接続を自動化する場合は、適切なパスワード保存プラクティスを使用してください。

関連項目