使用 Azure 服務的自動化工具應該一律具有受限制的許可權。 有別於以完整權限使用者身分登入應用程式的作法,Azure 提供服務主體。
Azure 服務主體是建立的身分識別,可搭配應用程式、裝載服務和自動化工具使用,以存取 Azure 資源。 此存取權會受到指派給服務主體的角色限制,可讓您控制可以存取哪些資源,以及存取層級。 基於安全性理由,一律建議將服務主體與自動化工具搭配使用,而不是允許他們使用使用者身分識別登入。
本文說明使用 Azure PowerShell 建立、取得服務主體相關資訊及重設服務主體的步驟。
謹慎
當您使用 New-AzADServicePrincipal 命令建立服務主體時,輸出會包含您必須保護的認證。 或者,請考慮使用 受控識別 ,以避免使用認證。
先決條件
- 如果您選擇在本機使用 Azure PowerShell:
- 安裝 Az PowerShell 模組。
- 使用 Connect-AzAccount Cmdlet 連線到您的 Azure 帳戶。
- 如果您選擇使用 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/createAsOwner 或 microsoft.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 來管理角色指派:
如需 Role-Based 存取控制 (RBAC) 和角色的詳細資訊,請參閱 RBAC:內建角色。
下列範例會新增 [讀者 ] 角色,並移除 [參與者] 角色:
New-AzRoleAssignment -ApplicationId <service principal application ID> -RoleDefinitionName 'Reader'
Remove-AzRoleAssignment -ObjectId <service principal object ID> -RoleDefinitionName 'Contributor'
這很重要
角色指派 Cmdlet 不會採用服務主體物件識別碼。 它們會採用相關聯的應用程式 ID,該 ID 是在建立時產生的。 若要取得服務主體的應用程式識別碼,請使用 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
否則,請為您嘗試建立的新服務主體選擇替代名稱。