使用資料建立 Azure 服務主體Azure PowerShell

使用 Azure 服務的自動化工具應一直具有受限制的許可權。 Azure 提供服務主體,而不是讓應用程式以完全許可權的使用者來登錄。

Azure 服務主體是建立身分識別,用於與應用程式、託管服務和自動化工具一起存取 Azure 資源。 此存取權受限於指派給服務主體的角色,讓您控制哪些資源可以存取,以及位於哪個層級。 基於安全性考慮,建議您將服務主體與自動化工具一起使用,而不是允許他們以使用者身分識別登入。

本文將說明建立、取得有關服務主體及以 Azure PowerShell 重設Azure PowerShell。

警告

當您使用 New-AzADServicePrincipal 命令建立服務主體時,輸出會包含您必須保護的認證。 或者,請考慮使用 受管理的身分認證 ,以避免使用認證。

根據預設,New-AzADServicePrincipal會指派參與者角色給訂閱範圍的服務主體。 若要降低服務主體遭到入侵的風險,請指派更特定的角色,並將範圍縮小到資源或資源群組。 請參閱 新增角色指派的步驟 以瞭解更多資訊。

建立服務主體

使用 New-AzADServicePrincipal Cmdlet 建立服務主體。 建立服務主體時,請選擇它使用的登錄驗證類型。

注意

如果您的帳戶沒有建立服務主體的許可權,會返回錯誤訊息,其中包含「許可權不足, New-AzADServicePrincipal 無法完成作業」。 請與您的系統管理員Azure Active Directory建立服務主體。

服務主體可以使用兩種驗證類型:密碼式驗證和憑證式驗證。

以密碼為基礎的驗證

重要

密碼型驗證服務主體的預設 角色是參與者。 此角色具有讀取和寫入 Azure 帳戶的完整許可權。 有關管理角色指派的資訊,請參閱 管理服務主體角色

在沒有任何其他驗證參數的情況下,會使用密碼型驗證,並針對您建立隨機密碼。 如果您想要以密碼為基礎的驗證,建議您使用此方法。

$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName

返回的物件包含 Secret 成員,這是一個 SecureString 包含產生密碼的成員。 請確定將此值儲存在安全的位置,以使用服務主體進行驗證。 其 值不會 顯示在主控台輸出中。 如果您失去密碼, 請重設服務主體認證

下列程式碼將允許您匯出密碼:

$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret)
$UnsecureSecret = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)

對於使用者提供的密碼,引數 -PasswordCredential 會採用 Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential 物件。 這些物件必須具有有效的 StartDate EndDate 和 ,並需要純文字 Password 。 建立密碼時,請確定您遵循Azure Active Directory規則與限制。 請勿使用弱密碼或重複使用密碼。

Import-Module -Name Az.Resources # Imports the PSADPasswordCredential object
$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential -Property @{StartDate=Get-Date; EndDate=Get-Date -Year 2024; Password=<Choose a strong password>}
$sp = New-AzAdServicePrincipal -DisplayName ServicePrincipalName -PasswordCredential $credentials

從 中返回的物件包含 和 成員,其中任何一個都可以用於使用服務主體 New-AzADServicePrincipal Id DisplayName 進行登錄。

重要

使用服務主體進行登錄時,需要建立服務主體的租使用者識別碼。 若要在建立服務主體時取得使用中租使用者,請于建立服務主體後立即 執行下列命令

(Get-AzContext).Tenant.Id

憑證式驗證

重要

建立憑證型驗證服務主體時,不會指派預設角色。 有關管理角色指派的資訊,請參閱 管理服務主體角色

使用憑證式驗證的服務主體會使用參數 -CertValue 建立。 此參數會採用公用憑證的 base64 編碼 ASCII 字串。 這由 PEM 檔案或文字編碼的 CRT 或 CER 表示。 不支援公用憑證的二進位編碼。 這些指示假設您已經有可用的憑證。

$cert = <public certificate as base64-encoded string>
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName -CertValue $cert

您也可以使用參數 -KeyCredential ,此參數會採用 PSADKeyCredential 物件。 這些物件必須有有效的 ,且成員必須設定為公用憑證的 StartDate EndDate CertValue base64 編碼 ASCII 字串。

$cert = <public certificate as base64-encoded string>
$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADKeyCredential -Property @{StartDate=Get-Date; EndDate=Get-Date -Year 2024; KeyId=New-Guid; CertValue=$cert}
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName -KeyCredential $credentials

從 中返回的物件包含 和 成員,其中任何一個都可以用於使用服務主體 New-AzADServicePrincipal Id DisplayName 進行登錄。 使用服務主體登錄的用戶端也需要存取憑證的私密金鑰。

