你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 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
成员,其中任一成员都可用于使用服务主体进行登录。
重要
使用服务主体进行登录需要使用在其下创建了服务主体的租户 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 具有用于管理角色分配的以下 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
否则,请为正在尝试创建的新的服务主体选择一个备用名称。