使用 Azure PowerShell 來建立 Azure 服務主體
使用 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
成員,兩者都可用於使用服務主體登入。
重要
使用服務主體登入需要在其下建立服務主體的租用戶識別碼。 若要在建立服務主體時取得作用中的租用戶,請在建立服務主體之後立即執行下列命令:
(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
屬性,兩者都可用於使用服務主體登入。 使用服務主體登入的用戶端也需要存取憑證的私密金鑰。
重要
使用服務主體登入需要在其下建立服務主體的租用戶識別碼。 若要在建立服務主體時取得作用中的租用戶,請在建立服務主體之後立即執行下列命令:
(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
否則,請為您嘗試建立的新服務主體選擇替代名稱。