Azure PowerShell を使用してサインインする
Azure PowerShell では、複数の認証方法がサポートされています。 Azure Cloud Shell を使用すると自動的にログインできるため、最も簡単に作業を開始できます。 ローカル インストールを利用すると、ブラウザーから対話形式でサインインできます。 自動化のスクリプトを記述するとき、必要なアクセス許可でサービス プリンシパルを使用する方法が推奨されます。 ユース ケースに対して可能な限りサインイン アクセス許可を制限することで、Azure リソースのセキュリティを維持できます。
複数のサブスクリプションにアクセスできる場合、最初は、Azure から返された最初のサブスクリプションにサインインします。 既定では、このサブスクリプションに対してコマンドが実行されます。 セッションのアクティブ サブスクリプションを変更するには、Set-AzContext コマンドレットを使用します。 アクティブなサブスクリプションを変更し、同じシステム上のセッション間で永続化するには、Select-AzContext コマンドレットを使用します。
重要
サインインしたままであれば、資格情報は複数の PowerShell セッション間で共有されます。 詳しくは、「Azure PowerShell コンテキスト オブジェクト」をご覧ください。
対話操作でサインインする
対話形式でサインインするには、Connect-AzAccount コマンドレットを使用します。
Connect-AzAccount
このコマンドレットは、既定で対話型のブラウザー ベースのログイン プロンプトを表示します。
Get-AzContext コマンドレットを使用して、この記事の次の 2 つのセクションで使用する変数にテナント ID を格納します。
$tenantId = (Get-AzContext).Tenant.Id
デバイス コード認証
UseDeviceAuthentication
パラメーターを指定して、ブラウザー コントロールの代わりにデバイス コード認証を使用できます。
Connect-AzAccount -UseDeviceAuthentication
サービス プリンシパルを使ってサインインする
サービス プリンシパルは、非対話型の Azure アカウントです。 他のユーザー アカウントと同様、そのアクセス許可は Azure Active Directory で管理されます。 サービス プリンシパルに、必要なアクセス許可のみを付与することで、自動化スクリプトのセキュリティが維持されます。
Azure PowerShell で使用するサービス プリンシパルを作成する方法については、「Azure PowerShell で Azure サービス プリンシパルを作成する」を参照してください。
サービス プリンシパルを使用してサインインするには、Connect-AzAccount
コマンドレットの ServicePrincipal
パラメーターを使用します。 サービス プリンシパルのアプリケーション ID、サインイン資格情報、およびサービス プリンシパルに関連付けられたテナント ID も必要です。 サービス プリンシパルを使用してサインインする方法は、パスワードベースと証明書ベース認証用のどちらに構成されているかによって異なります。
パスワードベースの認証
このセクションの例で使用するサービス プリンシパルを作成します。 サービス プリンシパルの作成について詳しくは、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 で、証明書の拇印に基づいてローカル証明書ストアから情報を取得できる必要があります。
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 からアクセスできる証明書ストアに、既存の証明書をインポートする方法を示します。
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
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()
マネージド ID を使用したサインイン
マネージド ID は Azure Active Directory の機能です。 マネージド ID は、Azure で実行されるリソースに割り当てられたサービス プリンシパルです。 サインインにマネージド ID サービス プリンシパルを、その他のリソースにアクセスするためにアプリ専用のアクセス トークンを使用できます。 マネージド ID は、Azure クラウドで実行されているリソースでのみ使用できます。
この例では、ホスト環境のシステム割り当てマネージド ID を使用して接続します。 たとえば、割り当てられたマネージド サービス ID を使用して VirtualMachine で実行した場合、コードはその割り当てられた ID を使用してサインインできます。
Connect-AzAccount -Identity
ユーザー割り当てマネージド ID を使用する場合は、次の例に示すように、 Identity パラメーターに加えて、 AccountId パラメーターを指定する必要があります。
Connect-AzAccount -Identity -AccountId <user-assigned-identity-clientId-or-resourceId>
次の例では、マネージド サービス ID の myUserAssignedIdentity
を使用して接続します。 これは、仮想マシンにこのユーザー割り当て ID を追加し、ユーザー割り当て ID の ClientId
を使用して接続します。 詳細については、Azure VM 上の Azure リソースのマネージド ID を構成することに関する記事を参照してください。
$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
------- ---------------- -------- -----------
yyyy-yyyy-yyyy-yyyy Subscription1 xxxx-xxxx-xxxx-xxxx AzureCloud
既定ではないテナントで、あるいはクラウド ソリューション プロバイダー (CSP) としてサインインする
アカウントが複数のテナントに関連付けられている場合は、サインインで、接続時に Tenant パラメーターを指定する必要があります。 このパラメーターは、どのサインイン方法でも機能します。 ログイン時、テナントの Azure オブジェクト ID (テナント ID) またはテナントの完全修飾ドメイン名がこのパラメーター値になります。
クラウド ソリューション プロバイダー (CSP) の場合、Tenant パラメーターの値はテナント ID にする必要があります。
Connect-AzAccount -Tenant '00000000-0000-0000-0000-000000000000'
別のクラウドにサインインする
Azure クラウド サービスでは、リージョンのデータ処理の法律に準拠した環境を提供します。 リージョン クラウド内のアカウントの場合は、サインインするときに Environment パラメーターで環境を設定します。 このパラメーターは、どのサインイン方法でも機能します。 たとえば、ご自身のアカウントが Azure China 21Vianet にある場合は、次のようになります。
Connect-AzAccount -Environment AzureChinaCloud
次のコマンドは、使用可能な環境の一覧を返します。
Get-AzEnvironment | Select-Object -Property Name