自動化シナリオのために非対話形式で Azure PowerShell にサインインする

Azure のマネージド ID は、コードや構成に資格情報を格納することなく、アプリケーション、サービス、自動化ツールが Azure リソースにアクセスするためのセキュリティで保護されたシームレスな方法を提供します。 手動による資格情報管理が必要なサービス プリンシパルとは異なり、Azure はマネージド ID を自動的に処理し、機密性の高いシークレットは公開しません。 セキュリティで保護された自動化スクリプトを記述する場合は、マネージド ID を使用するのがベスト プラクティスです。認証が簡素化され、資格情報漏洩のリスクが最小限に抑えられます。 マネージド ID は、ユーザー ID に依存することなく、管理タスクを安全に自動化するのにも役立ちます。 マネージド ID のアクセス許可は Microsoft Entra を通じて管理され、リソースへの必要なアクセス権のみが確保され、セキュリティと保守容易性の両方が強化されます。

Von Bedeutung

2025 年初頭から、Microsoft Entra ID ユーザー ID を使用して Azure PowerShell から Azure に認証するには、多要素認証 (MFA) が必要になります。 詳細については、 自動化シナリオでの Azure PowerShell での多要素認証の影響に関するページを参照してください

[前提条件]

マネージド 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 を持つ仮想マシン上で実行されると、コードは割り当てられた ID を使用してサインインできるようになります。

 Connect-AzAccount -Identity

ユーザーが割り当てた管理ID

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

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

 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 パラメーターを使用します。 サービス プリンシパルには次の情報も必要になります。

  • 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

注意事項

提供されるサービス プリンシパル シークレットは、ユーザー プロファイル (AzureRmContext.json) 内の $env:USERPROFILE\.Azure ファイル内に格納されます。 このディレクトリが適切に保護されていることを確認してください。

サービス プリンシパルの資格情報をオブジェクトとして取得するには、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

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

こちらも参照ください