重要

使用服務主體進行登錄時,需要建立服務主體的租使用者識別碼。 若要在建立服務主體時取得使用中租使用者,請于建立服務主體後立即 執行下列命令

(Get-AzContext).Tenant.Id

取得現有的服務主體

使用 Get-AzADServicePrincipal可以取得使用中租使用者的服務主體清單。 根據預設,此命令會返回 使用者中所有的服務主體。 對於大型組織,可能需要很長的時間來返回結果。 建議您改為使用任選的伺服器端篩選引數:

  • -DisplayNameBeginsWith要求具有符合提供值的首碼的服務主體。 服務主體的顯示名稱是建立期間所 -DisplayName 設定的值。
  • -DisplayName 要求與 服務主體 名稱完全相符。

管理服務主體角色

Azure PowerShell下列 Cmdlet 來管理角色指派:

密碼型驗證服務主體的預設 角色是參與者。 此角色具有讀取和寫入 Azure 帳戶的完整許可權。 讀取 角色的限制較嚴格,具有唯讀存取權。 有關 Access Control Role-Based RBAC (和角色) ,請參閱 RBAC:內建角色

此範例新增 了讀者 角色,並移除 了參與者 角色:

New-AzRoleAssignment -ApplicationId <service principal application ID> -RoleDefinitionName 'Reader'
Remove-AzRoleAssignment -ObjectId <service principal object ID> -RoleDefinitionName 'Contributor'

重要

角色指派 Cmdlet 不會使用服務主體物件識別碼。 他們會使用建立時產生的相關應用程式識別碼。 若要取得服務主體的應用程式識別碼,請使用 Get-AzADServicePrincipal

注意

如果您的帳戶沒有指派角色的許可權,則會看到錯誤訊息,指出您的帳戶「沒有執行動作的授權'Microsoft.授權/roleAssignments/write」。 請與您的Azure Active Directory管理員聯繫,以管理角色。

新增角色 不會限制 先前指派的許可權。 限制服務主體的許可權時,應該移除 參與者 角色。

您可以列出指派的角色來驗證變更:

Get-AzRoleAssignment -ServicePrincipalName ServicePrincipalName

使用服務主體來登錄

以登錄來測試新服務主體的認證和許可權。 若要使用服務主體進行登錄,您需要與它相關聯的值,以及它在下 applicationId 所建立之租使用者。

若要使用服務主體使用密碼進行登錄:

# Use the application ID as the username, and the secret as password
$credentials = Get-Credential
Connect-AzAccount -ServicePrincipal -Credential $credentials -Tenant <tenant ID>

憑證式驗證需要Azure PowerShell憑證指紋從本地憑證存放區中取回信息。

Connect-AzAccount -ServicePrincipal -Tenant <TenantId> -CertificateThumbprint <Thumbprint> -ApplicationId <ApplicationId>

有關將憑證導入到 PowerShell 易於訪問之認證存放區的指示,請參閱使用 Azure PowerShell

重設認證

如果您忘記服務主體的認證,請使用 New-AzADSpCredential 以隨機密碼新增認證。 重設密碼時,此 Cmdlet 不支援使用者定義的認證。

重要

在指派任何新認證之前,您可能會想要移除現有的認證,以防止使用這些認證進行登錄。 若要這麼做,請使用Remove-AzADSpCredential Cmdlet:

Remove-AzADSpCredential -DisplayName ServicePrincipalName
$newCredential = New-AzADSpCredential -ServicePrincipalName ServicePrincipalName

故障 排除

如果您收到錯誤 :「New-AzADServicePrincipal: 另一個屬性識別碼值相同的物件已存在」,請確認名稱相同的服務主體不存在。

Get-AzAdServicePrincipal -DisplayName ServicePrincipalName

如果不再需要現有的服務主體,您可以使用下列範例將其移除。

Remove-AzAdServicePrincipal -DisplayName ServicePrincipalName

當您先前為應用程式建立服務主體時,也可能會發生Azure Active Directory錯誤。 如果您移除服務主體,應用程式仍然可以使用。 此應用程式可防止您建立另一個名稱相同的服務主體。

您可以使用下列範例來確認Azure Active Directory同名的應用程式不存在:

Get-AzADApplication -DisplayName ServicePrincipalName

如果具有相同名稱的應用程式已存在且不再需要,可以使用下列範例將其移除。

Remove-AzADApplication -DisplayName ServicePrincipalName

否則,請選擇您嘗試建立的新服務主體的備用名稱。