使用 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 来管理角色分配:
- Get-AzRoleAssignment
- New-AzRoleAssignment
- Remove-AzRoleAssignment(移除 Azure 角色分配)
有关 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。 若要获取服务主体的应用程序 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
否则,请选择尝试创建的新服务主体的备用名称。