使用 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
傳回的物件包含 Id
和 DisplayName
成員,任一個都可以用於服務主體登入。
這很重要
使用服務主體登入時需要建立服務主體的租戶ID。 要在建立服務主體時取得活動租戶,請在建立服務主體後立即運行以下命令:
(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
返回的物件包含 Id
和 DisplayName
屬性,這兩個屬性中的任何一個都可以用於服務主體的登入。 使用服務主體登入的用戶端也需要存取憑證的私鑰。
這很重要
使用服務主體登入時需要建立服務主體的租戶ID。 要在建立服務主體時取得活動租戶,請在建立服務主體後立即運行以下命令:
(Get-AzContext).Tenant.Id
取得現有的服務主體
可以使用 Get-AzADServicePrincipal 檢索活動租戶的服務主體清單。 預設情況下,此命令會返回租戶中的所有服務主體。 對於大型組織,可能需要很長的時間才能傳回結果。 建議使用其中一個可選的伺服器端篩選參數:
-
DisplayNameBeginsWith
要求具有符合所提供值的 前綴的服務主體。 服務主體的顯示名稱是在創建時使用DisplayName
設置的值。 -
DisplayName
要求取得服務主體名稱的精確匹配。
管理服務主體角色
Azure PowerShell 有以下指令可用來管理角色指派:
- Get-AzRoleAssignment
- New-AzRoleAssignment
- Remove-AzRoleAssignment 移除 Azure 角色指派
如需更多關於角色為基礎的存取控制(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 指令。
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
否則,請為嘗試建立的新服務主體選擇替代名稱。