共用方式為


使用 Azure PowerShell 建立 Azure 服務主體

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

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

本文說明如何使用 Azure PowerShell 來建立服務主體、取得服務主體資訊,以及重設服務主體的步驟。

謹慎

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

先決條件

  • 如果您選擇在本機使用 Azure PowerShell:
  • 如果您選擇使用 Azure Cloud Shell:
    • 如需詳細資訊,請參閱 azure Cloud Shell 概觀。

建立服務主體

使用 New-AzADServicePrincipal Cmdlet 建立服務主體。 建立服務主體時,您可以選擇所使用的登入驗證類型。

重要

從 Az PowerShell 模組 7.x 版開始,New-AzADServicePrincipal 預設不會再將 參與者 角色指派給服務主體。 若要將特定角色指派給服務主體,請參閱 新增角色指派的步驟

注意

如果您的帳戶沒有建立服務主體的許可權,New-AzADServicePrincipal 會傳回包含「許可權不足而無法完成作業」的錯誤訊息。 請連絡您的Microsoft Entra 系統管理員以建立服務主體。

在Microsoft Entra ID 目錄中,用戶設定 用戶可以註冊應用程式, 已設定為 [無],您必須是下列其中一個Microsoft Entra ID 內建角色的成員(其動作如下:microsoft.directory/applications/createAsOwnermicrosoft.directory/applications/create):

如需 Microsoft Entra ID 中使用者設定的詳細資訊,請參閱 限制誰可以在建立應用程式。

服務主體有兩種類型的驗證:密碼式驗證和憑證式驗證。

密碼型驗證

重要

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

如果沒有任何其他驗證參數,則會使用密碼型驗證,併為您建立隨機密碼。 如果您想要密碼型驗證,建議使用此方法。

$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName

傳回的物件包含包含所產生密碼的 PasswordCredentials.SecretText 屬性。 請務必將此值儲存在安全的地方,以向服務主體進行驗證。 其值 不會 顯示在主控台輸出中。 如果您遺失密碼,重設服務主體認證

下列程式代碼可讓您匯出秘密:

$sp.PasswordCredentials.SecretText

New-AzADServicePrincipal 傳回的物件包含 IdDisplayName 成員,任一個都可以用於服務主體登入。

重要

使用服務主體登入需要建立服務主體的租用戶標識碼。 若要在建立服務主體時取得作用中租戶,請在 建立服務主體之後立即執行下列命令

(Get-AzContext).Tenant.Id

憑證式驗證

重要

建立憑證式驗證服務主體時,沒有指派預設角色。 如需管理角色指派的資訊,請參閱 管理服務主體角色

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

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

New-AzADServicePrincipal 傳回的物件包含 IdDisplayName 屬性,其中任一屬性都可用於使用服務主體登入。 使用服務主體登入的用戶端也需要存取憑證的私鑰。

重要

使用服務主體登入需要服務主體所建立的租用戶 ID。 若要在建立服務主體時取得作用中租戶,請在 建立服務主體之後立即執行下列命令

(Get-AzContext).Tenant.Id

取得現有的服務主體

您可以使用 get-AzADServicePrincipal 來擷取作用中租使用者的服務主體清單。 根據預設,此命令會 傳回租使用者中所有 服務主體。 對於大型組織,可能需要很長的時間才能傳回結果。 建議改用其中一個選擇性伺服器端篩選自變數:

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

管理服務主體角色

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

如需 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.Authorization/roleAssignments/write'」。 請聯絡 Microsoft Entra 系統管理員,以便管理角色。

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

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

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 可存取之認證存放區的指示,請參閱 憑證式驗證

重設認證

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

重要

指派任何新認證之前,您可能想要移除現有的認證,以防止使用它們登入。 若要這樣做,請使用 Remove-AzADSpCredential Cmdlet:

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

故障排除

如果您收到錯誤:“New-AzADServicePrincipal: 屬性 identifierUris 具有相同值的另一個對象已經存在。”,請確認具有相同名稱的服務主體不存在。

Get-AzAdServicePrincipal -DisplayName ServicePrincipalName

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

Remove-AzAdServicePrincipal -DisplayName ServicePrincipalName

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

您可以使用下列範例來確認具有相同名稱的 Microsoft Entra 應用程式不存在:

Get-AzADApplication -DisplayName ServicePrincipalName

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

Remove-AzADApplication -DisplayName ServicePrincipalName

否則,請為嘗試建立的新服務主體選擇替代名稱。