針對自動化案例,以非互動方式登入 Azure PowerShell
Azure 中的服務主體是非互動式帳戶,其會提供應用程式、服務和自動化工具用來存取特定 Azure 資源的身分識別。 使用服務主體進行驗證是撰寫安全指令碼的最佳方式,因為它們會作為安全性身分識別,其獲指派的權限控管可執行哪些動作,以及可以存取哪些資源。 服務主體可協助在不使用個人使用者帳戶的情況下安全地自動化管理工作,從而促進以更安全且可管理的方式存取 Azure 資源。 如同其他使用者帳戶,您可以使用 Microsoft Entra 來管理其權限。 藉由僅為服務主體授與其所需的權限,您的自動化指令碼得以受到保護。
必要條件
使用受控識別進行登入
受控識別是特殊類型的服務主體,其可為 Azure 服務提供自動受控識別。 使用此類型的身分識別不需要將認證儲存在設定或程式碼中,即可向任何支援受控識別的 Azure 服務進行驗證。
受控身分識別有兩種:
- 系統指派的受控識別
- 使用者指派的受控識別
受控識別提供一種與其他 Azure 服務通訊的安全方式,而開發人員不需要管理認證。 它們也有助於降低認證外洩的風險。
以下是受控識別在真實世界案例中的運作方式:
- Azure 會自動管理受控識別所使用認證的建立和刪除。
- 使用受控識別啟用的 Azure 服務,可能會使用 Microsoft Entra 權杖安全地存取其他服務,例如 Azure Key Vault、Azure SQL Database、Azure Blob 儲存體等。
- 此身分識別直接在 Azure 內管理,無需額外的佈建。
受控識別可藉由避免儲存和管理認證的需求來簡化安全性模型,並藉由降低與處理秘密相關聯的風險,在安全雲端作業中扮演重要角色。
系統指派的受控識別
Azure 會自動為 Azure 服務執行個體 (例如 Azure VM、App Service 或 Azure Functions) 建立系統指派的受控識別。 當服務執行個體遭到刪除時,Azure 會自動清除與服務相關聯的認證和身分識別。
下列範例會使用主機環境的系統指派的受控識別來連線。 如果已在虛擬機器上使用指派的受控識別來執行,其可讓程式碼使用指派的身分識別來登入。
Connect-AzAccount -Identity
使用者指派的受控識別
使用者指派的受控識別是您在 Microsoft Entra 中建立和管理的身分識別。 其可指派給一或多個 Azure 服務執行個體。 使用者指派的受控識別與獲指派此受控識別的服務執行個體,兩者的生命週期分開管理。
使用一個使用者指派的受控識別時,您必須指定 AccountId 參數和 Identity 參數,如下列範例所示。
Connect-AzAccount -Identity -AccountId <user-assigned-identity-clientId-or-resourceId>
下列命令會使用 myUserAssignedIdentity
的受控識別進行連線。 其會將使用者指派身分識別新增至虛擬機器,然後透過使用者指派的身分識別的 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 資源受控識別。
使用服務主體登入
若要使用服務主體登入,請使用 Connect-AzAccount
Cmdlet 的 ServicePrincipal 參數。 您也需要服務主體的下列資訊:
- AppId
- 登入認證或用來建立服務主體的憑證存取權
- 租用戶識別碼
您使用服務主體登入的方式取決於其是設定為憑證型還是密碼型驗證。
憑證式驗證
若要了解如何建立 Azure PowerShell 的服務主體,請參閱使用 Azure PowerShell 建立 Azure 服務主體。
憑證型驗證要求 Azure PowerShell 從以憑證指紋為基礎的本機憑證存放區擷取資訊。
Connect-AzAccount -ApplicationId $appId -Tenant $tenantId -CertificateThumbprint <thumbprint>
當使用的是服務主體而非已註冊的應用程式時,請指定 ServicePrincipal 參數,並提供服務主體的 AppId 作為 ApplicationId 參數的值。
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
Cmdlet。 此 Cmdlet 會提示您輸入使用者名稱和密碼。 使用服務主體的 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
在自動化服務主體連線時,使用適當的密碼儲存實務。