共用方式為


使用 Azure PowerShell 來建立 Azure 服務主體

使用 Azure 服務的自動化工具應一律具有權限限制。 有別於以完整權限使用者身分登入應用程式的作法,Azure 提供服務主體。

Azure 服務主體是一種身分識別,建立目的是為了搭配應用程式、託管服務及自動化工具來存取 Azure 資源。 此存取會受限於指派給服務主體的角色,以便您控制可存取的資源,以及在哪個層級上存取。 基於安全理由,我們建議您一律搭配自動化工具使用服務主體,而不是讓服務主體透過使用者身分識別來登入。

本文會示範搭配 Azure PowerShell 建立服務主體,以及擷取其資訊和重設服務主體的步驟。

警告

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

必要條件

建立服務主體

使用 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 屬性,兩者都可用於使用服務主體登入。 使用服務主體登入的用戶端也需要存取憑證的私密金鑰。

重要

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

(Get-AzContext).Tenant.Id

取得現有的服務主體

您可以使用 Get-AzADServicePrincipal 擷取作用中租用戶的服務主體清單。 依預設,此命令會傳回租用戶中的「所有」服務主體。 若為大型組織,可能需要很長的時間才會傳回結果。 建議使用選擇性伺服器端篩選引數的其中一個:

  • DisplayNameBeginsWith 會要求服務主體的前置詞符合所提供的值。 服務主體的顯示名稱是建立期間使用 DisplayName 所設定的值。
  • DisplayName 要求服務主體名稱完全相符

管理服務主體角色

Azure PowerShell 提供下列 Cmdlet 以供您管理角色指派:

如需角色型存取控制 (RBAC) 和角色的詳細資訊,請參閱RBAC:內建角色

下列範例會新增讀者角色,並移除參與者角色:

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

重要

角色指派 Cmdlet 不需要服務主體物件識別碼。 該 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

疑難排解

如果您收到錯誤:「已經存在另一個具有相同 identifierUris 屬性值的物件。」,請確認尚未有同名的服務主體存在。

Get-AzAdServicePrincipal -DisplayName ServicePrincipalName

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

Remove-AzAdServicePrincipal -DisplayName ServicePrincipalName

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

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

Get-AzADApplication -DisplayName ServicePrincipalName

如果有同名的應用程式存在,而且不再需要該應用程式,您可使用下列範例予以移除。

Remove-AzADApplication -DisplayName ServicePrincipalName

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