你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 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 成员,其中任一成员都可用于使用服务主体进行登录。

重要

使用服务主体进行登录需要使用在其下创建了服务主体的租户 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 返回的对象包含 IdDisplayName 属性,其中任一属性都可用于使用服务主体进行登录。 使用服务主体进行登录的客户端还需要对证书私钥具有访问权限。

重要

使用服务主体进行登录需要使用在其下创建了服务主体的租户 ID。 若要获取创建服务主体时的活动租户,请在创建服务主体后立即运行以下命令:

(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 不接受服务主体对象 ID。 它们接受在创建时生成的关联应用程序 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

否则,请为正在尝试创建的新的服务主体选择一个备用名称。